From 2ec4174a201052c4874aff023ceeddb35ac6c241 Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Wed, 28 Aug 2024 07:53:15 +0530 Subject: [PATCH 001/121] feat: email_auth template with body parsing --- .../circuits/src/email_auth_template.circom | 172 +++++++++++++++++- .../src/email_auth_with_body_parsing.circom | 5 + 2 files changed, 172 insertions(+), 5 deletions(-) create mode 100644 packages/circuits/src/email_auth_with_body_parsing.circom diff --git a/packages/circuits/src/email_auth_template.circom b/packages/circuits/src/email_auth_template.circom index 1e61deb8..ac2638fc 100644 --- a/packages/circuits/src/email_auth_template.circom +++ b/packages/circuits/src/email_auth_template.circom @@ -45,7 +45,7 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) var email_max_bytes = email_max_bytes_const(); var subject_field_len = compute_ints_size(max_subject_bytes); var domain_len = domain_len_const(); - var domain_filed_len = compute_ints_size(domain_len); + var domain_field_len = compute_ints_size(domain_len); var k2_chunked_size = k >> 1; if(k % 2 == 1) { k2_chunked_size += 1; @@ -54,7 +54,7 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) var code_len = invitation_code_len_const(); - signal output domain_name[domain_filed_len]; + signal output domain_name[domain_field_len]; signal output public_key_hash; signal output email_nullifier; signal output timestamp; @@ -63,12 +63,11 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) signal output is_code_exist; // Verify Email Signature - component email_verifier = EmailVerifier(max_header_bytes, 0, n, k, 1); + component email_verifier = EmailVerifier(max_header_bytes, 0, n, k, 1, 0, 0); email_verifier.emailHeader <== padded_header; email_verifier.pubkey <== public_key; email_verifier.signature <== signature; email_verifier.emailHeaderLength <== padded_header_len; - signal header_hash[256] <== email_verifier.sha; public_key_hash <== email_verifier.pubkeyHash; // FROM HEADER REGEX @@ -168,7 +167,7 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) cm_rand_input[k2_chunked_size] <== 1; signal cm_rand <== Poseidon(k2_chunked_size+1)(cm_rand_input); signal replaced_email_addr_regex_reveal[max_subject_bytes]; - for(var i=0; i 2048) +// * max_header_bytes - max number of bytes in the email header +// * max_body_bytes - max number of bytes in the email body +// * recipient_enabled - whether the email address commitment of the recipient = email address in the subject is exposed +template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, recipient_enabled) { + signal input padded_header[max_header_bytes]; // email data (only header part) + signal input padded_header_len; // length of in email data including the padding + signal input public_key[k]; // RSA public key (modulus), k parts of n bits each. + signal input signature[k]; // RSA signature, k parts of n bits each. + signal input body_hash_idx; // index of the bodyhash in the header + signal input precomputed_sha[32]; // precomputed sha256 of the email body + signal input padded_body[max_body_bytes]; // email data (only body part) + signal input padded_body_len; // length of in email data including the padding + signal input account_code; + signal input from_addr_idx; // Index of the from email address (= sender email address) in the email header + signal input domain_idx; // Index of the domain name in the from email address + signal input timestamp_idx; // Index of the timestamp in the header + signal input code_idx; // index of the invitation code in the header + + + var email_max_bytes = email_max_bytes_const(); + var body_field_len = compute_ints_size(max_body_bytes); + var domain_len = domain_len_const(); + var domain_field_len = compute_ints_size(domain_len); + var k2_chunked_size = k >> 1; + if(k % 2 == 1) { + k2_chunked_size += 1; + } + var timestamp_len = timestamp_len_const(); + var code_len = invitation_code_len_const(); + + + signal output domain_name[domain_field_len]; + signal output public_key_hash; + signal output email_nullifier; + signal output timestamp; + signal output masked_body[body_field_len]; + signal output account_salt; + signal output is_code_exist; + + // Verify Email Signature + component email_verifier = EmailVerifier(max_header_bytes, max_body_bytes, n, k, 0, 0, 0); + email_verifier.emailHeader <== padded_header; + email_verifier.emailHeaderLength <== padded_header_len; + email_verifier.pubkey <== public_key; + email_verifier.signature <== signature; + email_verifier.bodyHashIndex <== body_hash_idx; + email_verifier.precomputedSHA <== precomputed_sha; + email_verifier.emailBody <== padded_body; + email_verifier.emailBodyLength <== padded_body_len; + public_key_hash <== email_verifier.pubkeyHash; + + // FROM HEADER REGEX + signal from_regex_out, from_regex_reveal[max_header_bytes]; + (from_regex_out, from_regex_reveal) <== FromAddrRegex(max_header_bytes)(padded_header); + from_regex_out === 1; + signal from_email_addr[email_max_bytes]; + from_email_addr <== SelectRegexReveal(max_header_bytes, email_max_bytes)(from_regex_reveal, from_addr_idx); + + // DOMAIN NAME HEADER REGEX + signal domain_regex_out, domain_regex_reveal[email_max_bytes]; + (domain_regex_out, domain_regex_reveal) <== EmailDomainRegex(email_max_bytes)(from_email_addr); + domain_regex_out === 1; + signal domain_name_bytes[domain_len]; + domain_name_bytes <== SelectRegexReveal(email_max_bytes, domain_len)(domain_regex_reveal, domain_idx); + domain_name <== Bytes2Ints(domain_len)(domain_name_bytes); + + signal sign_hash; + signal sign_ints[k2_chunked_size]; + (sign_hash, sign_ints) <== HashSign(n,k)(signature); + email_nullifier <== EmailNullifier()(sign_hash); + + // Timestamp regex + convert to decimal format + signal timestamp_regex_out, timestamp_regex_reveal[max_header_bytes]; + (timestamp_regex_out, timestamp_regex_reveal) <== TimestampRegex(max_header_bytes)(padded_header); + signal timestamp_str[timestamp_len]; + timestamp_str <== SelectRegexReveal(max_header_bytes, timestamp_len)(timestamp_regex_reveal, timestamp_idx); + signal raw_timestamp <== Digit2Int(timestamp_len)(timestamp_str); + timestamp <== timestamp_regex_out * raw_timestamp; + + signal prefixed_code_regex_out, prefixed_code_regex_reveal[max_body_bytes]; + (prefixed_code_regex_out, prefixed_code_regex_reveal) <== InvitationCodeWithPrefixRegex(max_body_bytes)(padded_body); + is_code_exist <== IsZero()(prefixed_code_regex_out-1); + signal removed_code[max_body_bytes]; + for(var i = 0; i < max_body_bytes; i++) { + removed_code[i] <== is_code_exist * prefixed_code_regex_reveal[i]; + } + signal body_email_addr_regex_out, body_email_addr_regex_reveal[max_body_bytes]; + (body_email_addr_regex_out, body_email_addr_regex_reveal) <== EmailAddrRegex(max_body_bytes)(padded_body); + signal is_body_email_addr_exist <== IsZero()(body_email_addr_regex_out-1); + signal removed_body_email_addr[max_body_bytes]; + for(var i = 0; i < max_body_bytes; i++) { + removed_body_email_addr[i] <== is_body_email_addr_exist * body_email_addr_regex_reveal[i]; + } + signal masked_body_bytes[max_body_bytes]; + for(var i = 0; i < max_body_bytes; i++) { + masked_body_bytes[i] <== padded_body[i] - removed_code[i] - removed_body_email_addr[i]; + } + masked_body <== Bytes2Ints(max_body_bytes)(masked_body_bytes); + + // INVITATION CODE REGEX + signal code_regex_out, code_regex_reveal[max_header_bytes]; + (code_regex_out, code_regex_reveal) <== InvitationCodeRegex(max_header_bytes)(padded_header); + signal code_consistency <== IsZero()(is_code_exist * (1 - code_regex_out)); + code_consistency === 1; + signal replaced_code_regex_reveal[max_header_bytes]; + for(var i=0; i Date: Thu, 29 Aug 2024 10:53:34 +0530 Subject: [PATCH 002/121] chore: bump zkemail-circuits to 6.1.5 --- packages/circuits/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/circuits/package.json b/packages/circuits/package.json index 6cb8ec4a..95e5287f 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -10,7 +10,7 @@ "test": "NODE_OPTIONS=--max_old_space_size=8192 jest" }, "dependencies": { - "@zk-email/circuits": "^6.1.1", + "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", "@zk-email/relayer-utils": "^0.2.4", "commander": "^11.0.0", From 253a02ce548c988add05670bd37ada4406669083 Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Fri, 30 Aug 2024 07:25:51 +0530 Subject: [PATCH 003/121] feat: extracting command from body in body-parsing --- .../circuits/src/email_auth_template.circom | 56 +++++++++++-------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/packages/circuits/src/email_auth_template.circom b/packages/circuits/src/email_auth_template.circom index ac2638fc..d9210409 100644 --- a/packages/circuits/src/email_auth_template.circom +++ b/packages/circuits/src/email_auth_template.circom @@ -5,6 +5,7 @@ include "circomlib/circuits/comparators.circom"; include "circomlib/circuits/poseidon.circom"; include "@zk-email/circuits/email-verifier.circom"; include "@zk-email/circuits/utils/regex.circom"; +include "@zk-email/circuits/utils/array.circom"; include "./utils/constants.circom"; include "./utils/account_salt.circom"; include "./utils/hash_sign.circom"; @@ -194,7 +195,7 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) // * max_header_bytes - max number of bytes in the email header // * max_body_bytes - max number of bytes in the email body // * recipient_enabled - whether the email address commitment of the recipient = email address in the subject is exposed -template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, recipient_enabled) { +template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_command_bytes, recipient_enabled) { signal input padded_header[max_header_bytes]; // email data (only header part) signal input padded_header_len; // length of in email data including the padding signal input public_key[k]; // RSA public key (modulus), k parts of n bits each. @@ -208,10 +209,12 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, recipi signal input domain_idx; // Index of the domain name in the from email address signal input timestamp_idx; // Index of the timestamp in the header signal input code_idx; // index of the invitation code in the header + signal input command_idx; // index of the command in the body + signal input command_len; // length of the command var email_max_bytes = email_max_bytes_const(); - var body_field_len = compute_ints_size(max_body_bytes); + var command_field_len = compute_ints_size(max_command_bytes); var domain_len = domain_len_const(); var domain_field_len = compute_ints_size(domain_len); var k2_chunked_size = k >> 1; @@ -226,7 +229,7 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, recipi signal output public_key_hash; signal output email_nullifier; signal output timestamp; - signal output masked_body[body_field_len]; + signal output masked_command[command_field_len]; signal output account_salt; signal output is_code_exist; @@ -269,26 +272,31 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, recipi timestamp_str <== SelectRegexReveal(max_header_bytes, timestamp_len)(timestamp_regex_reveal, timestamp_idx); signal raw_timestamp <== Digit2Int(timestamp_len)(timestamp_str); timestamp <== timestamp_regex_out * raw_timestamp; + + // Extract the command from the body + signal command_reveal[max_command_bytes]; + component select_command_sub_array = SelectSubArray(max_body_bytes, max_command_bytes)(padded_body, command_idx, command_len); + command_reveal <== select_command_sub_array.out; - signal prefixed_code_regex_out, prefixed_code_regex_reveal[max_body_bytes]; - (prefixed_code_regex_out, prefixed_code_regex_reveal) <== InvitationCodeWithPrefixRegex(max_body_bytes)(padded_body); + signal prefixed_code_regex_out, prefixed_code_regex_reveal[max_command_bytes]; + (prefixed_code_regex_out, prefixed_code_regex_reveal) <== InvitationCodeWithPrefixRegex(max_command_bytes)(command_reveal); is_code_exist <== IsZero()(prefixed_code_regex_out-1); - signal removed_code[max_body_bytes]; - for(var i = 0; i < max_body_bytes; i++) { + signal removed_code[max_command_bytes]; + for(var i = 0; i < max_command_bytes; i++) { removed_code[i] <== is_code_exist * prefixed_code_regex_reveal[i]; } - signal body_email_addr_regex_out, body_email_addr_regex_reveal[max_body_bytes]; - (body_email_addr_regex_out, body_email_addr_regex_reveal) <== EmailAddrRegex(max_body_bytes)(padded_body); - signal is_body_email_addr_exist <== IsZero()(body_email_addr_regex_out-1); - signal removed_body_email_addr[max_body_bytes]; - for(var i = 0; i < max_body_bytes; i++) { - removed_body_email_addr[i] <== is_body_email_addr_exist * body_email_addr_regex_reveal[i]; + signal command_email_addr_regex_out, command_email_addr_regex_reveal[max_command_bytes]; + (command_email_addr_regex_out, command_email_addr_regex_reveal) <== EmailAddrRegex(max_command_bytes)(command_reveal); + signal is_command_email_addr_exist <== IsZero()(command_email_addr_regex_out-1); + signal removed_command_email_addr[max_command_bytes]; + for(var i = 0; i < max_command_bytes; i++) { + removed_command_email_addr[i] <== is_command_email_addr_exist * command_email_addr_regex_reveal[i]; } - signal masked_body_bytes[max_body_bytes]; - for(var i = 0; i < max_body_bytes; i++) { - masked_body_bytes[i] <== padded_body[i] - removed_code[i] - removed_body_email_addr[i]; + signal masked_command_bytes[max_command_bytes]; + for(var i = 0; i < max_command_bytes; i++) { + masked_command_bytes[i] <== command_reveal[i] - removed_code[i] - removed_command_email_addr[i]; } - masked_body <== Bytes2Ints(max_body_bytes)(masked_body_bytes); + masked_command <== Bytes2Ints(max_command_bytes)(masked_command_bytes); // INVITATION CODE REGEX signal code_regex_out, code_regex_reveal[max_header_bytes]; @@ -317,10 +325,10 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, recipi account_salt <== AccountSalt(num_email_addr_ints)(from_addr_ints, account_code); if(recipient_enabled==1) { - signal input body_email_addr_idx; + signal input command_email_addr_idx; signal output has_email_recipient; signal output recipient_email_addr_commit; - has_email_recipient <== is_body_email_addr_exist; + has_email_recipient <== is_command_email_addr_exist; // Email address commitment signal cm_rand_input[k2_chunked_size+1]; @@ -329,16 +337,16 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, recipi } cm_rand_input[k2_chunked_size] <== 1; signal cm_rand <== Poseidon(k2_chunked_size+1)(cm_rand_input); - signal replaced_email_addr_regex_reveal[max_body_bytes]; - for(var i=0; i < max_body_bytes; i++) { + signal replaced_email_addr_regex_reveal[max_command_bytes]; + for(var i=0; i < max_command_bytes; i++) { if(i==0) { - replaced_email_addr_regex_reveal[i] <== (body_email_addr_regex_reveal[i] - 1) * has_email_recipient + 1; + replaced_email_addr_regex_reveal[i] <== (command_email_addr_regex_reveal[i] - 1) * has_email_recipient + 1; } else { - replaced_email_addr_regex_reveal[i] <== body_email_addr_regex_reveal[i] * has_email_recipient; + replaced_email_addr_regex_reveal[i] <== command_email_addr_regex_reveal[i] * has_email_recipient; } } signal shifted_email_addr[email_max_bytes]; - shifted_email_addr <== SelectRegexReveal(max_body_bytes, email_max_bytes)(replaced_email_addr_regex_reveal, body_email_addr_idx); + shifted_email_addr <== SelectRegexReveal(max_command_bytes, email_max_bytes)(replaced_email_addr_regex_reveal, command_email_addr_idx); signal recipient_email_addr[email_max_bytes]; for(var i=0; i < email_max_bytes; i++) { recipient_email_addr[i] <== shifted_email_addr[i] * has_email_recipient; From 89f39f7595591f5924d882f8b2db2e4d18d5c6fe Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Sun, 1 Sep 2024 20:56:17 +0530 Subject: [PATCH 004/121] feat: email_auth body parsing circuit working with tests --- packages/circuits/helpers/email_auth.ts | 48 +- packages/circuits/package.json | 2 +- .../circuits/src/email_auth_template.circom | 49 +- .../src/email_auth_with_body_parsing.circom | 2 +- ..._with_body_parsing_with_qp_encoding.circom | 5 + packages/circuits/src/regexes/command.json | 16 + .../circuits/src/regexes/command_regex.circom | 648 +++++ packages/circuits/tests/email_auth.test.ts | 1144 ++++++--- .../email_auth_with_body_parsing_test1.eml | 99 + .../email_auth_with_body_parsing_test2.eml | 99 + .../email_auth_with_body_parsing_test3.eml | 99 + .../email_auth_with_body_parsing_test4.eml | 100 + .../email_auth_with_body_parsing_test5.eml | 101 + .../email_auth_with_body_parsing_test6.eml | 99 + yarn.lock | 2220 ++++++++--------- 15 files changed, 3258 insertions(+), 1473 deletions(-) create mode 100644 packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom create mode 100644 packages/circuits/src/regexes/command.json create mode 100644 packages/circuits/src/regexes/command_regex.circom create mode 100644 packages/circuits/tests/emails/email_auth_with_body_parsing_test1.eml create mode 100644 packages/circuits/tests/emails/email_auth_with_body_parsing_test2.eml create mode 100644 packages/circuits/tests/emails/email_auth_with_body_parsing_test3.eml create mode 100644 packages/circuits/tests/emails/email_auth_with_body_parsing_test4.eml create mode 100644 packages/circuits/tests/emails/email_auth_with_body_parsing_test5.eml create mode 100644 packages/circuits/tests/emails/email_auth_with_body_parsing_test6.eml diff --git a/packages/circuits/helpers/email_auth.ts b/packages/circuits/helpers/email_auth.ts index 55db6762..4103af76 100644 --- a/packages/circuits/helpers/email_auth.ts +++ b/packages/circuits/helpers/email_auth.ts @@ -2,22 +2,38 @@ import fs from "fs"; import { promisify } from "util"; const relayerUtils = require("@zk-email/relayer-utils"); -export async function genEmailAuthInput( - emailFilePath: string, - accountCode: string +export async function genEmailCircuitInput( + emailFilePath: string, + accountCode: string, + options?: { + shaPrecomputeSelector?: string; + maxHeaderLength?: number; + maxBodyLength?: number; + ignoreBodyHashCheck?: boolean; + } ): Promise<{ - padded_header: string[]; - public_key: string[]; - signature: string[]; - padded_header_len: string; - account_code: string; - from_addr_idx: number; - subject_idx: number; - domain_idx: number; - timestamp_idx: number; - code_idx: number; + padded_header: string[]; + public_key: string[]; + signature: string[]; + padded_header_len: string; + account_code: string; + from_addr_idx: number; + subject_idx: number; + domain_idx: number; + timestamp_idx: number; + code_idx: number; + body_hash_idx: number; + precomputed_sha: string[]; + padded_body: string[]; + padded_body_len: string; + command_idx: number; + padded_cleaned_body: string[]; }> { - const emailRaw = await promisify(fs.readFile)(emailFilePath, "utf8"); - const jsonStr = await relayerUtils.genEmailAuthInput(emailRaw, accountCode); - return JSON.parse(jsonStr); + const emailRaw = await promisify(fs.readFile)(emailFilePath, "utf8"); + const jsonStr = await relayerUtils.genEmailCircuitInput( + emailRaw, + accountCode, + options + ); + return JSON.parse(jsonStr); } diff --git a/packages/circuits/package.json b/packages/circuits/package.json index 95e5287f..ec86aef4 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -12,7 +12,7 @@ "dependencies": { "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.2.4", + "@zk-email/relayer-utils": "^0.2.8", "commander": "^11.0.0", "snarkjs": "^0.7.0" }, diff --git a/packages/circuits/src/email_auth_template.circom b/packages/circuits/src/email_auth_template.circom index d9210409..547e30df 100644 --- a/packages/circuits/src/email_auth_template.circom +++ b/packages/circuits/src/email_auth_template.circom @@ -16,6 +16,7 @@ include "./utils/hex2int.circom"; include "./utils/email_addr_commit.circom"; include "./regexes/invitation_code_with_prefix_regex.circom"; include "./regexes/invitation_code_regex.circom"; +include "./regexes/command_regex.circom"; include "@zk-email/zk-regex-circom/circuits/common/from_addr_regex.circom"; include "@zk-email/zk-regex-circom/circuits/common/email_addr_regex.circom"; include "@zk-email/zk-regex-circom/circuits/common/email_domain_regex.circom"; @@ -34,7 +35,6 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) signal input public_key[k]; // RSA public key (modulus), k parts of n bits each. signal input signature[k]; // RSA signature, k parts of n bits each. signal input padded_header_len; // length of in email data including the padding - // signal input sender_relayer_rand; // Private randomness of the relayer signal input account_code; signal input from_addr_idx; // Index of the from email address (= sender email address) in the email header signal input subject_idx; // Index of the subject in the header @@ -194,8 +194,10 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) // * k - the number of chunks in the RSA public key (n * k > 2048) // * max_header_bytes - max number of bytes in the email header // * max_body_bytes - max number of bytes in the email body +// * max_command_bytes - max number of bytes in the command // * recipient_enabled - whether the email address commitment of the recipient = email address in the subject is exposed -template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_command_bytes, recipient_enabled) { +// * is_qp_encoded - whether the email body is qp encoded +template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_command_bytes, recipient_enabled, is_qp_encoded) { signal input padded_header[max_header_bytes]; // email data (only header part) signal input padded_header_len; // length of in email data including the padding signal input public_key[k]; // RSA public key (modulus), k parts of n bits each. @@ -210,8 +212,9 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co signal input timestamp_idx; // Index of the timestamp in the header signal input code_idx; // index of the invitation code in the header signal input command_idx; // index of the command in the body - signal input command_len; // length of the command - + /// Note: padded_cleaned_body is only used for qp encoded email body, + /// for non-qp encoded email body, it should be equal to padded_body + signal input padded_cleaned_body[max_body_bytes]; // cleaned email body var email_max_bytes = email_max_bytes_const(); var command_field_len = compute_ints_size(max_command_bytes); @@ -224,7 +227,6 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co var timestamp_len = timestamp_len_const(); var code_len = invitation_code_len_const(); - signal output domain_name[domain_field_len]; signal output public_key_hash; signal output email_nullifier; @@ -234,7 +236,7 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co signal output is_code_exist; // Verify Email Signature - component email_verifier = EmailVerifier(max_header_bytes, max_body_bytes, n, k, 0, 0, 0); + component email_verifier = EmailVerifier(max_header_bytes, max_body_bytes, n, k, 0, is_qp_encoded, 0); email_verifier.emailHeader <== padded_header; email_verifier.emailHeaderLength <== padded_header_len; email_verifier.pubkey <== public_key; @@ -243,6 +245,9 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co email_verifier.precomputedSHA <== precomputed_sha; email_verifier.emailBody <== padded_body; email_verifier.emailBodyLength <== padded_body_len; + if (is_qp_encoded == 1) { + email_verifier.decodedEmailBodyIn <== padded_cleaned_body; + } public_key_hash <== email_verifier.pubkeyHash; // FROM HEADER REGEX @@ -274,19 +279,25 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co timestamp <== timestamp_regex_out * raw_timestamp; // Extract the command from the body - signal command_reveal[max_command_bytes]; - component select_command_sub_array = SelectSubArray(max_body_bytes, max_command_bytes)(padded_body, command_idx, command_len); - command_reveal <== select_command_sub_array.out; + signal command_regex_out, command_regex_reveal[max_body_bytes]; + if (is_qp_encoded != 1) { + (command_regex_out, command_regex_reveal) <== CommandRegex(max_body_bytes)(padded_body); + } else { + (command_regex_out, command_regex_reveal) <== CommandRegex(max_body_bytes)(padded_cleaned_body); + } + command_regex_out === 1; + signal command_all[max_command_bytes]; + command_all <== SelectRegexReveal(max_body_bytes, max_command_bytes)(command_regex_reveal, command_idx); signal prefixed_code_regex_out, prefixed_code_regex_reveal[max_command_bytes]; - (prefixed_code_regex_out, prefixed_code_regex_reveal) <== InvitationCodeWithPrefixRegex(max_command_bytes)(command_reveal); + (prefixed_code_regex_out, prefixed_code_regex_reveal) <== InvitationCodeWithPrefixRegex(max_command_bytes)(command_all); is_code_exist <== IsZero()(prefixed_code_regex_out-1); signal removed_code[max_command_bytes]; for(var i = 0; i < max_command_bytes; i++) { removed_code[i] <== is_code_exist * prefixed_code_regex_reveal[i]; } signal command_email_addr_regex_out, command_email_addr_regex_reveal[max_command_bytes]; - (command_email_addr_regex_out, command_email_addr_regex_reveal) <== EmailAddrRegex(max_command_bytes)(command_reveal); + (command_email_addr_regex_out, command_email_addr_regex_reveal) <== EmailAddrRegex(max_command_bytes)(command_all); signal is_command_email_addr_exist <== IsZero()(command_email_addr_regex_out-1); signal removed_command_email_addr[max_command_bytes]; for(var i = 0; i < max_command_bytes; i++) { @@ -294,24 +305,28 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co } signal masked_command_bytes[max_command_bytes]; for(var i = 0; i < max_command_bytes; i++) { - masked_command_bytes[i] <== command_reveal[i] - removed_code[i] - removed_command_email_addr[i]; + masked_command_bytes[i] <== command_all[i] - removed_code[i] - removed_command_email_addr[i]; } masked_command <== Bytes2Ints(max_command_bytes)(masked_command_bytes); // INVITATION CODE REGEX - signal code_regex_out, code_regex_reveal[max_header_bytes]; - (code_regex_out, code_regex_reveal) <== InvitationCodeRegex(max_header_bytes)(padded_header); + signal code_regex_out, code_regex_reveal[max_body_bytes]; + if (is_qp_encoded != 1) { + (code_regex_out, code_regex_reveal) <== InvitationCodeRegex(max_body_bytes)(padded_body); + } else { + (code_regex_out, code_regex_reveal) <== InvitationCodeRegex(max_body_bytes)(padded_cleaned_body); + } signal code_consistency <== IsZero()(is_code_exist * (1 - code_regex_out)); code_consistency === 1; - signal replaced_code_regex_reveal[max_header_bytes]; - for(var i=0; i" + }, + { + "is_public": true, + "regex_def": "[^<>/]+" + }, + { + "is_public": false, + "regex_def": "" + } + ] +} diff --git a/packages/circuits/src/regexes/command_regex.circom b/packages/circuits/src/regexes/command_regex.circom new file mode 100644 index 00000000..29ce4489 --- /dev/null +++ b/packages/circuits/src/regexes/command_regex.circom @@ -0,0 +1,648 @@ +pragma circom 2.1.5; + +include "@zk-email/zk-regex-circom/circuits/regex_helpers.circom"; + +// regex:
[^<>/]+
+template CommandRegex(msg_bytes) { + signal input msg[msg_bytes]; + signal output out; + + var num_bytes = msg_bytes+1; + signal in[num_bytes]; + in[0]<==255; + for (var i = 0; i < msg_bytes; i++) { + in[i+1] <== msg[i]; + } + + component eq[66][num_bytes]; + component lt[14][num_bytes]; + component and[57][num_bytes]; + component multi_or[12][num_bytes]; + signal states[num_bytes+1][36]; + signal states_tmp[num_bytes+1][36]; + signal from_zero_enabled[num_bytes+1]; + from_zero_enabled[num_bytes] <== 0; + component state_changed[num_bytes]; + + for (var i = 1; i < 36; i++) { + states[0][i] <== 0; + } + + for (var i = 0; i < num_bytes; i++) { + state_changed[i] = MultiOR(35); + states[i][0] <== 1; + eq[0][i] = IsEqual(); + eq[0][i].in[0] <== in[i]; + eq[0][i].in[1] <== 60; + and[0][i] = AND(); + and[0][i].a <== states[i][0]; + and[0][i].b <== eq[0][i].out; + states_tmp[i+1][1] <== 0; + eq[1][i] = IsEqual(); + eq[1][i].in[0] <== in[i]; + eq[1][i].in[1] <== 100; + and[1][i] = AND(); + and[1][i].a <== states[i][1]; + and[1][i].b <== eq[1][i].out; + states[i+1][2] <== and[1][i].out; + eq[2][i] = IsEqual(); + eq[2][i].in[0] <== in[i]; + eq[2][i].in[1] <== 105; + and[2][i] = AND(); + and[2][i].a <== states[i][2]; + and[2][i].b <== eq[2][i].out; + states[i+1][3] <== and[2][i].out; + eq[3][i] = IsEqual(); + eq[3][i].in[0] <== in[i]; + eq[3][i].in[1] <== 118; + and[3][i] = AND(); + and[3][i].a <== states[i][3]; + and[3][i].b <== eq[3][i].out; + states[i+1][4] <== and[3][i].out; + eq[4][i] = IsEqual(); + eq[4][i].in[0] <== in[i]; + eq[4][i].in[1] <== 32; + and[4][i] = AND(); + and[4][i].a <== states[i][4]; + and[4][i].b <== eq[4][i].out; + states[i+1][5] <== and[4][i].out; + and[5][i] = AND(); + and[5][i].a <== states[i][5]; + and[5][i].b <== eq[1][i].out; + states[i+1][6] <== and[5][i].out; + and[6][i] = AND(); + and[6][i].a <== states[i][6]; + and[6][i].b <== eq[2][i].out; + states[i+1][7] <== and[6][i].out; + eq[5][i] = IsEqual(); + eq[5][i].in[0] <== in[i]; + eq[5][i].in[1] <== 114; + and[7][i] = AND(); + and[7][i].a <== states[i][7]; + and[7][i].b <== eq[5][i].out; + states[i+1][8] <== and[7][i].out; + eq[6][i] = IsEqual(); + eq[6][i].in[0] <== in[i]; + eq[6][i].in[1] <== 61; + and[8][i] = AND(); + and[8][i].a <== states[i][8]; + and[8][i].b <== eq[6][i].out; + states[i+1][9] <== and[8][i].out; + eq[7][i] = IsEqual(); + eq[7][i].in[0] <== in[i]; + eq[7][i].in[1] <== 51; + and[9][i] = AND(); + and[9][i].a <== states[i][9]; + and[9][i].b <== eq[7][i].out; + states[i+1][10] <== and[9][i].out; + eq[8][i] = IsEqual(); + eq[8][i].in[0] <== in[i]; + eq[8][i].in[1] <== 68; + and[10][i] = AND(); + and[10][i].a <== states[i][10]; + and[10][i].b <== eq[8][i].out; + states[i+1][11] <== and[10][i].out; + eq[9][i] = IsEqual(); + eq[9][i].in[0] <== in[i]; + eq[9][i].in[1] <== 34; + and[11][i] = AND(); + and[11][i].a <== states[i][11]; + and[11][i].b <== eq[9][i].out; + states[i+1][12] <== and[11][i].out; + eq[10][i] = IsEqual(); + eq[10][i].in[0] <== in[i]; + eq[10][i].in[1] <== 122; + and[12][i] = AND(); + and[12][i].a <== states[i][12]; + and[12][i].b <== eq[10][i].out; + states[i+1][13] <== and[12][i].out; + eq[11][i] = IsEqual(); + eq[11][i].in[0] <== in[i]; + eq[11][i].in[1] <== 107; + and[13][i] = AND(); + and[13][i].a <== states[i][13]; + and[13][i].b <== eq[11][i].out; + states[i+1][14] <== and[13][i].out; + eq[12][i] = IsEqual(); + eq[12][i].in[0] <== in[i]; + eq[12][i].in[1] <== 101; + and[14][i] = AND(); + and[14][i].a <== states[i][14]; + and[14][i].b <== eq[12][i].out; + states[i+1][15] <== and[14][i].out; + eq[13][i] = IsEqual(); + eq[13][i].in[0] <== in[i]; + eq[13][i].in[1] <== 109; + and[15][i] = AND(); + and[15][i].a <== states[i][15]; + and[15][i].b <== eq[13][i].out; + states[i+1][16] <== and[15][i].out; + eq[14][i] = IsEqual(); + eq[14][i].in[0] <== in[i]; + eq[14][i].in[1] <== 97; + and[16][i] = AND(); + and[16][i].a <== states[i][16]; + and[16][i].b <== eq[14][i].out; + states[i+1][17] <== and[16][i].out; + and[17][i] = AND(); + and[17][i].a <== states[i][17]; + and[17][i].b <== eq[2][i].out; + states[i+1][18] <== and[17][i].out; + eq[15][i] = IsEqual(); + eq[15][i].in[0] <== in[i]; + eq[15][i].in[1] <== 108; + and[18][i] = AND(); + and[18][i].a <== states[i][18]; + and[18][i].b <== eq[15][i].out; + states[i+1][19] <== and[18][i].out; + and[19][i] = AND(); + and[19][i].a <== states[i][19]; + and[19][i].b <== eq[9][i].out; + states[i+1][20] <== and[19][i].out; + eq[16][i] = IsEqual(); + eq[16][i].in[0] <== in[i]; + eq[16][i].in[1] <== 62; + and[20][i] = AND(); + and[20][i].a <== states[i][20]; + and[20][i].b <== eq[16][i].out; + states[i+1][21] <== and[20][i].out; + lt[0][i] = LessEqThan(8); + lt[0][i].in[0] <== 1; + lt[0][i].in[1] <== in[i]; + lt[1][i] = LessEqThan(8); + lt[1][i].in[0] <== in[i]; + lt[1][i].in[1] <== 46; + and[21][i] = AND(); + and[21][i].a <== lt[0][i].out; + and[21][i].b <== lt[1][i].out; + lt[2][i] = LessEqThan(8); + lt[2][i].in[0] <== 63; + lt[2][i].in[1] <== in[i]; + lt[3][i] = LessEqThan(8); + lt[3][i].in[0] <== in[i]; + lt[3][i].in[1] <== 127; + and[22][i] = AND(); + and[22][i].a <== lt[2][i].out; + and[22][i].b <== lt[3][i].out; + eq[17][i] = IsEqual(); + eq[17][i].in[0] <== in[i]; + eq[17][i].in[1] <== 48; + eq[18][i] = IsEqual(); + eq[18][i].in[0] <== in[i]; + eq[18][i].in[1] <== 49; + eq[19][i] = IsEqual(); + eq[19][i].in[0] <== in[i]; + eq[19][i].in[1] <== 50; + eq[20][i] = IsEqual(); + eq[20][i].in[0] <== in[i]; + eq[20][i].in[1] <== 52; + eq[21][i] = IsEqual(); + eq[21][i].in[0] <== in[i]; + eq[21][i].in[1] <== 53; + eq[22][i] = IsEqual(); + eq[22][i].in[0] <== in[i]; + eq[22][i].in[1] <== 54; + eq[23][i] = IsEqual(); + eq[23][i].in[0] <== in[i]; + eq[23][i].in[1] <== 55; + eq[24][i] = IsEqual(); + eq[24][i].in[0] <== in[i]; + eq[24][i].in[1] <== 56; + eq[25][i] = IsEqual(); + eq[25][i].in[0] <== in[i]; + eq[25][i].in[1] <== 57; + eq[26][i] = IsEqual(); + eq[26][i].in[0] <== in[i]; + eq[26][i].in[1] <== 58; + eq[27][i] = IsEqual(); + eq[27][i].in[0] <== in[i]; + eq[27][i].in[1] <== 59; + and[23][i] = AND(); + and[23][i].a <== states[i][21]; + multi_or[0][i] = MultiOR(15); + multi_or[0][i].in[0] <== and[21][i].out; + multi_or[0][i].in[1] <== and[22][i].out; + multi_or[0][i].in[2] <== eq[17][i].out; + multi_or[0][i].in[3] <== eq[18][i].out; + multi_or[0][i].in[4] <== eq[19][i].out; + multi_or[0][i].in[5] <== eq[7][i].out; + multi_or[0][i].in[6] <== eq[20][i].out; + multi_or[0][i].in[7] <== eq[21][i].out; + multi_or[0][i].in[8] <== eq[22][i].out; + multi_or[0][i].in[9] <== eq[23][i].out; + multi_or[0][i].in[10] <== eq[24][i].out; + multi_or[0][i].in[11] <== eq[25][i].out; + multi_or[0][i].in[12] <== eq[26][i].out; + multi_or[0][i].in[13] <== eq[27][i].out; + multi_or[0][i].in[14] <== eq[6][i].out; + and[23][i].b <== multi_or[0][i].out; + and[24][i] = AND(); + and[24][i].a <== states[i][22]; + and[24][i].b <== multi_or[0][i].out; + lt[4][i] = LessEqThan(8); + lt[4][i].in[0] <== 128; + lt[4][i].in[1] <== in[i]; + lt[5][i] = LessEqThan(8); + lt[5][i].in[0] <== in[i]; + lt[5][i].in[1] <== 191; + and[25][i] = AND(); + and[25][i].a <== lt[4][i].out; + and[25][i].b <== lt[5][i].out; + and[26][i] = AND(); + and[26][i].a <== states[i][23]; + and[26][i].b <== and[25][i].out; + multi_or[1][i] = MultiOR(3); + multi_or[1][i].in[0] <== and[23][i].out; + multi_or[1][i].in[1] <== and[24][i].out; + multi_or[1][i].in[2] <== and[26][i].out; + states[i+1][22] <== multi_or[1][i].out; + lt[6][i] = LessEqThan(8); + lt[6][i].in[0] <== 194; + lt[6][i].in[1] <== in[i]; + lt[7][i] = LessEqThan(8); + lt[7][i].in[0] <== in[i]; + lt[7][i].in[1] <== 223; + and[27][i] = AND(); + and[27][i].a <== lt[6][i].out; + and[27][i].b <== lt[7][i].out; + and[28][i] = AND(); + and[28][i].a <== states[i][21]; + and[28][i].b <== and[27][i].out; + and[29][i] = AND(); + and[29][i].a <== states[i][22]; + and[29][i].b <== and[27][i].out; + lt[8][i] = LessEqThan(8); + lt[8][i].in[0] <== 160; + lt[8][i].in[1] <== in[i]; + lt[9][i] = LessEqThan(8); + lt[9][i].in[0] <== in[i]; + lt[9][i].in[1] <== 191; + and[30][i] = AND(); + and[30][i].a <== lt[8][i].out; + and[30][i].b <== lt[9][i].out; + and[31][i] = AND(); + and[31][i].a <== states[i][24]; + and[31][i].b <== and[30][i].out; + and[32][i] = AND(); + and[32][i].a <== states[i][25]; + and[32][i].b <== and[25][i].out; + lt[10][i] = LessEqThan(8); + lt[10][i].in[0] <== 128; + lt[10][i].in[1] <== in[i]; + lt[11][i] = LessEqThan(8); + lt[11][i].in[0] <== in[i]; + lt[11][i].in[1] <== 159; + and[33][i] = AND(); + and[33][i].a <== lt[10][i].out; + and[33][i].b <== lt[11][i].out; + and[34][i] = AND(); + and[34][i].a <== states[i][26]; + and[34][i].b <== and[33][i].out; + multi_or[2][i] = MultiOR(5); + multi_or[2][i].in[0] <== and[28][i].out; + multi_or[2][i].in[1] <== and[29][i].out; + multi_or[2][i].in[2] <== and[31][i].out; + multi_or[2][i].in[3] <== and[32][i].out; + multi_or[2][i].in[4] <== and[34][i].out; + states[i+1][23] <== multi_or[2][i].out; + eq[28][i] = IsEqual(); + eq[28][i].in[0] <== in[i]; + eq[28][i].in[1] <== 224; + and[35][i] = AND(); + and[35][i].a <== states[i][21]; + and[35][i].b <== eq[28][i].out; + and[36][i] = AND(); + and[36][i].a <== states[i][22]; + and[36][i].b <== eq[28][i].out; + multi_or[3][i] = MultiOR(2); + multi_or[3][i].in[0] <== and[35][i].out; + multi_or[3][i].in[1] <== and[36][i].out; + states[i+1][24] <== multi_or[3][i].out; + eq[29][i] = IsEqual(); + eq[29][i].in[0] <== in[i]; + eq[29][i].in[1] <== 225; + eq[30][i] = IsEqual(); + eq[30][i].in[0] <== in[i]; + eq[30][i].in[1] <== 226; + eq[31][i] = IsEqual(); + eq[31][i].in[0] <== in[i]; + eq[31][i].in[1] <== 227; + eq[32][i] = IsEqual(); + eq[32][i].in[0] <== in[i]; + eq[32][i].in[1] <== 228; + eq[33][i] = IsEqual(); + eq[33][i].in[0] <== in[i]; + eq[33][i].in[1] <== 229; + eq[34][i] = IsEqual(); + eq[34][i].in[0] <== in[i]; + eq[34][i].in[1] <== 230; + eq[35][i] = IsEqual(); + eq[35][i].in[0] <== in[i]; + eq[35][i].in[1] <== 231; + eq[36][i] = IsEqual(); + eq[36][i].in[0] <== in[i]; + eq[36][i].in[1] <== 232; + eq[37][i] = IsEqual(); + eq[37][i].in[0] <== in[i]; + eq[37][i].in[1] <== 233; + eq[38][i] = IsEqual(); + eq[38][i].in[0] <== in[i]; + eq[38][i].in[1] <== 234; + eq[39][i] = IsEqual(); + eq[39][i].in[0] <== in[i]; + eq[39][i].in[1] <== 235; + eq[40][i] = IsEqual(); + eq[40][i].in[0] <== in[i]; + eq[40][i].in[1] <== 236; + eq[41][i] = IsEqual(); + eq[41][i].in[0] <== in[i]; + eq[41][i].in[1] <== 238; + eq[42][i] = IsEqual(); + eq[42][i].in[0] <== in[i]; + eq[42][i].in[1] <== 239; + and[37][i] = AND(); + and[37][i].a <== states[i][21]; + multi_or[4][i] = MultiOR(14); + multi_or[4][i].in[0] <== eq[29][i].out; + multi_or[4][i].in[1] <== eq[30][i].out; + multi_or[4][i].in[2] <== eq[31][i].out; + multi_or[4][i].in[3] <== eq[32][i].out; + multi_or[4][i].in[4] <== eq[33][i].out; + multi_or[4][i].in[5] <== eq[34][i].out; + multi_or[4][i].in[6] <== eq[35][i].out; + multi_or[4][i].in[7] <== eq[36][i].out; + multi_or[4][i].in[8] <== eq[37][i].out; + multi_or[4][i].in[9] <== eq[38][i].out; + multi_or[4][i].in[10] <== eq[39][i].out; + multi_or[4][i].in[11] <== eq[40][i].out; + multi_or[4][i].in[12] <== eq[41][i].out; + multi_or[4][i].in[13] <== eq[42][i].out; + and[37][i].b <== multi_or[4][i].out; + and[38][i] = AND(); + and[38][i].a <== states[i][22]; + and[38][i].b <== multi_or[4][i].out; + lt[12][i] = LessEqThan(8); + lt[12][i].in[0] <== 144; + lt[12][i].in[1] <== in[i]; + lt[13][i] = LessEqThan(8); + lt[13][i].in[0] <== in[i]; + lt[13][i].in[1] <== 191; + and[39][i] = AND(); + and[39][i].a <== lt[12][i].out; + and[39][i].b <== lt[13][i].out; + and[40][i] = AND(); + and[40][i].a <== states[i][27]; + and[40][i].b <== and[39][i].out; + and[41][i] = AND(); + and[41][i].a <== states[i][28]; + and[41][i].b <== and[25][i].out; + eq[43][i] = IsEqual(); + eq[43][i].in[0] <== in[i]; + eq[43][i].in[1] <== 128; + eq[44][i] = IsEqual(); + eq[44][i].in[0] <== in[i]; + eq[44][i].in[1] <== 129; + eq[45][i] = IsEqual(); + eq[45][i].in[0] <== in[i]; + eq[45][i].in[1] <== 130; + eq[46][i] = IsEqual(); + eq[46][i].in[0] <== in[i]; + eq[46][i].in[1] <== 131; + eq[47][i] = IsEqual(); + eq[47][i].in[0] <== in[i]; + eq[47][i].in[1] <== 132; + eq[48][i] = IsEqual(); + eq[48][i].in[0] <== in[i]; + eq[48][i].in[1] <== 133; + eq[49][i] = IsEqual(); + eq[49][i].in[0] <== in[i]; + eq[49][i].in[1] <== 134; + eq[50][i] = IsEqual(); + eq[50][i].in[0] <== in[i]; + eq[50][i].in[1] <== 135; + eq[51][i] = IsEqual(); + eq[51][i].in[0] <== in[i]; + eq[51][i].in[1] <== 136; + eq[52][i] = IsEqual(); + eq[52][i].in[0] <== in[i]; + eq[52][i].in[1] <== 137; + eq[53][i] = IsEqual(); + eq[53][i].in[0] <== in[i]; + eq[53][i].in[1] <== 138; + eq[54][i] = IsEqual(); + eq[54][i].in[0] <== in[i]; + eq[54][i].in[1] <== 139; + eq[55][i] = IsEqual(); + eq[55][i].in[0] <== in[i]; + eq[55][i].in[1] <== 140; + eq[56][i] = IsEqual(); + eq[56][i].in[0] <== in[i]; + eq[56][i].in[1] <== 141; + eq[57][i] = IsEqual(); + eq[57][i].in[0] <== in[i]; + eq[57][i].in[1] <== 142; + eq[58][i] = IsEqual(); + eq[58][i].in[0] <== in[i]; + eq[58][i].in[1] <== 143; + and[42][i] = AND(); + and[42][i].a <== states[i][29]; + multi_or[5][i] = MultiOR(16); + multi_or[5][i].in[0] <== eq[43][i].out; + multi_or[5][i].in[1] <== eq[44][i].out; + multi_or[5][i].in[2] <== eq[45][i].out; + multi_or[5][i].in[3] <== eq[46][i].out; + multi_or[5][i].in[4] <== eq[47][i].out; + multi_or[5][i].in[5] <== eq[48][i].out; + multi_or[5][i].in[6] <== eq[49][i].out; + multi_or[5][i].in[7] <== eq[50][i].out; + multi_or[5][i].in[8] <== eq[51][i].out; + multi_or[5][i].in[9] <== eq[52][i].out; + multi_or[5][i].in[10] <== eq[53][i].out; + multi_or[5][i].in[11] <== eq[54][i].out; + multi_or[5][i].in[12] <== eq[55][i].out; + multi_or[5][i].in[13] <== eq[56][i].out; + multi_or[5][i].in[14] <== eq[57][i].out; + multi_or[5][i].in[15] <== eq[58][i].out; + and[42][i].b <== multi_or[5][i].out; + multi_or[6][i] = MultiOR(5); + multi_or[6][i].in[0] <== and[37][i].out; + multi_or[6][i].in[1] <== and[38][i].out; + multi_or[6][i].in[2] <== and[40][i].out; + multi_or[6][i].in[3] <== and[41][i].out; + multi_or[6][i].in[4] <== and[42][i].out; + states[i+1][25] <== multi_or[6][i].out; + eq[59][i] = IsEqual(); + eq[59][i].in[0] <== in[i]; + eq[59][i].in[1] <== 237; + and[43][i] = AND(); + and[43][i].a <== states[i][21]; + and[43][i].b <== eq[59][i].out; + and[44][i] = AND(); + and[44][i].a <== states[i][22]; + and[44][i].b <== eq[59][i].out; + multi_or[7][i] = MultiOR(2); + multi_or[7][i].in[0] <== and[43][i].out; + multi_or[7][i].in[1] <== and[44][i].out; + states[i+1][26] <== multi_or[7][i].out; + eq[60][i] = IsEqual(); + eq[60][i].in[0] <== in[i]; + eq[60][i].in[1] <== 240; + and[45][i] = AND(); + and[45][i].a <== states[i][21]; + and[45][i].b <== eq[60][i].out; + and[46][i] = AND(); + and[46][i].a <== states[i][22]; + and[46][i].b <== eq[60][i].out; + multi_or[8][i] = MultiOR(2); + multi_or[8][i].in[0] <== and[45][i].out; + multi_or[8][i].in[1] <== and[46][i].out; + states[i+1][27] <== multi_or[8][i].out; + eq[61][i] = IsEqual(); + eq[61][i].in[0] <== in[i]; + eq[61][i].in[1] <== 241; + eq[62][i] = IsEqual(); + eq[62][i].in[0] <== in[i]; + eq[62][i].in[1] <== 242; + eq[63][i] = IsEqual(); + eq[63][i].in[0] <== in[i]; + eq[63][i].in[1] <== 243; + and[47][i] = AND(); + and[47][i].a <== states[i][21]; + multi_or[9][i] = MultiOR(3); + multi_or[9][i].in[0] <== eq[61][i].out; + multi_or[9][i].in[1] <== eq[62][i].out; + multi_or[9][i].in[2] <== eq[63][i].out; + and[47][i].b <== multi_or[9][i].out; + and[48][i] = AND(); + and[48][i].a <== states[i][22]; + and[48][i].b <== multi_or[9][i].out; + multi_or[10][i] = MultiOR(2); + multi_or[10][i].in[0] <== and[47][i].out; + multi_or[10][i].in[1] <== and[48][i].out; + states[i+1][28] <== multi_or[10][i].out; + eq[64][i] = IsEqual(); + eq[64][i].in[0] <== in[i]; + eq[64][i].in[1] <== 244; + and[49][i] = AND(); + and[49][i].a <== states[i][21]; + and[49][i].b <== eq[64][i].out; + and[50][i] = AND(); + and[50][i].a <== states[i][22]; + and[50][i].b <== eq[64][i].out; + multi_or[11][i] = MultiOR(2); + multi_or[11][i].in[0] <== and[49][i].out; + multi_or[11][i].in[1] <== and[50][i].out; + states[i+1][29] <== multi_or[11][i].out; + and[51][i] = AND(); + and[51][i].a <== states[i][22]; + and[51][i].b <== eq[0][i].out; + states[i+1][30] <== and[51][i].out; + eq[65][i] = IsEqual(); + eq[65][i].in[0] <== in[i]; + eq[65][i].in[1] <== 47; + and[52][i] = AND(); + and[52][i].a <== states[i][30]; + and[52][i].b <== eq[65][i].out; + states[i+1][31] <== and[52][i].out; + and[53][i] = AND(); + and[53][i].a <== states[i][31]; + and[53][i].b <== eq[1][i].out; + states[i+1][32] <== and[53][i].out; + and[54][i] = AND(); + and[54][i].a <== states[i][32]; + and[54][i].b <== eq[2][i].out; + states[i+1][33] <== and[54][i].out; + and[55][i] = AND(); + and[55][i].a <== states[i][33]; + and[55][i].b <== eq[3][i].out; + states[i+1][34] <== and[55][i].out; + and[56][i] = AND(); + and[56][i].a <== states[i][34]; + and[56][i].b <== eq[16][i].out; + states[i+1][35] <== and[56][i].out; + from_zero_enabled[i] <== MultiNOR(35)([states_tmp[i+1][1], states[i+1][2], states[i+1][3], states[i+1][4], states[i+1][5], states[i+1][6], states[i+1][7], states[i+1][8], states[i+1][9], states[i+1][10], states[i+1][11], states[i+1][12], states[i+1][13], states[i+1][14], states[i+1][15], states[i+1][16], states[i+1][17], states[i+1][18], states[i+1][19], states[i+1][20], states[i+1][21], states[i+1][22], states[i+1][23], states[i+1][24], states[i+1][25], states[i+1][26], states[i+1][27], states[i+1][28], states[i+1][29], states[i+1][30], states[i+1][31], states[i+1][32], states[i+1][33], states[i+1][34], states[i+1][35]]); + states[i+1][1] <== MultiOR(2)([states_tmp[i+1][1], from_zero_enabled[i] * and[0][i].out]); + state_changed[i].in[0] <== states[i+1][1]; + state_changed[i].in[1] <== states[i+1][2]; + state_changed[i].in[2] <== states[i+1][3]; + state_changed[i].in[3] <== states[i+1][4]; + state_changed[i].in[4] <== states[i+1][5]; + state_changed[i].in[5] <== states[i+1][6]; + state_changed[i].in[6] <== states[i+1][7]; + state_changed[i].in[7] <== states[i+1][8]; + state_changed[i].in[8] <== states[i+1][9]; + state_changed[i].in[9] <== states[i+1][10]; + state_changed[i].in[10] <== states[i+1][11]; + state_changed[i].in[11] <== states[i+1][12]; + state_changed[i].in[12] <== states[i+1][13]; + state_changed[i].in[13] <== states[i+1][14]; + state_changed[i].in[14] <== states[i+1][15]; + state_changed[i].in[15] <== states[i+1][16]; + state_changed[i].in[16] <== states[i+1][17]; + state_changed[i].in[17] <== states[i+1][18]; + state_changed[i].in[18] <== states[i+1][19]; + state_changed[i].in[19] <== states[i+1][20]; + state_changed[i].in[20] <== states[i+1][21]; + state_changed[i].in[21] <== states[i+1][22]; + state_changed[i].in[22] <== states[i+1][23]; + state_changed[i].in[23] <== states[i+1][24]; + state_changed[i].in[24] <== states[i+1][25]; + state_changed[i].in[25] <== states[i+1][26]; + state_changed[i].in[26] <== states[i+1][27]; + state_changed[i].in[27] <== states[i+1][28]; + state_changed[i].in[28] <== states[i+1][29]; + state_changed[i].in[29] <== states[i+1][30]; + state_changed[i].in[30] <== states[i+1][31]; + state_changed[i].in[31] <== states[i+1][32]; + state_changed[i].in[32] <== states[i+1][33]; + state_changed[i].in[33] <== states[i+1][34]; + state_changed[i].in[34] <== states[i+1][35]; + } + + component is_accepted = MultiOR(num_bytes+1); + for (var i = 0; i <= num_bytes; i++) { + is_accepted.in[i] <== states[i][35]; + } + out <== is_accepted.out; + signal is_consecutive[msg_bytes+1][3]; + is_consecutive[msg_bytes][2] <== 0; + for (var i = 0; i < msg_bytes; i++) { + is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][35] * (1 - is_consecutive[msg_bytes-i][2]) + is_consecutive[msg_bytes-i][2]; + is_consecutive[msg_bytes-1-i][1] <== state_changed[msg_bytes-i].out * is_consecutive[msg_bytes-1-i][0]; + is_consecutive[msg_bytes-1-i][2] <== ORAnd()([(1 - from_zero_enabled[msg_bytes-i+1]), states[num_bytes-i][35], is_consecutive[msg_bytes-1-i][1]]); + } + // substrings calculated: [{(21, 22), (21, 23), (21, 24), (21, 25), (21, 26), (21, 27), (21, 28), (21, 29), (22, 22), (22, 23), (22, 24), (22, 25), (22, 26), (22, 27), (22, 28), (22, 29), (23, 22), (24, 23), (25, 23), (26, 23), (27, 25), (28, 25), (29, 25)}] + signal prev_states0[23][msg_bytes]; + signal is_substr0[msg_bytes]; + signal is_reveal0[msg_bytes]; + signal output reveal0[msg_bytes]; + for (var i = 0; i < msg_bytes; i++) { + // the 0-th substring transitions: [(21, 22), (21, 23), (21, 24), (21, 25), (21, 26), (21, 27), (21, 28), (21, 29), (22, 22), (22, 23), (22, 24), (22, 25), (22, 26), (22, 27), (22, 28), (22, 29), (23, 22), (24, 23), (25, 23), (26, 23), (27, 25), (28, 25), (29, 25)] + prev_states0[0][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[1][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[2][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[3][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[4][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[5][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[6][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[7][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[8][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; + prev_states0[9][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; + prev_states0[10][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; + prev_states0[11][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; + prev_states0[12][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; + prev_states0[13][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; + prev_states0[14][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; + prev_states0[15][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; + prev_states0[16][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][23]; + prev_states0[17][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][24]; + prev_states0[18][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][25]; + prev_states0[19][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][26]; + prev_states0[20][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][27]; + prev_states0[21][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][28]; + prev_states0[22][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][29]; + is_substr0[i] <== MultiOR(23)([prev_states0[0][i] * states[i+2][22], prev_states0[1][i] * states[i+2][23], prev_states0[2][i] * states[i+2][24], prev_states0[3][i] * states[i+2][25], prev_states0[4][i] * states[i+2][26], prev_states0[5][i] * states[i+2][27], prev_states0[6][i] * states[i+2][28], prev_states0[7][i] * states[i+2][29], prev_states0[8][i] * states[i+2][22], prev_states0[9][i] * states[i+2][23], prev_states0[10][i] * states[i+2][24], prev_states0[11][i] * states[i+2][25], prev_states0[12][i] * states[i+2][26], prev_states0[13][i] * states[i+2][27], prev_states0[14][i] * states[i+2][28], prev_states0[15][i] * states[i+2][29], prev_states0[16][i] * states[i+2][22], prev_states0[17][i] * states[i+2][23], prev_states0[18][i] * states[i+2][23], prev_states0[19][i] * states[i+2][23], prev_states0[20][i] * states[i+2][25], prev_states0[21][i] * states[i+2][25], prev_states0[22][i] * states[i+2][25]]); + is_reveal0[i] <== MultiAND(3)([out, is_substr0[i], is_consecutive[i][2]]); + reveal0[i] <== in[i+1] * is_reveal0[i]; + } +} \ No newline at end of file diff --git a/packages/circuits/tests/email_auth.test.ts b/packages/circuits/tests/email_auth.test.ts index 2bb08705..32e94c56 100644 --- a/packages/circuits/tests/email_auth.test.ts +++ b/packages/circuits/tests/email_auth.test.ts @@ -3,317 +3,843 @@ const wasm_tester = circom_tester.wasm; import * as path from "path"; const relayerUtils = require("@zk-email/relayer-utils"); -import { genEmailAuthInput } from "../helpers/email_auth"; +import { genEmailCircuitInput } from "../helpers/email_auth"; import { readFileSync } from "fs"; jest.setTimeout(1440000); describe("Email Auth", () => { - let circuit; - beforeAll(async () => { - const option = { - include: path.join(__dirname, "../../../node_modules"), - }; - circuit = await wasm_tester( - path.join(__dirname, "../src/email_auth.circom"), - option - ); - }); - - it("Verify a sent email whose subject has an email address", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test1.eml"); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - console.log(parsedEmail.canonicalizedHeader); - const accountCode = await relayerUtils.genAccountCode(); - const circuitInputs = await genEmailAuthInput(emailFilePath, accountCode); - console.log(circuitInputs); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - const timestamp = 1694989812n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - const maskedSubject = "Send 0.1 ETH to "; - const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); - for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - expect(BigInt(maskedSubjectFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "suegamisora@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - ); - expect(0n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] - ); - }); - - it("Verify a sent email whose subject does not have an email address", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test2.eml"); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - console.log(parsedEmail.canonicalizedHeader); - const accountCode = await relayerUtils.genAccountCode(); - const circuitInputs = await genEmailAuthInput(emailFilePath, accountCode); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - const timestamp = 1696964295n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - const maskedSubject = "Swap 1 ETH to DAI"; - const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); - for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - expect(BigInt(maskedSubjectFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "suegamisora@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - ); - expect(0n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] - ); - }); - - it("Verify a sent email whose from field has a dummy email address name", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test3.eml"); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - console.log(parsedEmail.canonicalizedHeader); - const accountCode = await relayerUtils.genAccountCode(); - const circuitInputs = await genEmailAuthInput(emailFilePath, accountCode); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - const timestamp = 1696965932n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - const maskedSubject = "Send 1 ETH to "; - const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); - for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - expect(BigInt(maskedSubjectFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "suegamisora@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - ); - expect(0n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] - ); - }); - - it("Verify a sent email whose from field has a non-English name", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test4.eml"); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - console.log(parsedEmail.canonicalizedHeader); - const accountCode = await relayerUtils.genAccountCode(); - const circuitInputs = await genEmailAuthInput(emailFilePath, accountCode); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - const timestamp = 1696967028n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - const maskedSubject = "Send 1 ETH to "; - const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); - for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - expect(BigInt(maskedSubjectFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "suegamisora@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - ); - expect(0n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] - ); - }); - - it("Verify a sent email whose subject has an email address and an invitation code", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test5.eml"); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - console.log(parsedEmail.canonicalizedHeader); - const accountCode = - "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - const circuitInputs = await genEmailAuthInput(emailFilePath, accountCode); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - const timestamp = 1707866192n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - const maskedSubject = "Send 0.12 ETH to "; - const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); - for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - expect(BigInt(maskedSubjectFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "suegamisora@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - ); - expect(1n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] - ); - }); - - it("Verify a sent email whose subject has an invitation code", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test6.eml"); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - const accountCode = - "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - const circuitInputs = await genEmailAuthInput(emailFilePath, accountCode); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - const timestamp = 1711992080n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - const maskedSubject = - "Re: Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; - const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); - for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - expect(BigInt(maskedSubjectFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "suegamisora@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - ); - expect(1n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] - ); - }); - - it("Verify a sent email whose subject tries to forge the From field", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test7.eml"); - const accountCode = - "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - const circuitInputs = await genEmailAuthInput(emailFilePath, accountCode); - circuitInputs.from_addr_idx = circuitInputs.subject_idx; - async function failFn() { - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - } - await expect(failFn).rejects.toThrow(); - }); + let circuit; + beforeAll(async () => { + const option = { + include: path.join(__dirname, "../../../node_modules"), + }; + circuit = await wasm_tester( + path.join(__dirname, "../src/email_auth.circom"), + option + ); + }); + + it("Verify a sent email whose subject has an email address", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test1.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + console.log(parsedEmail.canonicalizedHeader); + const accountCode = await relayerUtils.genAccountCode(); + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...circuitInputsRelevant + } = await genEmailCircuitInput(emailFilePath, accountCode); + console.log(circuitInputsRelevant); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + const timestamp = 1694989812n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + const maskedSubject = "Send 0.1 ETH to "; + const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + const maskedSubjectFields = + relayerUtils.bytes2Fields(paddedMaskedSubject); + for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + expect(BigInt(maskedSubjectFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "suegamisora@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + ); + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose subject does not have an email address", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test2.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + console.log(parsedEmail.canonicalizedHeader); + const accountCode = await relayerUtils.genAccountCode(); + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...circuitInputsRelevant + } = await genEmailCircuitInput(emailFilePath, accountCode); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + const timestamp = 1696964295n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + const maskedSubject = "Swap 1 ETH to DAI"; + const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + const maskedSubjectFields = + relayerUtils.bytes2Fields(paddedMaskedSubject); + for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + expect(BigInt(maskedSubjectFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "suegamisora@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + ); + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose from field has a dummy email address name", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test3.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + console.log(parsedEmail.canonicalizedHeader); + const accountCode = await relayerUtils.genAccountCode(); + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...circuitInputsRelevant + } = await genEmailCircuitInput(emailFilePath, accountCode); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + const timestamp = 1696965932n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + const maskedSubject = "Send 1 ETH to "; + const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + const maskedSubjectFields = + relayerUtils.bytes2Fields(paddedMaskedSubject); + for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + expect(BigInt(maskedSubjectFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "suegamisora@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + ); + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose from field has a non-English name", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test4.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + console.log(parsedEmail.canonicalizedHeader); + const accountCode = await relayerUtils.genAccountCode(); + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...circuitInputsRelevant + } = await genEmailCircuitInput(emailFilePath, accountCode); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + const timestamp = 1696967028n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + const maskedSubject = "Send 1 ETH to "; + const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + const maskedSubjectFields = + relayerUtils.bytes2Fields(paddedMaskedSubject); + for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + expect(BigInt(maskedSubjectFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "suegamisora@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + ); + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose subject has an email address and an invitation code", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test5.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + console.log(parsedEmail.canonicalizedHeader); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...circuitInputsRelevant + } = await genEmailCircuitInput(emailFilePath, accountCode); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + const timestamp = 1707866192n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + const maskedSubject = "Send 0.12 ETH to "; + const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + const maskedSubjectFields = + relayerUtils.bytes2Fields(paddedMaskedSubject); + for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + expect(BigInt(maskedSubjectFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "suegamisora@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + ); + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose subject has an invitation code", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test6.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...circuitInputsRelevant + } = await genEmailCircuitInput(emailFilePath, accountCode); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + const timestamp = 1711992080n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + const maskedSubject = + "Re: Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; + const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + const maskedSubjectFields = + relayerUtils.bytes2Fields(paddedMaskedSubject); + for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + expect(BigInt(maskedSubjectFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "suegamisora@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + ); + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose subject tries to forge the From field", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test7.eml" + ); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...circuitInputsRelevant + } = await genEmailCircuitInput(emailFilePath, accountCode); + circuitInputsRelevant.from_addr_idx = circuitInputsRelevant.subject_idx; + async function failFn() { + const witness = await circuit.calculateWitness( + circuitInputsRelevant + ); + await circuit.checkConstraints(witness); + } + await expect(failFn).rejects.toThrow(); + }); +}); + +jest.setTimeout(1440000); +describe("Email Auth With Body Parsing", () => { + let circuit; + beforeAll(async () => { + const option = { + include: path.join(__dirname, "../../../node_modules"), + output: path.join(__dirname, "../build"), + recompile: true, + }; + circuit = await wasm_tester( + path.join(__dirname, "../src/email_auth_with_body_parsing.circom"), + option + ); + }); + + it("Verify a sent email whose body has an email address", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test1.eml" + ); + + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = await relayerUtils.genAccountCode(); + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + circuitInputsRelevant.padded_cleaned_body = + circuitInputsRelevant.padded_body; + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725116446n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Send 0.1 ETH to "; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose subject does not have an email address", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test2.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = await relayerUtils.genAccountCode(); + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + circuitInputsRelevant.padded_cleaned_body = + circuitInputsRelevant.padded_body; + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725116459n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Swap 1 ETH to DAI"; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose from field has a dummy email address name", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test3.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = await relayerUtils.genAccountCode(); + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + circuitInputsRelevant.padded_cleaned_body = + circuitInputsRelevant.padded_body; + + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725116474n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Send 1 ETH to "; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); +}); + +jest.setTimeout(1440000); +describe("Email Auth With Body Parsing (QP Encoded)", () => { + let circuit; + beforeAll(async () => { + const option = { + include: path.join(__dirname, "../../../node_modules"), + output: path.join(__dirname, "../build"), + recompile: true, + }; + circuit = await wasm_tester( + path.join( + __dirname, + "../src/email_auth_with_body_parsing_with_qp_encoding.circom" + ), + option + ); + }); + + // it("Verify a sent email whose from field has a non-English name", async () => { + // const emailFilePath = path.join( + // __dirname, + // "./emails/email_auth_with_body_parsing_test4.eml" + // ); + // const emailRaw = readFileSync(emailFilePath, "utf8"); + // const parsedEmail = await relayerUtils.parseEmail(emailRaw); + // console.log(parsedEmail.canonicalizedHeader); + // const accountCode = await relayerUtils.genAccountCode(); + // const circuitInputs = await genEmailAuthInput( + // emailFilePath, + // accountCode + // ); + // const witness = await circuit.calculateWitness(circuitInputs); + // await circuit.checkConstraints(witness); + // const domainName = "gmail.com"; + // const paddedDomain = relayerUtils.padString(domainName, 255); + // const domainFields = relayerUtils.bytes2Fields(paddedDomain); + // for (let idx = 0; idx < domainFields.length; ++idx) { + // expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + // } + // const expectedPubKeyHash = relayerUtils.publicKeyHash( + // parsedEmail.publicKey + // ); + // expect(BigInt(expectedPubKeyHash)).toEqual( + // witness[1 + domainFields.length] + // ); + // const expectedEmailNullifier = relayerUtils.emailNullifier( + // parsedEmail.signature + // ); + // expect(BigInt(expectedEmailNullifier)).toEqual( + // witness[1 + domainFields.length + 1] + // ); + // const timestamp = 1696967028n; + // expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + // const maskedSubject = "Send 1 ETH to "; + // const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + // const maskedSubjectFields = + // relayerUtils.bytes2Fields(paddedMaskedSubject); + // for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + // expect(BigInt(maskedSubjectFields[idx])).toEqual( + // witness[1 + domainFields.length + 3 + idx] + // ); + // } + // const fromAddr = "suegamisora@gmail.com"; + // const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + // expect(BigInt(accountSalt)).toEqual( + // witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + // ); + // expect(0n).toEqual( + // witness[ + // 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + // ] + // ); + // }); + + it("Verify a sent email whose body has an email address and an invitation code", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test4.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725116497n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Send 0.12 ETH to "; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose subject has an invitation code", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test5.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725116520n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = + "Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); }); diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test1.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test1.eml new file mode 100644 index 00000000..4584b8aa --- /dev/null +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test1.eml @@ -0,0 +1,99 @@ +Delivered-To: shryas.londhe@gmail.com +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1026748pzb; + Sat, 31 Aug 2024 08:00:47 -0700 (PDT) +X-Received: by 2002:a17:902:ccce:b0:205:56e8:4a4b with SMTP id d9443c01a7336-20556e84f14mr9184725ad.2.1725116447179; + Sat, 31 Aug 2024 08:00:47 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725116447; cv=none; + d=google.com; s=arc-20160816; + b=Qr8YEl00ep0RtfjlYibeBzB6ypthNbTJRONySg+ewxTyyh7vfzT8zu6YSVyyd+ZZQ8 + ASj1pBCH626+hEBQLPRoWZppBuvW1ZRLOGlcfmFE8XtLpKBMUeOvRm9iZqZeeqqNuIOl + KNoJbnefyf6jUVJMjFjGe/vQoiAjNxYQsSz7LHbrEuRdvB9Tpvp0ZRbEfKdk3jmwR4kB + VnPSaQgNyJ5s5UD2J7eoPYBNk7cSBFCMk4/V/xg+Avfix9yugcJVW6N0dHD5qLTyD4yA + w13OE/8ky9j6p2bJSKzvLRjaOoExLzCEry1iSPj9DiaIXlCutgDq/fpIozqwKV2O20Pg + N2bg== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=LyAHd2Pk3aeTA8CpoFpw/E0CFFMvOIrbREsfo89LIPs=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + b=DBTgZXMxh5Vl7+Fh7xZrxPRTVHtuDhuYNRuCSArQxJ4AAdgQ07PV4S/OjmbGZJs01N + UnFQ/mR023C81Vr03YCHmPCtGGB5DX3/liBLmHeReRDHxDAHnBTw1AIwJLS1zFZmH374 + BqwVEiQuxzKBKrfHc5PZ/1FHQzRNA7EwcwUhSvNP18m+tM7tkEVzKRuH1J16EJZH291L + grdKNyDa3VEibSX3ks6t1sAOwSdE9sHvYeiC5zdkLW4f2wjW39/RguiCJ+Z6VKNvFgSL + EDolORYyRFamBJJzm0ywHn4cQyWVf2gasfb+ytdcds2i0YVa4WX2A9YQgf0C1NOuN02a + hv9A==; + dara=google.com +ARC-Authentication-Results: i=1; mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=nTKZtFU2; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +Return-Path: +Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) + by mx.google.com with SMTPS id d9443c01a7336-205154d6b07sor19840805ad.10.2024.08.31.08.00.47 + for + (Google Transport Security); + Sat, 31 Aug 2024 08:00:47 -0700 (PDT) +Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; +Authentication-Results: mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=nTKZtFU2; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20230601; t=1725116446; x=1725721246; dara=google.com; + h=subject:to:from:mime-version:date:message-id:from:to:cc:subject + :date:message-id:reply-to; + bh=LyAHd2Pk3aeTA8CpoFpw/E0CFFMvOIrbREsfo89LIPs=; + b=nTKZtFU2l8aiosN6tzQ+a8RwpzryDTryuR0e38ocX+8EP6FJ8OPwD/w4FS5f1EjE7r + eTPr5PAMZrkKVNiGnJqKxTRaJHx9CD5tx69QgnCAvGrOdTASvL2jMHqewcj57Cal8ipU + CLn/cvnAu/qQ9KdmDocdsjn0Pg0EVTBzaJlrCWpaeRkLcGs1Rlgsh9zbqRd13WmytAa3 + s64n4vTN8easpcN5hod+XdxEOipmv8NnE9yYg1R3elVvclzHQOQS85QRb8M5rHSh+a/m + i9xuoWaX4gbq0x5iRSInPN64zCk/7zLl0eqdwMwfp2Kfg4iwbe9mk+151AGcXxzOykQr + Is+Q== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20230601; t=1725116446; x=1725721246; + h=subject:to:from:mime-version:date:message-id:x-gm-message-state + :from:to:cc:subject:date:message-id:reply-to; + bh=LyAHd2Pk3aeTA8CpoFpw/E0CFFMvOIrbREsfo89LIPs=; + b=PD2mNuDIo1OCJuCm7i2hCvDN38Y7XW6MB72ik68hkVg90E6SmzUePucXrEZ0FElxqP + b6kFkVEUMktZHbYs1xfl+ZYjx6wtk8/d47LDVIsRxUl8701SR46QgDa4kAEt5u77QMWo + hTddFBO0sFK4kEiS0vEj3tvqkWZMKDrAMdfnrYe0dW5ZH+S4oIWrPRzUn5VvkFHDdCPA + JXC2rDPJ6iarLdhQetfSV0O921bWmj0wAzOWBhK2D3d5GZ8LHFZqgV5LgiChMtppUqr1 + Gw3C6gffSBEJb/FcHb6DBwMFS4VMi4Q7KgDLNrU8IWY7q9204qzdb3ogmlvM/StPIfl7 + CTrw== +X-Gm-Message-State: AOJu0YwcFpDkgIrszzQOaKbaC6PoUtkgo7TPpCcScAu7gHIJFuW3bEeN + 9ucO0uilIKASUkh+U9KzJ18GEYbLjw1RalJk5XbK8aBhG4GvvAp8Vc3xKw== +X-Google-Smtp-Source: AGHT+IGhsUNaW6XNgFUu7aW5NNrZi1nWOTkUbqwLDTssDaAsR2kuUGh4J6eJnQkEaYqzS9yWdctoeA== +X-Received: by 2002:a17:902:f688:b0:1fb:4194:5b78 with SMTP id d9443c01a7336-2054477bfbamr27368035ad.47.1725116445966; + Sat, 31 Aug 2024 08:00:45 -0700 (PDT) +Return-Path: +Received: from adityas-macbook-air-4.local ([61.2.109.23]) + by smtp.gmail.com with ESMTPSA id d9443c01a7336-205152d02b4sm42029585ad.87.2024.08.31.08.00.44 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Sat, 31 Aug 2024 08:00:45 -0700 (PDT) +Message-ID: <66d3301d.170a0220.2fb85.006c@mx.google.com> +Date: Sat, 31 Aug 2024 08:00:45 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============8351371397052058247==" +MIME-Version: 1.0 +From: zkemail.relayer.test@gmail.com +To: shryas.londhe@gmail.com +Subject: Test Email 1 in Quoted-Printable Encoding + +--===============8351371397052058247== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 + + + + +

Hello!

+

This is a test email with a basic HTML body.

+
Send 0.1 ETH to alice@gmail.com
=20 +

Thank you!

+ + + =20 +--===============8351371397052058247==-- diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test2.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test2.eml new file mode 100644 index 00000000..c7011a32 --- /dev/null +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test2.eml @@ -0,0 +1,99 @@ +Delivered-To: shryas.londhe@gmail.com +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1026932pzb; + Sat, 31 Aug 2024 08:01:00 -0700 (PDT) +X-Received: by 2002:a17:902:ce82:b0:205:4fb0:e0a3 with SMTP id d9443c01a7336-2054fb0e2d9mr11498635ad.41.1725116459826; + Sat, 31 Aug 2024 08:00:59 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725116459; cv=none; + d=google.com; s=arc-20160816; + b=PmrIhQKpMWIus67HAfo0q6V/K8SljpvyWOVGY6VTlaazsjySQFOYDK2+/MgRE9WKdi + WzP+Ghu50yHo+j8oGfJhsNkEPfsZO1eIwiRSN9YnSk0PVyv1YkB0/+Zvj7LKSY6RHM8r + IQLVKUD+VdWZdBIBwZ6i3fa62hI9aXJVPxsXqXeh66ks6qw/TCnNfBfSCm2wV9xdIbui + y0l3QCjbOhOpxTSqN05r68VmdlVm943qcmrPQhORNKdEWQ0YeLU7kbHOFnZbQN9yBBQB + dTltxwC38Y/XwQqcgtKK2AXcmfWjPQ3JMwXNP3oVTFEJC778duM+IRldXkBRYkM6cfNf + OVUA== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=hYO9SIor6/ZMSH5Se6VbxdzKfW8mplLpyajlLIUnct4=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + b=0mjYYGShvMO5Hd/O+d1vcd/LshCmIoHhUHKHoTdvz0NU+oGRdr6X8X5C5XMGDym814 + AUfkFC63M2N6ZxWZCPQ+UFYIsXFVoJRJiAO9qRfc0TLfgLt32F90d2btikBAFpMkmzaE + D3Z0uasHMFA88phJpwONXiUX97ZdQjOtKgCnhkHh5DDYDCVCuuwAq8tHSVYTzitbXk7v + TJvOMHztwqS4Wn+XsbUg3JLaIJE+9jsC0ijVEtnXCPXQFGvuFBisxAwv4ll70yO+EBvv + 7H5AwdE5805dRtu9p1hFJ/kkAcoQK/WwOHuEU5xyAXdQ9ZLNRVCavQRlg0UP1c2lM0dv + dLyQ==; + dara=google.com +ARC-Authentication-Results: i=1; mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=deHzDMLm; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +Return-Path: +Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) + by mx.google.com with SMTPS id d9443c01a7336-20514fd2b0asor32747505ad.0.2024.08.31.08.00.59 + for + (Google Transport Security); + Sat, 31 Aug 2024 08:00:59 -0700 (PDT) +Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; +Authentication-Results: mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=deHzDMLm; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20230601; t=1725116459; x=1725721259; dara=google.com; + h=subject:to:from:mime-version:date:message-id:from:to:cc:subject + :date:message-id:reply-to; + bh=hYO9SIor6/ZMSH5Se6VbxdzKfW8mplLpyajlLIUnct4=; + b=deHzDMLmxnSfVSsNI5+hLLr9KIGO9uZYa2aanSXQ/Xpv8ffhxTY1BZzaGsOUpqyb26 + PnoXYuzNImt9PKjDtxQQdijWJ+waOsJ2m8g8yHi6WXkc7iTuLsvofMLv3eySQzKS3Az3 + R9adL7W/3BVGIXX15DFLWhGOavE4hekSdg2FvxXw4XN4z+5xhmMh13nHOMXNKmcE5sqH + lUBL+Y6SimqeRCPY01UkNbkNZbsgtcPOvTs2oQqlDchLo6POzDXP/JI6LAxgEZZyEOot + 3Q7NeXo5AIzD4DtyQxlC5YFxoq5/dPur4G4srMyJdewhn2SMlSqD60TgJMNNHrWo1D8p + w1MQ== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20230601; t=1725116459; x=1725721259; + h=subject:to:from:mime-version:date:message-id:x-gm-message-state + :from:to:cc:subject:date:message-id:reply-to; + bh=hYO9SIor6/ZMSH5Se6VbxdzKfW8mplLpyajlLIUnct4=; + b=olcA7mL97nyNtorrOnzO0zwjiG3PDG+RxknXQ83lSn2HIThVld7R3vf46xzquA5+XJ + IEXzFTTSOYdziulB9qoxfS+2F+mnbCKuS2+glnuy+pw5PKcdzy7O7Ziesu11eT8lJaFs + ywqKZhMTnmyKwU62tfB0x8cAxcXy0SrcbRVC4ICBx0pWHEg3MsiorVMgojdWAuPbk+ie + yY8kgB8QGRT/Ci6Kts30cTIuU5VF0WXYpcB0DYQPm/wV+UOCUMrVDUhILGpYlufM9m/J + Y/NGWEbzBg1mr/qk805kT+hDPfUQpTbp0qjCWKHB3Pyo/XVoddiQpzX2gCOGJqoPw2Nt + MmmA== +X-Gm-Message-State: AOJu0YwaKDzY17sAdIfLzMuop/B7R65MlYsmLI2u5QTwHuiONn9Fm27B + RkPQeY0Pkt6r6JTtU2dxhw+wn6n/3YVx+GxbNP7rW2pMqXmoz09aIyhGHA== +X-Google-Smtp-Source: AGHT+IGRRWkrZll1vJ6c2VcJ0ooxaiTUdkto9iGoCEEoZUC/9fODLscPYZRkoTVwxV5v9IbYoSbeOg== +X-Received: by 2002:a17:903:22d0:b0:205:5285:9ae7 with SMTP id d9443c01a7336-20552859d03mr13308925ad.63.1725116458685; + Sat, 31 Aug 2024 08:00:58 -0700 (PDT) +Return-Path: +Received: from adityas-macbook-air-4.local ([61.2.109.23]) + by smtp.gmail.com with ESMTPSA id d9443c01a7336-205152b1546sm41986405ad.18.2024.08.31.08.00.57 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Sat, 31 Aug 2024 08:00:58 -0700 (PDT) +Message-ID: <66d3302a.170a0220.37721f.0172@mx.google.com> +Date: Sat, 31 Aug 2024 08:00:58 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============3364028563347567699==" +MIME-Version: 1.0 +From: zkemail.relayer.test@gmail.com +To: shryas.londhe@gmail.com +Subject: Test Email 2 in Quoted-Printable Encoding + +--===============3364028563347567699== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 + + + + +

Hello!

+

This is a test email with a basic HTML body.

+
Swap 1 ETH to DAI
=20 +

Thank you!

+ + + =20 +--===============3364028563347567699==-- diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test3.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test3.eml new file mode 100644 index 00000000..f4993ebd --- /dev/null +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test3.eml @@ -0,0 +1,99 @@ +Delivered-To: shryas.londhe@gmail.com +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1027166pzb; + Sat, 31 Aug 2024 08:01:15 -0700 (PDT) +X-Received: by 2002:a17:902:ce8c:b0:203:a14d:ed0 with SMTP id d9443c01a7336-2054bc9705emr19472065ad.11.1725116474890; + Sat, 31 Aug 2024 08:01:14 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725116474; cv=none; + d=google.com; s=arc-20160816; + b=isV3uAKpSEJfk4nROlocDiKzF/dQTfkYGY0UTuMGr2y/qe6whSqx4vJprMw41ZCCXf + mwylqtY2rdGYhVlNNexYBGrmcpJivbsFExi1FpSp7whZNJtIoCHq5RcFtG1wH3x/Xzee + ipN0A33kJByLYZi10LPoNt+u0DMlaSJg5nPTZBUwRVpl2/WZziYV8GN8d2GNd6uoHi58 + MLb9UoDYRQPXIue/IsZgMEhimu8DOEMirgjoRXmPXIt7NQ/Bt/bASITA+HVZMLDoUJ0g + xf9hI6kIFmKFI7kC69VjoQioWvvS/2DgIeNtrZI9LJpbIl8B6wCI/ugieWkp9Pnb3h4j + GNBA== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=B4663a3Zik2f5/UC+Z2z5NTP9hsvHxZYsowtimZVV0o=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + b=T+B3iD7KsX3Xa7BwtiMCe2O13CNSy1SXP6pHrDo3pBn57D//ajLTjopK1el87q8oFZ + GgraRjSsvYx0GAdLXd4simHDKdvRNkNGkixi31oo3zk22oNGzFjlZb4O0WnqVAZ70u45 + fDU6lEvqvUBGZ7e1UrBfbpUmZ6SpzObNTEszDSHhkHTO2Tm47yVyQ1sPfZFQ03roFQjk + S78HeV24j3L792G1uAgYUsUyYnvS3v945sach2jhPRA6XwJvMr36JoTRvDS69K2KfpkQ + MoBeEIEQy4II/edUXGbfsFORv8MPNg5HP4FSLK3NDVobIqOYA1+8aPbMKECoPS4/qufQ + YzOg==; + dara=google.com +ARC-Authentication-Results: i=1; mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=GUbVbXvL; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +Return-Path: +Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) + by mx.google.com with SMTPS id d9443c01a7336-2051553c96bsor35818955ad.16.2024.08.31.08.01.14 + for + (Google Transport Security); + Sat, 31 Aug 2024 08:01:14 -0700 (PDT) +Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; +Authentication-Results: mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=GUbVbXvL; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20230601; t=1725116474; x=1725721274; dara=google.com; + h=subject:to:from:mime-version:date:message-id:from:to:cc:subject + :date:message-id:reply-to; + bh=B4663a3Zik2f5/UC+Z2z5NTP9hsvHxZYsowtimZVV0o=; + b=GUbVbXvLVy7y3KPnsyT8GDKjPiEwNt8xJJw81V3rApSg0KpDDLq9pHS71+7/BspSyU + glif1NYvEh71vC4rn7lBZi9Fl+LxLI+ApS8Vp+1y3OF8sLcpYWx2olWzKVF/Ez98HPfg + Gdk3PZTx+pms87aQDB4De4rnTXXnBGYd39evd8oqAYUPX0MOpxWVDkICiaVvSaM4dpYD + kmJSGSCO0jfysgmxFi4w0h63dWPZ6yRldvF+HYk1aSzfE5ZXP48FhOctW38bqYxt0N65 + rfrI8qn+QCK5vW45RwSU/90JPg5vovFpy2Jh+CVN0u3j4tPonie44foEOSbcJ68K5Mdl + pPLg== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20230601; t=1725116474; x=1725721274; + h=subject:to:from:mime-version:date:message-id:x-gm-message-state + :from:to:cc:subject:date:message-id:reply-to; + bh=B4663a3Zik2f5/UC+Z2z5NTP9hsvHxZYsowtimZVV0o=; + b=SJpSPxyZx20noJ7caD+DwynBoQle/kzsk76rWzNfOrctHXxe2Fzs4RrBoFetVBnUXY + rEVhcqrIPasrxeLNM/1hi7LGn13Vw/UXQutx7zUeZCPcG3Xq29GNy4wvAS1csDuwSlLV + gkDl4E4s/wMW/owOlzscT8VkSssMoyWyvgXRsZcX8VEEGnuHmfibfXZrJobTIEU3x0Ah + 0lNgzg8UmLh/l+zBsTvvXii50TWIMLcIMCKzMuIKleaK/HpBQVJexWec21ytrbH7mths + wAKXllHLJ5QeR2Alz96qKs6/zBuZ/vIMlPSHzoMEq81KFnGNsGjFcA5s6nPJaFR3TyU9 + i7bg== +X-Gm-Message-State: AOJu0Yx7KhYNSQv/lPCCbvgbNFis0yJc4cHuJgZ/YhJWmfg5Zc5c2JdY + bc7w4kHyz0Qs73852fgkEOKkR3VRirowD0QPzrGA7Q5QBtsOVBu541ztvQ== +X-Google-Smtp-Source: AGHT+IG91cPbn/sh7aeKkqSSsCqhJRi7BPh+QU7qjKE/caoQJAoHTDszls0Q4m2Y0y9c0lYH+9VT7Q== +X-Received: by 2002:a17:902:e80c:b0:204:e4c9:ce91 with SMTP id d9443c01a7336-2054bc9701dmr13034825ad.7.1725116473983; + Sat, 31 Aug 2024 08:01:13 -0700 (PDT) +Return-Path: +Received: from adityas-macbook-air-4.local ([61.2.109.23]) + by smtp.gmail.com with ESMTPSA id d9443c01a7336-20515555783sm41862675ad.257.2024.08.31.08.01.12 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Sat, 31 Aug 2024 08:01:13 -0700 (PDT) +Message-ID: <66d33039.170a0220.4c767.00d4@mx.google.com> +Date: Sat, 31 Aug 2024 08:01:13 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============3943930778566079903==" +MIME-Version: 1.0 +From: zkemail.relayer.test@gmail.com +To: shryas.londhe@gmail.com +Subject: Test Email 3 in Quoted-Printable Encoding + +--===============3943930778566079903== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 + + + + +

Hello!

+

This is a test email with a basic HTML body.

+
Send 1 ETH to bob@example.com
=20 +

Thank you!

+ + + =20 +--===============3943930778566079903==-- diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test4.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test4.eml new file mode 100644 index 00000000..cc162d4b --- /dev/null +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test4.eml @@ -0,0 +1,100 @@ +Delivered-To: shryas.londhe@gmail.com +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1027523pzb; + Sat, 31 Aug 2024 08:01:37 -0700 (PDT) +X-Received: by 2002:a05:6a00:3e21:b0:714:241d:a323 with SMTP id d2e1a72fcca58-717457cf069mr979778b3a.17.1725116497469; + Sat, 31 Aug 2024 08:01:37 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725116497; cv=none; + d=google.com; s=arc-20160816; + b=FIcZi383UosnmduFlJ1h6WRuV1m17eX2DY6D1NbH+QuL47vKJgzY+X8Y9YcuPsIO/P + Rc+Nf2u1kArY/HweZoT2azC/2e1uO0zDgzbPbRhQ+z8oO6Y6C6PPr7ZS8VDUJlFSUe29 + r3lUNitif3q/nHb+6cNbpxCga490akj+5PNv8/6txPeXSOUDAeyXWlQEwsdk7uC9Ez+T + mUNgq9gce1mOwY2fYBGsr5le0wKYmpbgnd5IzQwewwKNScXMDh8zfEGyq63M1578dk5Y + R2uKHHcgwO770e1HRNUkEmaB2+01CRcGLw1ngtdWDmNOyCf5u1qziKromSIlltx0hjZK + 7AOA== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=cx+lPIDfMFbPgh6ma3gwV4O5UiDqmgfLdsVAFWGAjbw=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + b=Uhyxl91YQ1DrdApUYvXIEUZ4SIIHUGnnMB58KsYvyaHlp17i6pu/D1ahwYAll9kB9e + q9dvB6bnA9cOzpFhd9bBsRAP649tqGcLN14Zc4Or+vyWGl4GmoPVNBzSMyxkVLLK3+DX + 8Vkr1cMDQtn6OHLUJc+SO29i1mOEmCi57WlRod0Rd/rW0IXQfKRULUMqab+rqJWePEmC + 0xdxDxDXdDUIoBVJEq/Yb9S7tbEFMrR4V6YPjbYvpaBJdiOHG9T/Agr95E3XMWiURui/ + vTQaO/CziqnUydZ5bdddHUcrSr1620YxIFTILJaTSknXkC74xdLwLM7MmRYar2GJJOwb + 4cKw==; + dara=google.com +ARC-Authentication-Results: i=1; mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=m0vgjaLd; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +Return-Path: +Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) + by mx.google.com with SMTPS id d2e1a72fcca58-715e5583723sor3589656b3a.3.2024.08.31.08.01.37 + for + (Google Transport Security); + Sat, 31 Aug 2024 08:01:37 -0700 (PDT) +Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; +Authentication-Results: mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=m0vgjaLd; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20230601; t=1725116497; x=1725721297; dara=google.com; + h=subject:to:from:mime-version:date:message-id:from:to:cc:subject + :date:message-id:reply-to; + bh=cx+lPIDfMFbPgh6ma3gwV4O5UiDqmgfLdsVAFWGAjbw=; + b=m0vgjaLdGuVPmwWeBzfAO97WvFrQzzm/P17WCDVTkXlh8ck+/x4UoFSe049kYyRk3d + qGaPBcWyQoe1YukQMXC1lQytrMN4cdfSN3lJLOMpkcaGCMwHDGmn6g0cfJJuoUja0ruh + uZZu3UyRE6jwgvIqutTNRoEgiSNzGBP2L3qO2f0MccKkOhYr5+6qMREMx1o65qeOttrs + k+B2b7OMgMZxu+yM/WwDoNvKgl5RKcUBpDE4cRakk/dwB6JGCLJ10Sm8c+oNYEkQ8sm0 + VyheU0IX1MhoAbrnS45cbmQdv3XZwgx7zoXl6+bqLZ6eWnZrVtAlXFlTNyWJNYn1Ax9T + 9lMA== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20230601; t=1725116497; x=1725721297; + h=subject:to:from:mime-version:date:message-id:x-gm-message-state + :from:to:cc:subject:date:message-id:reply-to; + bh=cx+lPIDfMFbPgh6ma3gwV4O5UiDqmgfLdsVAFWGAjbw=; + b=Ed0FLIR36RYdPMZwa+lNHBcWRS1ZiFa1FBvAN8bQTdcMG6eUQqMf+u3HPrPF6XmB3/ + tPk3uscZKp9QeXCRkbkKYFFaWc+IZWe0fEX7cm1rqc/eFh/kwmrB1REqO771CQpxR62i + CEz29YCdDz24sIekWiRDiGgDJH16mVmoidfWewm0xJ2j39mLggbMuumJYPv64mWm3ZG7 + JiQxNe7t1YF0530b3f5BWfIDgd+Sq4OcBBgWwqS86ocQnlzaKU4gk0yIFjHHy0CjqZVy + Ua3CjHlBYTLEsMltirjNEldhJPToPjqvg9M77EOMSceFrN230zTRLYJUTwwFg8Lq4Siz + odRA== +X-Gm-Message-State: AOJu0YxX69por4T412383ihtwEn5StiioDZh9IOQqAolfuAcwfouZYx/ + sBlGwMbXuQiT5g9GcJA6lSrmJtDT4O80eIWwhYnwom2U9KMsY+vSZMst/A== +X-Google-Smtp-Source: AGHT+IEgIoqLr/I88jnrRWmjTHHted5y53epFmRNzvfCMpV9pGmrOJmgKQhhDeHH3FU42AGGzBcUtA== +X-Received: by 2002:a05:6a00:929a:b0:710:7fd2:c91 with SMTP id d2e1a72fcca58-717458a8022mr811606b3a.26.1725116496362; + Sat, 31 Aug 2024 08:01:36 -0700 (PDT) +Return-Path: +Received: from adityas-macbook-air-4.local ([61.2.109.23]) + by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e56a937csm4334940b3a.108.2024.08.31.08.01.35 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Sat, 31 Aug 2024 08:01:35 -0700 (PDT) +Message-ID: <66d3304f.a70a0220.10c1c2.0e45@mx.google.com> +Date: Sat, 31 Aug 2024 08:01:35 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============2415799932888154602==" +MIME-Version: 1.0 +From: zkemail.relayer.test@gmail.com +To: shryas.londhe@gmail.com +Subject: Test Email 4 in Quoted-Printable Encoding + +--===============2415799932888154602== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 + + + + +

Hello!

+

This is a test email with a basic HTML body.

+
Send 0.12 ETH to alice@gmail.com code 01eb9b20= +4cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76
=20 +

Thank you!

+ + + =20 +--===============2415799932888154602==-- diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test5.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test5.eml new file mode 100644 index 00000000..9d1eb086 --- /dev/null +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test5.eml @@ -0,0 +1,101 @@ +Delivered-To: shryas.londhe@gmail.com +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1027867pzb; + Sat, 31 Aug 2024 08:02:01 -0700 (PDT) +X-Received: by 2002:a17:903:238e:b0:201:d659:4c29 with SMTP id d9443c01a7336-2050c237657mr98175825ad.21.1725116521203; + Sat, 31 Aug 2024 08:02:01 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725116521; cv=none; + d=google.com; s=arc-20160816; + b=NCzofuwsCmnXm9oyYtPrvZhDOKnt4yj2vpjIpzowzLeTpAXDdK1deuH/Bysy6HOqPs + QLvW7HVe0kgYkXqmu1KDD7KzgbyKtxJRDp0G6lqTknA9iL4rBhMe4eDoCbZa0YAtCVxy + IczQ6nRdFv8ouHZXaHlQ/96/eHkjyM6nobVsEHbULOyxt6c8yxyRWnmvx68QNYzVcL6s + Cb/xUA/bDE96FhAxUiXOvxwkSRonDnnV6yr689D2wB1beJFIRWAlKBDtj3EmEWVYck34 + S1Yx3+1LthXJS+TekyGhtcIODcJ590FC7iNC/q0ShE93R/eU/k5Q46leHmJiN0cyaSJL + C5Og== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=An/Et77KDu2to3R2EwS+Di8vntf5/afFG8cgRpOoYHs=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + b=C++6GRrT2GUolqrpGq7lPaWTJG3REO22S5TWpjz+H9HSNnOSAUfVpj6bFMhk1+eh9V + x3W2Tn2M2xZU2awcYTArSFGFvrzIP2j1onRkYPm2qn1nsJE8Gbn+/EA7ammcRk6ivKRo + nVWT+zGHhahT41zrMxy3JmkESD42MfVtoC5PKE0fDpW7TbwLSeBe543zL/3c2Pw9bKAq + Rygfj8kDfYxh9o0kQvUAx2N8oNWTWAGsi7AF5/lahE5ICOlLZ9anjhh5XVaHKp3oeR61 + XSuwbbpsB9Q2Uax6AbUhLtpgiWmBOucOx5kOIIL3pkww8+1835t9UMOkNFYSB5l1To0G + 56Yg==; + dara=google.com +ARC-Authentication-Results: i=1; mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b="gQOZj+/C"; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +Return-Path: +Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) + by mx.google.com with SMTPS id d9443c01a7336-205155824casor39474895ad.13.2024.08.31.08.02.01 + for + (Google Transport Security); + Sat, 31 Aug 2024 08:02:01 -0700 (PDT) +Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; +Authentication-Results: mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b="gQOZj+/C"; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20230601; t=1725116520; x=1725721320; dara=google.com; + h=subject:to:from:mime-version:date:message-id:from:to:cc:subject + :date:message-id:reply-to; + bh=An/Et77KDu2to3R2EwS+Di8vntf5/afFG8cgRpOoYHs=; + b=gQOZj+/CCEIREVb1EfB6Tka5ou0yJGjgOU+FKC2PYhFidM60iH7E7oTs8vhAmhYsLN + qkeDmk1agjc7N7ZNZX6Yv5/oxtv2B5Ka7kQEQDSfYAax7D/Cr87fLQ0vF0NGZmSghVyJ + s5Y0oPKV5hW+O9fJ2k3RPW/1aAKvBCJYl+JNTvjerGYh7HAFC+/7XzOLyG/cp8M5wOmB + HSTMaCARx1WiAfoKZtj+Q0BUOX9tznejh9aqixM8OzPs80KaWXZWtLXks7ezsYh83q9T + dHvwgShKeMf5yb7i0b2wwboHyVUiiEXDsEnBrEYFON1ZEf/JIuA5YQj8C2kUkOMw465X + utEw== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20230601; t=1725116520; x=1725721320; + h=subject:to:from:mime-version:date:message-id:x-gm-message-state + :from:to:cc:subject:date:message-id:reply-to; + bh=An/Et77KDu2to3R2EwS+Di8vntf5/afFG8cgRpOoYHs=; + b=ch2gg7gz464o7OuMo8B4ffVFWaK+gatg3MmGyxsVlqf4oqGzFj1oof3JK04eAsZgch + vvUp9ddDaO7a4tUVDlNt4WE1q4rYnfjH+QVHZgfH8h6iKIfmMKiG9+WHoZifvd3cztt8 + wgbEX0VtOBRvcgBteteufXmsLStLYWbuaHc1/fTrnHNPLWjLCtS+0asRHg7caPwsB37A + 5WUohNNvCmVeeM3FpcpPjWF3OiVIzpaHl86Y/KQ7aE50i1R0yZA40RXYrEsokt3kXMmz + bH3SNamaa+QlS0dmxhW3V80V5uPt00tMQ/OQDMXqMCPLq0zemmlMYXiUPwhPOILGumOS + EvQA== +X-Gm-Message-State: AOJu0YyrRyyu6hLa9WzV5B3nq9bCIiWJJueLenb2VQvbc/t/PKx7X4md + 97B7AocL28ILGZmfhrRpaWouehWaka0wk14ET+9NCsJy9RuhV+wu0CHduw== +X-Google-Smtp-Source: AGHT+IEeY0b06fIH/H7xLp4xtuYAN1AQ1VggjaGoBtE/UNMdslPmg0nzyWpfyzk+jl8JOv/B5fyzfA== +X-Received: by 2002:a17:902:ccc7:b0:202:11ab:ccf4 with SMTP id d9443c01a7336-2050c215845mr99384835ad.6.1725116520165; + Sat, 31 Aug 2024 08:02:00 -0700 (PDT) +Return-Path: +Received: from adityas-macbook-air-4.local ([61.2.109.23]) + by smtp.gmail.com with ESMTPSA id d9443c01a7336-2055553958fsm5837015ad.99.2024.08.31.08.01.58 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Sat, 31 Aug 2024 08:01:59 -0700 (PDT) +Message-ID: <66d33067.170a0220.1fb130.1212@mx.google.com> +Date: Sat, 31 Aug 2024 08:01:59 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============0248742556298637677==" +MIME-Version: 1.0 +From: zkemail.relayer.test@gmail.com +To: shryas.londhe@gmail.com +Subject: Test Email 5 in Quoted-Printable Encoding + +--===============0248742556298637677== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 + + + + +

Hello!

+

This is a test email with a basic HTML body.

+
Accept guardian request for 0x04884491560f3834= +2C56E26BDD0fEAbb68E2d2FC code 01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc= +07763475c135d575b76
=20 +

Thank you!

+ + + =20 +--===============0248742556298637677==-- diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test6.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test6.eml new file mode 100644 index 00000000..8404b7c4 --- /dev/null +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test6.eml @@ -0,0 +1,99 @@ +Delivered-To: shryas.londhe@gmail.com +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1028184pzb; + Sat, 31 Aug 2024 08:02:24 -0700 (PDT) +X-Received: by 2002:a05:6a00:1905:b0:714:157a:bfc7 with SMTP id d2e1a72fcca58-7173c30b357mr3072592b3a.15.1725116543787; + Sat, 31 Aug 2024 08:02:23 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725116543; cv=none; + d=google.com; s=arc-20160816; + b=qMCQfZBCrlje56JMBZ3rLuog5FSYYR7Kd4wuJ+kkY2hbLRAPX/LyZAfYfg4llqt9fE + GDOJ4iK+NKE40sf01w9EJlc0aZcSLUlJKX0ZZU34B5F9PUpJYWrvWalKjbULtR8lS9FP + ZNPffY1+2u8TrSgO4tmquOLdEYA6tVjxZrD6b1eaMhcxQ2Dpd1k+nlojJlLDi0+M02uS + 40QkRUyc5qx0TktNW/gbHBD+Rp5OIT6oJWJDF4FXFoip14FwKO6uQYuVp/gobYJraZJP + Ed9RSB4HhtlLz8Mc9JDIDCe8U0mSP9XZSxlr9m18PglpGq/A4SicRYasI0QS8o33WB4K + PEEw== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=xrwyIK39xwGIlfL9sJe2wyzoF2WX94dnDVaqyxAeclY=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + b=YRHQC400XEFnlOsHn4TfFeTf7mok7PRBRZb7SpdzDWmS6zVZGgNYILujz//kGZHoZ5 + a+ogJXc6ba4lYZCKg+OG7weo7a99dRKjH2o4kvQZ7KLaETwhKTCeStoYac1DZLa4FPRj + 60kpEsstdc9JbTac3jNuUw7v3hMLktY+k/QMW8sO2CcrJv6Yu5LtMA5b4UUnn8skWOiu + J3Yj2P/5+GZab1fj8puFFhnuealZtGL31VDOE9JW0iI5v4dWrbEQphUynvuKf65zIBAG + TK4RVKRIeUTmkHoaYWiFXpMJn9r5rmvYMsQFJSxyXJCq27erge+PVlrb+ls5PMERMVw8 + izDw==; + dara=google.com +ARC-Authentication-Results: i=1; mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=ex7EFYZU; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +Return-Path: +Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) + by mx.google.com with SMTPS id d2e1a72fcca58-715e557b837sor3274925b3a.2.2024.08.31.08.02.23 + for + (Google Transport Security); + Sat, 31 Aug 2024 08:02:23 -0700 (PDT) +Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; +Authentication-Results: mx.google.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=ex7EFYZU; + spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; + dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; + dara=pass header.i=@gmail.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20230601; t=1725116543; x=1725721343; dara=google.com; + h=subject:to:from:mime-version:date:message-id:from:to:cc:subject + :date:message-id:reply-to; + bh=xrwyIK39xwGIlfL9sJe2wyzoF2WX94dnDVaqyxAeclY=; + b=ex7EFYZU0eLYsFVsMAfZPn9gsCgK9gb52lOnfZGSUxoJ5sZwSBF/8t20rvdlhr5GeW + RE6mcsHYcIpuVwdRirATwxa6feU0fbbACiDT/N5azWxDV0E01o+uVSkfeLJb0Q8/OMuT + o6AcxqqqGwss5fRQ5XDcxYqRlCZspVUkEWIbNiv5LBRWZFZe2LaVOS1UI+5MYAvzio4e + 4jNv3+DOf9trLXzjGBXp0dre+GlPCxaTS7O1q7VlabHMXqfBX/LBzJ6EFLkbIrgDvXbr + 7sCKA+c/bCcPkSJtQK22nF8QQ3f+Th6KPcsYPoGN+Uw6aj65aSjBnJMqiMZvqXGJIjFf + 9Qrw== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20230601; t=1725116543; x=1725721343; + h=subject:to:from:mime-version:date:message-id:x-gm-message-state + :from:to:cc:subject:date:message-id:reply-to; + bh=xrwyIK39xwGIlfL9sJe2wyzoF2WX94dnDVaqyxAeclY=; + b=GHGerBY+57YeTjKGJCEvee0/ep14vGs1+F5J8huA13+BbxEJyLbSWMocdaz5Po7d/P + ci1qua76dZzXS15C+n0Uvne2HKxn6eHuevha3wd5Xe9ZUBXfzXeSgusLCbTV85wrofa1 + 3XW2hSLrGrz9+0DqG90GCTvOknBYHin5lWZWFwzr60uvvxiD+wvDtB3+WWysMsy2REaT + +CpE1JY/pozeCRFYTBC+dmsiq07PnhS5kWe5ks4f3rlMpmYfAxIhyy3JcuePqJa1nETM + 4KsrboipkZaMVXXgxGJaT7953aNswKgkkLjS7ZxuOXX5AkqkbtMFp9D2pdBZ76Rxz0+y + YPrw== +X-Gm-Message-State: AOJu0YyGs7a+Pq6exaResD00gS9K+KBfa7V0C8KwaHDcs5CJnUPqqo5a + J0Z0apWMAVGfGffSsBxCh/fnxVbnQiZdNDE3To6EE+gNumVVi/FSPC/Tfg== +X-Google-Smtp-Source: AGHT+IHmQs/JDxreX6HtvZM6tfTLSL0feBCEfBAoun1tjKevSZJz6vb8YAUNoocEW0dq24K7mnxDsg== +X-Received: by 2002:a05:6a00:178d:b0:714:29d7:94c0 with SMTP id d2e1a72fcca58-7173c1f74a8mr2750770b3a.11.1725116542579; + Sat, 31 Aug 2024 08:02:22 -0700 (PDT) +Return-Path: +Received: from adityas-macbook-air-4.local ([61.2.109.23]) + by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a5b93sm4345464b3a.76.2024.08.31.08.02.21 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Sat, 31 Aug 2024 08:02:22 -0700 (PDT) +Message-ID: <66d3307e.050a0220.1f5494.0f92@mx.google.com> +Date: Sat, 31 Aug 2024 08:02:22 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============2124554468036970868==" +MIME-Version: 1.0 +From: zkemail.relayer.test@gmail.com +To: shryas.londhe@gmail.com +Subject: Test Email 6 in Quoted-Printable Encoding + +--===============2124554468036970868== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 + + + + +

Hello!

+

This is a test email with a basic HTML body.

+
from:adversary@test.com
=20 +

Thank you!

+ + + =20 +--===============2124554468036970868==-- diff --git a/yarn.lock b/yarn.lock index bbe4d5e1..fc8edd32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.2.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -12,101 +12,99 @@ "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" - integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2", "@babel/compat-data@^7.25.4": + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.22.5", "@babel/core@^7.23.9": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" - integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helpers" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.7", "@babel/generator@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" - integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== +"@babel/generator@^7.25.0", "@babel/generator@^7.25.4", "@babel/generator@^7.7.2": + version "7.25.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz#b31cf05b3fe8c32d206b6dad03bb0aacbde73450" + integrity sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w== dependencies: - "@babel/types" "^7.24.7" + "@babel/types" "^7.25.4" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== dependencies: "@babel/types" "^7.24.7" "@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== dependencies: "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" - integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - browserslist "^4.22.2" + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b" - integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg== +"@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.0", "@babel/helper-create-class-features-plugin@^7.25.4": + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" + integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-replace-supers" "^7.25.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/traverse" "^7.25.4" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" - integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0", "@babel/helper-create-regexp-features-plugin@^7.25.2": + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" + integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": +"@babel/helper-define-polyfill-provider@^0.6.2": version "0.6.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== dependencies: "@babel/helper-compilation-targets" "^7.22.6" @@ -115,88 +113,65 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-hoist-variables@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-member-expression-to-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f" - integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== +"@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" "@babel/helper-module-imports@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== dependencies: "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-module-transforms@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" - integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== +"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" "@babel/helper-module-imports" "^7.24.7" "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" "@babel/helper-optimise-call-expression@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== dependencies: "@babel/types" "^7.24.7" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" - integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.8" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== -"@babel/helper-remap-async-to-generator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" - integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== +"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" + integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-wrap-function" "^7.24.7" + "@babel/helper-wrap-function" "^7.25.0" + "@babel/traverse" "^7.25.0" -"@babel/helper-replace-supers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765" - integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== +"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/traverse" "^7.25.0" "@babel/helper-simple-access@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== dependencies: "@babel/traverse" "^7.24.7" @@ -204,55 +179,47 @@ "@babel/helper-skip-transparent-expression-wrappers@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== dependencies: "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-split-export-declaration@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" - integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== -"@babel/helper-validator-option@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" - integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== +"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== -"@babel/helper-wrap-function@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" - integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== +"@babel/helper-wrap-function@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" + integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== dependencies: - "@babel/helper-function-name" "^7.24.7" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/types" "^7.25.0" -"@babel/helpers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" - integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== +"@babel/helpers@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" + integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.0" "@babel/highlight@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== dependencies: "@babel/helper-validator-identifier" "^7.24.7" @@ -260,191 +227,200 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" - integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.4": + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz#af4f2df7d02440286b7de57b1c21acfb2a6f257a" + integrity sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA== + dependencies: + "@babel/types" "^7.25.4" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" - integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": + version "7.25.3" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" + integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.3" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107" - integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" + integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" + integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec" - integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" + integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.0" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-import-assertions@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-import-attributes@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.24.7", "@babel/plugin-syntax-jsx@^7.7.2": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.24.7", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" - integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" + integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -452,24 +428,24 @@ "@babel/plugin-transform-arrow-functions@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-async-generator-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd" - integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g== +"@babel/plugin-transform-async-generator-functions@^7.25.4": + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz#2afd4e639e2d055776c9f091b6c0c180ed8cf083" + integrity sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-remap-async-to-generator" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-remap-async-to-generator" "^7.25.0" "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/traverse" "^7.25.4" "@babel/plugin-transform-async-to-generator@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== dependencies: "@babel/helper-module-imports" "^7.24.7" @@ -478,67 +454,65 @@ "@babel/plugin-transform-block-scoped-functions@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoping@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02" - integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== +"@babel/plugin-transform-block-scoping@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" + integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-class-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" - integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== +"@babel/plugin-transform-class-properties@^7.25.4": + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" + integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-class-static-block@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf" - integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw== +"@babel/plugin-transform-classes@^7.25.4": + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz#d29dbb6a72d79f359952ad0b66d88518d65ef89a" + integrity sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/traverse" "^7.25.4" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/template" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e" - integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw== +"@babel/plugin-transform-destructuring@^7.24.8": + version "7.24.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-dotall-regex@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.24.7" @@ -546,14 +520,22 @@ "@babel/plugin-transform-duplicate-keys@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" + integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-transform-dynamic-import@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -561,7 +543,7 @@ "@babel/plugin-transform-exponentiation-operator@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" @@ -569,7 +551,7 @@ "@babel/plugin-transform-export-namespace-from@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -577,39 +559,39 @@ "@babel/plugin-transform-for-of@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6" - integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== +"@babel/plugin-transform-function-name@^7.25.1": + version "7.25.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" + integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.1" "@babel/plugin-transform-json-strings@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c" - integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== +"@babel/plugin-transform-literals@^7.25.2": + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" + integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-logical-assignment-operators@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -617,41 +599,41 @@ "@babel/plugin-transform-member-expression-literals@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-modules-amd@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== dependencies: "@babel/helper-module-transforms" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab" - integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ== +"@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8": + version "7.24.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" + integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-modules-systemjs@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" - integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== +"@babel/plugin-transform-modules-systemjs@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" + integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== dependencies: - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.0" "@babel/plugin-transform-modules-umd@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== dependencies: "@babel/helper-module-transforms" "^7.24.7" @@ -659,7 +641,7 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.24.7" @@ -667,14 +649,14 @@ "@babel/plugin-transform-new-target@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -682,7 +664,7 @@ "@babel/plugin-transform-numeric-separator@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -690,7 +672,7 @@ "@babel/plugin-transform-object-rest-spread@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== dependencies: "@babel/helper-compilation-targets" "^7.24.7" @@ -700,7 +682,7 @@ "@babel/plugin-transform-object-super@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -708,39 +690,39 @@ "@babel/plugin-transform-optional-catch-binding@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454" - integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ== +"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": + version "7.24.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-transform-parameters@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-methods@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" - integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== +"@babel/plugin-transform-private-methods@^7.25.4": + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz#9bbefbe3649f470d681997e0b64a4b254d877242" + integrity sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-private-property-in-object@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" @@ -750,39 +732,39 @@ "@babel/plugin-transform-property-literals@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-react-display-name@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-react-jsx-development@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== dependencies: "@babel/plugin-transform-react-jsx" "^7.24.7" "@babel/plugin-transform-react-jsx@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz#17cd06b75a9f0e2bd076503400e7c4b99beedac4" - integrity sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA== + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" + integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-jsx" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/types" "^7.25.2" "@babel/plugin-transform-react-pure-annotations@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" @@ -790,7 +772,7 @@ "@babel/plugin-transform-regenerator@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -798,21 +780,21 @@ "@babel/plugin-transform-reserved-words@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-shorthand-properties@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-spread@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -820,45 +802,46 @@ "@babel/plugin-transform-sticky-regex@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-template-literals@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0" - integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg== +"@babel/plugin-transform-typeof-symbol@^7.24.8": + version "7.24.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" + integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-typescript@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz#b006b3e0094bf0813d505e0c5485679eeaf4a881" - integrity sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw== + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add" + integrity sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-typescript" "^7.24.7" "@babel/plugin-transform-unicode-escapes@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-unicode-property-regex@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.24.7" @@ -866,33 +849,34 @@ "@babel/plugin-transform-unicode-regex@^7.24.7": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-sets-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" - integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== +"@babel/plugin-transform-unicode-sets-regex@^7.25.4": + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz#be664c2a0697ffacd3423595d5edef6049e8946c" + integrity sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/preset-env@^7.22.2", "@babel/preset-env@^7.22.20": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37" - integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ== - dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz#be23043d43a34a2721cd0f676c7ba6f1481f6af6" + integrity sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw== + dependencies: + "@babel/compat-data" "^7.25.4" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" @@ -913,29 +897,30 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.24.7" - "@babel/plugin-transform-async-generator-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.25.4" "@babel/plugin-transform-async-to-generator" "^7.24.7" "@babel/plugin-transform-block-scoped-functions" "^7.24.7" - "@babel/plugin-transform-block-scoping" "^7.24.7" - "@babel/plugin-transform-class-properties" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.25.0" + "@babel/plugin-transform-class-properties" "^7.25.4" "@babel/plugin-transform-class-static-block" "^7.24.7" - "@babel/plugin-transform-classes" "^7.24.7" + "@babel/plugin-transform-classes" "^7.25.4" "@babel/plugin-transform-computed-properties" "^7.24.7" - "@babel/plugin-transform-destructuring" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.8" "@babel/plugin-transform-dotall-regex" "^7.24.7" "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0" "@babel/plugin-transform-dynamic-import" "^7.24.7" "@babel/plugin-transform-exponentiation-operator" "^7.24.7" "@babel/plugin-transform-export-namespace-from" "^7.24.7" "@babel/plugin-transform-for-of" "^7.24.7" - "@babel/plugin-transform-function-name" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.25.1" "@babel/plugin-transform-json-strings" "^7.24.7" - "@babel/plugin-transform-literals" "^7.24.7" + "@babel/plugin-transform-literals" "^7.25.2" "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" "@babel/plugin-transform-member-expression-literals" "^7.24.7" "@babel/plugin-transform-modules-amd" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.7" - "@babel/plugin-transform-modules-systemjs" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.8" + "@babel/plugin-transform-modules-systemjs" "^7.25.0" "@babel/plugin-transform-modules-umd" "^7.24.7" "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" "@babel/plugin-transform-new-target" "^7.24.7" @@ -944,9 +929,9 @@ "@babel/plugin-transform-object-rest-spread" "^7.24.7" "@babel/plugin-transform-object-super" "^7.24.7" "@babel/plugin-transform-optional-catch-binding" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.8" "@babel/plugin-transform-parameters" "^7.24.7" - "@babel/plugin-transform-private-methods" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.25.4" "@babel/plugin-transform-private-property-in-object" "^7.24.7" "@babel/plugin-transform-property-literals" "^7.24.7" "@babel/plugin-transform-regenerator" "^7.24.7" @@ -955,21 +940,21 @@ "@babel/plugin-transform-spread" "^7.24.7" "@babel/plugin-transform-sticky-regex" "^7.24.7" "@babel/plugin-transform-template-literals" "^7.24.7" - "@babel/plugin-transform-typeof-symbol" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.8" "@babel/plugin-transform-unicode-escapes" "^7.24.7" "@babel/plugin-transform-unicode-property-regex" "^7.24.7" "@babel/plugin-transform-unicode-regex" "^7.24.7" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.4" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.31.0" + core-js-compat "^3.37.1" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -978,7 +963,7 @@ "@babel/preset-react@^7.22.0": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -990,7 +975,7 @@ "@babel/preset-typescript@^7.21.5", "@babel/preset-typescript@^7.23.0": version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -1001,58 +986,55 @@ "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.8.4": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" - integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz#6ef37d678428306e7d75f054d5b1bdb8cf8aa8ee" + integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.24.7", "@babel/template@^7.3.3": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" - integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== +"@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" -"@babel/traverse@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" - integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== +"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.4": + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz#648678046990f2957407e3086e97044f13c3e18e" + integrity sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/generator" "^7.25.4" + "@babel/parser" "^7.25.4" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.4" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" - integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.25.4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz#6bcb46c72fdf1012a209d016c07f769e10adcb5f" + integrity sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ== dependencies: - "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-string-parser" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: "@ethersproject/address" "^5.7.0" @@ -1067,7 +1049,7 @@ "@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -1080,7 +1062,7 @@ "@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -1091,7 +1073,7 @@ "@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -1102,14 +1084,14 @@ "@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1117,7 +1099,7 @@ "@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1126,21 +1108,21 @@ "@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/contracts@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== dependencies: "@ethersproject/abi" "^5.7.0" @@ -1156,7 +1138,7 @@ "@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -1171,7 +1153,7 @@ "@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -1189,7 +1171,7 @@ "@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -1208,7 +1190,7 @@ "@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1216,19 +1198,19 @@ "@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== "@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1236,14 +1218,14 @@ "@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/providers@5.7.2": version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -1269,7 +1251,7 @@ "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1277,7 +1259,7 @@ "@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1285,7 +1267,7 @@ "@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1294,7 +1276,7 @@ "@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1306,7 +1288,7 @@ "@ethersproject/solidity@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -1318,7 +1300,7 @@ "@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1327,7 +1309,7 @@ "@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== dependencies: "@ethersproject/address" "^5.7.0" @@ -1342,7 +1324,7 @@ "@ethersproject/units@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -1351,7 +1333,7 @@ "@ethersproject/wallet@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -1372,7 +1354,7 @@ "@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" @@ -1383,7 +1365,7 @@ "@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1394,12 +1376,12 @@ "@iden3/bigarray@0.0.2": version "0.0.2" - resolved "https://registry.yarnpkg.com/@iden3/bigarray/-/bigarray-0.0.2.tgz#6fc4ba5be18daf8a26ee393f2fb62b80d98c05e9" + resolved "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz#6fc4ba5be18daf8a26ee393f2fb62b80d98c05e9" integrity sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g== "@iden3/binfileutils@0.0.11": version "0.0.11" - resolved "https://registry.yarnpkg.com/@iden3/binfileutils/-/binfileutils-0.0.11.tgz#9ffbbcc1279f2b2182bb6dcff4eee8a5b2167911" + resolved "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.11.tgz#9ffbbcc1279f2b2182bb6dcff4eee8a5b2167911" integrity sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA== dependencies: fastfile "0.0.20" @@ -1407,7 +1389,7 @@ "@iden3/binfileutils@0.0.12": version "0.0.12" - resolved "https://registry.yarnpkg.com/@iden3/binfileutils/-/binfileutils-0.0.12.tgz#3772552f57551814ff606fa68ea1e0ef52795ce3" + resolved "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.12.tgz#3772552f57551814ff606fa68ea1e0ef52795ce3" integrity sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ== dependencies: fastfile "0.0.20" @@ -1415,7 +1397,7 @@ "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -1426,12 +1408,12 @@ "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: "@jest/types" "^29.6.3" @@ -1443,7 +1425,7 @@ "@jest/core@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: "@jest/console" "^29.7.0" @@ -1477,7 +1459,7 @@ "@jest/environment@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: "@jest/fake-timers" "^29.7.0" @@ -1487,14 +1469,14 @@ "@jest/expect-utils@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: jest-get-type "^29.6.3" "@jest/expect@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: expect "^29.7.0" @@ -1502,7 +1484,7 @@ "@jest/fake-timers@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: "@jest/types" "^29.6.3" @@ -1514,7 +1496,7 @@ "@jest/globals@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: "@jest/environment" "^29.7.0" @@ -1524,7 +1506,7 @@ "@jest/reporters@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" @@ -1554,14 +1536,14 @@ "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/source-map@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: "@jridgewell/trace-mapping" "^0.3.18" @@ -1570,7 +1552,7 @@ "@jest/test-result@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: "@jest/console" "^29.7.0" @@ -1580,7 +1562,7 @@ "@jest/test-sequencer@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: "@jest/test-result" "^29.7.0" @@ -1590,7 +1572,7 @@ "@jest/transform@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" @@ -1611,7 +1593,7 @@ "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -1623,7 +1605,7 @@ "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -1632,22 +1614,22 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.0" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -1655,7 +1637,7 @@ "@mapbox/node-pre-gyp@^1.0": version "1.0.11" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== dependencies: detect-libc "^2.0.0" @@ -1670,12 +1652,12 @@ "@matterlabs/zksync-contracts@^0.6.1": version "0.6.1" - resolved "https://registry.yarnpkg.com/@matterlabs/zksync-contracts/-/zksync-contracts-0.6.1.tgz#39f061959d5890fd0043a2f1ae710f764b172230" + resolved "https://registry.npmjs.org/@matterlabs/zksync-contracts/-/zksync-contracts-0.6.1.tgz#39f061959d5890fd0043a2f1ae710f764b172230" integrity sha512-+hucLw4DhGmTmQlXOTEtpboYCaOm/X2VJcWmnW4abNcOgQXEHX+mTxQrxEfPjIZT0ZE6z5FTUrOK9+RgUZwBMQ== "@octokit/rest@^15.9.5": version "15.18.3" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.3.tgz#ff4ecbb784ca286c40cc1d568abceda6d99b36fc" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-15.18.3.tgz#ff4ecbb784ca286c40cc1d568abceda6d99b36fc" integrity sha512-oHABAvvC83tPIuvUfWRaw9eLThFrCxBgywl+KvEwfTFjoCrMOfEaMh0r39+Ub/EEbV345GJiMzN+zPZ4kqOvbA== dependencies: before-after-hook "^1.1.0" @@ -1690,48 +1672,48 @@ "@openzeppelin/contracts-upgradeable@^5.0.0": version "5.0.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.2.tgz#3e5321a2ecdd0b206064356798c21225b6ec7105" + resolved "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.2.tgz#3e5321a2ecdd0b206064356798c21225b6ec7105" integrity sha512-0MmkHSHiW2NRFiT9/r5Lu4eJq5UJ4/tzlOgYXNAIj/ONkQTVnz22pLxDvp4C4uZ9he7ZFvGn3Driptn1/iU7tQ== "@openzeppelin/contracts@^5.0.0": version "5.0.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.2.tgz#b1d03075e49290d06570b2fd42154d76c2a5d210" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.2.tgz#b1d03075e49290d06570b2fd42154d76c2a5d210" integrity sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA== "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" "@solidity-parser/parser@^0.16.0": version "0.16.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== dependencies: antlr4ts "^0.5.0-alpha.4" -"@solidity-parser/parser@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.17.0.tgz#52a2fcc97ff609f72011014e4c5b485ec52243ef" - integrity sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw== +"@solidity-parser/parser@^0.18.0": + version "0.18.0" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" + integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== "@types/babel__core@^7.1.14": version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" @@ -1742,14 +1724,14 @@ "@types/babel__generator@*": version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" @@ -1757,98 +1739,89 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" "@types/graceful-fs@^4.1.3": version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^29.5.4": version "29.5.12" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== dependencies: expect "^29.0.0" pretty-format "^29.0.0" "@types/node@*": - version "20.14.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.6.tgz#f3c19ffc98c2220e18de259bb172dd4d892a6075" - integrity sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw== + version "22.5.1" + resolved "https://registry.npmjs.org/@types/node/-/node-22.5.1.tgz#de01dce265f6b99ed32b295962045d10b5b99560" + integrity sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw== dependencies: - undici-types "~5.26.4" + undici-types "~6.19.2" "@types/stack-utils@^2.0.0": version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/yargs-parser@*": version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + version "17.0.33" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" -"@zk-email/circuits@^6.1.1": - version "6.1.2" - resolved "https://registry.yarnpkg.com/@zk-email/circuits/-/circuits-6.1.2.tgz#bde32294e11723bf5880219c274fb720c95aeb3f" - integrity sha512-pmZsGo2Kz/CC5T4/VUA/ngJpzP2g05WvXj4X4j4/y30mjdz9oocGYLqsMZEl2Fx3rmH4mZXkGhm0sA0C7hAReg== +"@zk-email/circuits@^6.1.5": + version "6.1.5" + resolved "https://registry.npmjs.org/@zk-email/circuits/-/circuits-6.1.5.tgz#53462456638edf97bbc206ead01c302ba11e7850" + integrity sha512-Hx+R7ARIZ1JLJ6Ba3qqkWdGweOS63P2VyldVgZ5z0KZ5PvgAsM1ka8AUWzq1RFZCmgbluY8yiHLzWREbQm9bOQ== dependencies: "@zk-email/zk-regex-circom" "^2.1.0" circomlib "^2.0.5" "@zk-email/contracts@^6.1.2": - version "6.1.2" - resolved "https://registry.yarnpkg.com/@zk-email/contracts/-/contracts-6.1.2.tgz#ce5b21c62103da72cad404724f2eb9649c773d86" - integrity sha512-cakbMmr+ox6nyhNXiJI8ZM0ZuKn3A60KIeiZsr3a1dYn4Rk03PL2MfHMv9ec8ivNnJNy+jDbOAkcTV5PYHoTIQ== + version "6.1.5" + resolved "https://registry.npmjs.org/@zk-email/contracts/-/contracts-6.1.5.tgz#979c2aaa30cdcdb7433ff37d74c396df0cb60107" + integrity sha512-1RW3dpYGBQXjmIlcTGMtYsux7FQoR1MezA0D0pssrNEaCO2CuQd6oAxJLpbCxFQWPbujLKn8PiEVcjP+eiGvVw== dependencies: "@openzeppelin/contracts" "^5.0.0" dotenv "^16.3.1" -"@zk-email/relayer-utils@^0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@zk-email/relayer-utils/-/relayer-utils-0.2.4.tgz#5f452bb2867e1efe8700a19351dbb7796f9a081f" - integrity sha512-T1N4hBL2NI7omerONdgS2HIYydNP0cRSKpyKEMRzWxelgam7HP3TgG7jYbehQn9BlCyL7o4ifNnyH9sQPaC0zA== - dependencies: - "@mapbox/node-pre-gyp" "^1.0" - "@zk-email/relayer-utils" "github:zkemail/relayer-utils" - cargo-cp-artifact "^0.1" - node-pre-gyp-github "https://github.com/ultamatt/node-pre-gyp-github.git" - -"@zk-email/relayer-utils@github:zkemail/relayer-utils": - version "0.2.4" - resolved "https://codeload.github.com/zkemail/relayer-utils/tar.gz/58e72b7d100eb8243a10df72bfe242f13ddcfdb8" +"@zk-email/relayer-utils@^0.2.8": + version "0.2.8" + resolved "https://registry.npmjs.org/@zk-email/relayer-utils/-/relayer-utils-0.2.8.tgz#6451a3587b940888044e72308e5100f7cb5b1747" + integrity sha512-ZQObWnRdi7Gngp3PGuYlZr+6WO95kyaBISMqrSXjMM61kYuKuFingz5FuzynrW75I4dYHVgt+kyEGg1WhjSd1w== dependencies: "@mapbox/node-pre-gyp" "^1.0" cargo-cp-artifact "^0.1" @@ -1856,7 +1829,7 @@ "@zk-email/zk-regex-circom@^2.1.0": version "2.1.0" - resolved "https://registry.yarnpkg.com/@zk-email/zk-regex-circom/-/zk-regex-circom-2.1.0.tgz#cc2f1d93fb130a9f8ac88114d3559a296df97538" + resolved "https://registry.npmjs.org/@zk-email/zk-regex-circom/-/zk-regex-circom-2.1.0.tgz#cc2f1d93fb130a9f8ac88114d3559a296df97538" integrity sha512-Ayq0Hk4m7w1UHPPx2c5bUWLdKUPnuK62AZFOyiIvA7x4NgRyvjxe+S4D5KFH5FIz4PgEnXVxgscSSbe5p/GCvQ== dependencies: commander "^11.0.0" @@ -1864,31 +1837,31 @@ abbrev@1: version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== aes-js@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@4, agent-base@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: es6-promisify "^5.0.0" agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" ajv@^6.12.6: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1897,64 +1870,64 @@ ajv@^6.12.6: uri-js "^4.2.2" ajv@^8.0.1: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" - integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== + version "8.17.1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.4.1" -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.2.1: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== antlr4@^4.11.0: - version "4.13.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1.tgz#1e0a1830a08faeb86217cb2e6c34716004e4253d" - integrity sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA== + version "4.13.2" + resolved "https://registry.npmjs.org/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" + integrity sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg== antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -1962,12 +1935,12 @@ anymatch@^3.0.3, anymatch@~3.1.2: "aproba@^1.0.3 || ^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== are-we-there-yet@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== dependencies: delegates "^1.0.0" @@ -1975,51 +1948,51 @@ are-we-there-yet@^2.0.0: argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== ast-parents@^0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" + resolved "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async@^3.2.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" b4a@^1.0.1: version "1.6.6" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== babel-jest@^29.5.0, babel-jest@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: "@jest/transform" "^29.7.0" @@ -2032,7 +2005,7 @@ babel-jest@^29.5.0, babel-jest@^29.7.0: babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -2043,7 +2016,7 @@ babel-plugin-istanbul@^6.1.1: babel-plugin-jest-hoist@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" @@ -2053,49 +2026,52 @@ babel-plugin-jest-hoist@^29.6.3: babel-plugin-polyfill-corejs2@^0.4.10: version "0.4.11" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: "@babel/compat-data" "^7.22.6" "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.10.4: - version "0.10.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" - integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== +babel-plugin-polyfill-corejs3@^0.10.6: + version "0.10.6" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" - core-js-compat "^3.36.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.2" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^29.5.0, babel-preset-jest@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: babel-plugin-jest-hoist "^29.6.3" @@ -2103,22 +2079,22 @@ babel-preset-jest@^29.5.0, babel-preset-jest@^29.6.3: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bech32@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== before-after-hook@^1.1.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" + resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== bfj@^7.0.2: version "7.1.0" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + resolved "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== dependencies: bluebird "^3.7.2" @@ -2129,12 +2105,12 @@ bfj@^7.0.2: binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== blake-hash@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" + resolved "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w== dependencies: node-addon-api "^3.0.0" @@ -2143,7 +2119,7 @@ blake-hash@^2.0.0: blake2b-wasm@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + resolved "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== dependencies: b4a "^1.0.1" @@ -2151,7 +2127,7 @@ blake2b-wasm@^2.4.0: blake2b@^2.1.3: version "2.1.4" - resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" + resolved "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== dependencies: blake2b-wasm "^2.4.0" @@ -2159,22 +2135,22 @@ blake2b@^2.1.3: bluebird@^3.7.2: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.11.9: version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2182,65 +2158,65 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.3, braces@~3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browser-stdout@1.3.1: +browser-stdout@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" - integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== +browserslist@^4.23.1, browserslist@^4.23.3: + version "4.23.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: - caniuse-lite "^1.0.30001629" - electron-to-chromium "^1.4.796" - node-releases "^2.0.14" - update-browserslist-db "^1.0.16" + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" -bs-logger@0.x: +bs-logger@^0.2.6: version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: fast-json-stable-stringify "2.x" bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" btoa-lite@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + resolved "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA== buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== call-bind@^1.0.2, call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -2251,33 +2227,33 @@ call-bind@^1.0.2, call-bind@^1.0.7: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001629: - version "1.0.30001636" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" - integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== +caniuse-lite@^1.0.30001646: + version "1.0.30001653" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz#b8af452f8f33b1c77f122780a4aecebea0caca56" + integrity sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw== cargo-cp-artifact@^0.1: version "0.1.9" - resolved "https://registry.yarnpkg.com/cargo-cp-artifact/-/cargo-cp-artifact-0.1.9.tgz#32264a0a48109e26c48da334daff9a1da9d9b7c8" + resolved "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.9.tgz#32264a0a48109e26c48da334daff9a1da9d9b7c8" integrity sha512-6F+UYzTaGB+awsTXg0uSJA1/b/B3DDJzpKVRu0UmyI7DmNeaAl2RFHuTGIN6fEgpadRxoXGb7gbC1xo4C3IdyA== chai@^4.3.6, chai@^4.3.7: - version "4.4.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" - integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== + version "4.5.0" + resolved "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== dependencies: assertion-error "^1.1.0" check-error "^1.0.3" @@ -2285,11 +2261,11 @@ chai@^4.3.6, chai@^4.3.7: get-func-name "^2.0.2" loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.8" + type-detect "^4.1.0" chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -2298,7 +2274,7 @@ chalk@^2.4.2: chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2306,30 +2282,30 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== check-error@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== dependencies: get-func-name "^2.0.2" check-types@^11.2.3: version "11.2.3" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + resolved "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== child_process@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/child_process/-/child_process-1.0.2.tgz#b1f7e7fc73d25e7fd1d455adc94e143830182b5a" + resolved "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz#b1f7e7fc73d25e7fd1d455adc94e143830182b5a" integrity sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g== -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -2343,31 +2319,31 @@ chokidar@3.5.3: chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== circom_runtime@0.1.21: version "0.1.21" - resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.1.21.tgz#0ee93bb798b5afb8ecec30725ed14d94587a999b" + resolved "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.21.tgz#0ee93bb798b5afb8ecec30725ed14d94587a999b" integrity sha512-qTkud630B/GK8y76hnOaaS1aNuF6prfV0dTrkeRsiJKnlP1ryQbP2FWLgDOPqn6aKyaPlam+Z+DTbBhkEzh8dA== dependencies: ffjavascript "0.2.56" circom_runtime@0.1.25: version "0.1.25" - resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.1.25.tgz#62a33b371f4633f30238db7a326c43d988e3a170" + resolved "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.25.tgz#62a33b371f4633f30238db7a326c43d988e3a170" integrity sha512-xBGsBFF5Uv6AKvbpgExYqpHfmfawH2HKe+LyjfKSRevqEV8u63i9KGHVIILsbJNW+0c5bm/66f0PUYQ7qZSkJA== dependencies: ffjavascript "0.3.0" circom_tester@^0.0.19: version "0.0.19" - resolved "https://registry.yarnpkg.com/circom_tester/-/circom_tester-0.0.19.tgz#e8bed494d080f8186bd0ac6571755d00ccec83bd" + resolved "https://registry.npmjs.org/circom_tester/-/circom_tester-0.0.19.tgz#e8bed494d080f8186bd0ac6571755d00ccec83bd" integrity sha512-SNHaBsGxcBH6XsVWfsRbRPA7NF8m8AMKJI9dtJJCFGUtOTT2+zsoIqAwi50z6XCnO4TtjyXq7AeXa1PLHqT0tw== dependencies: chai "^4.3.6" @@ -2381,12 +2357,12 @@ circom_tester@^0.0.19: circomlib@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/circomlib/-/circomlib-2.0.5.tgz#183c703e53ed7d011811842dbeeeb9819f4cc1d6" + resolved "https://registry.npmjs.org/circomlib/-/circomlib-2.0.5.tgz#183c703e53ed7d011811842dbeeeb9819f4cc1d6" integrity sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A== circomlibjs@^0.1.2: version "0.1.7" - resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" + resolved "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" integrity sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg== dependencies: blake-hash "^2.0.0" @@ -2395,13 +2371,13 @@ circomlibjs@^0.1.2: ffjavascript "^0.2.45" cjs-module-lexer@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.4.0" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz#677de7ed7efff67cc40c9bf1897fea79d41b5215" + integrity sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g== cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -2410,7 +2386,7 @@ cliui@^7.0.2: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -2419,83 +2395,83 @@ cliui@^8.0.1: co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-support@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== commander@^10.0.0: version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^11.0.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== commander@^2.17.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" - integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== +core-js-compat@^3.37.1, core-js-compat@^3.38.0: + version "3.38.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" + integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.3" cosmiconfig@^8.0.0: version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: import-fresh "^3.3.0" @@ -2505,7 +2481,7 @@ cosmiconfig@^8.0.0: create-jest@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== dependencies: "@jest/types" "^29.6.3" @@ -2518,7 +2494,7 @@ create-jest@^29.7.0: cross-spawn@^6.0.0: version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -2529,7 +2505,7 @@ cross-spawn@^6.0.0: cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -2538,62 +2514,55 @@ cross-spawn@^7.0.3: debug@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - -debug@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.5: + version "4.3.6" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" debug@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== dedent@^1.0.0: version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deep-eql@^4.1.3: version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== dependencies: type-detect "^4.0.0" deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -2602,53 +2571,53 @@ define-data-property@^1.1.4: delegates@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== detect-libc@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== diff-sequences@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dotenv@^16.3.1: version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== "ds-test@https://github.com/dapphub/ds-test": version "1.0.0" resolved "https://github.com/dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0" -ejs@^3.1.6: +ejs@^3.1.10, ejs@^3.1.6: version "3.1.10" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.796: - version "1.4.807" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.807.tgz#4d6c5ea1516f0164ac5bfd487ccd4ee9507c8f01" - integrity sha512-kSmJl2ZwhNf/bcIuCH/imtNOKlpkLDn2jqT5FJ+/0CXjhnFaOa9cOe9gHKKy71eM49izwuQjZhKk+lWQ1JxB7A== +electron-to-chromium@^1.5.4: + version "1.5.13" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" + integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== elliptic@6.5.4: version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -2661,75 +2630,75 @@ elliptic@6.5.4: emittery@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es6-promise@^4.0.3: version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== es6-promisify@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== dependencies: es6-promise "^4.0.3" escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@^1.8.1: version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" @@ -2741,27 +2710,27 @@ escodegen@^1.8.1: esprima@1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + resolved "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== ethers@^5.5.1: version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" @@ -2797,7 +2766,7 @@ ethers@^5.5.1: execa@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: cross-spawn "^6.0.0" @@ -2810,7 +2779,7 @@ execa@^1.0.0: execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -2825,12 +2794,12 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expect@^29.0.0, expect@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: "@jest/expect-utils" "^29.7.0" @@ -2841,39 +2810,44 @@ expect@^29.0.0, expect@^29.7.0: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.2.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + fastfile@0.0.20: version "0.0.20" - resolved "https://registry.yarnpkg.com/fastfile/-/fastfile-0.0.20.tgz#794a143d58cfda2e24c298e5ef619c748c8a1879" + resolved "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz#794a143d58cfda2e24c298e5ef619c748c8a1879" integrity sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA== fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" ffjavascript@0.2.56: version "0.2.56" - resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.56.tgz#3509f98fcbd3e44ea93cd23519071b76d6eae433" + resolved "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.56.tgz#3509f98fcbd3e44ea93cd23519071b76d6eae433" integrity sha512-em6G5Lrj7ucIqj4TYEgyoHs/j99Urwwqa4+YxEVY2hggnpRimVj+noX5pZQTxI1pvtiekZI4rG65JBf0xraXrg== dependencies: wasmbuilder "0.0.16" @@ -2882,7 +2856,7 @@ ffjavascript@0.2.56: ffjavascript@0.3.0, ffjavascript@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.0.tgz#442cd8fbb1ee4cbb1be9d26fd7b2951a1ea45d6a" + resolved "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.0.tgz#442cd8fbb1ee4cbb1be9d26fd7b2951a1ea45d6a" integrity sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ== dependencies: wasmbuilder "0.0.16" @@ -2891,7 +2865,7 @@ ffjavascript@0.3.0, ffjavascript@^0.3.0: ffjavascript@^0.2.45, ffjavascript@^0.2.48, ffjavascript@^0.2.56, ffjavascript@^0.2.59: version "0.2.63" - resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.63.tgz#0c1216a1f123dc9181df69e144473704d2f115eb" + resolved "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.63.tgz#0c1216a1f123dc9181df69e144473704d2f115eb" integrity sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A== dependencies: wasmbuilder "0.0.16" @@ -2900,80 +2874,80 @@ ffjavascript@^0.2.45, ffjavascript@^0.2.48, ffjavascript@^0.2.56, ffjavascript@^ filelist@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: minimatch "^5.0.1" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== fnv-plus@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/fnv-plus/-/fnv-plus-1.3.1.tgz#c34cb4572565434acb08ba257e4044ce2b006d67" + resolved "https://registry.npmjs.org/fnv-plus/-/fnv-plus-1.3.1.tgz#c34cb4572565434acb08ba257e4044ce2b006d67" integrity sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" "forge-std@https://github.com/foundry-rs/forge-std": - version "1.8.2" - resolved "https://github.com/foundry-rs/forge-std#19891e6a0b5474b9ea6827ddb90bb9388f7acfc0" + version "1.9.2" + resolved "https://github.com/foundry-rs/forge-std#58d30519826c313ce47345abedfdc07679e944d1" fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== gauge@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== dependencies: aproba "^1.0.3 || ^2.0.0" @@ -2988,22 +2962,22 @@ gauge@^3.0.0: gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -3014,130 +2988,130 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stream@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@8.1.0, glob@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^5.0.1" + minimatch "^3.1.1" once "^1.3.0" + path-is-absolute "^1.0.0" -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@^8.0.3, glob@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^5.0.1" once "^1.3.0" - path-is-absolute "^1.0.0" globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" has-unicode@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.0: +hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" -he@1.2.0: +he@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" @@ -3146,17 +3120,17 @@ hmac-drbg@^1.0.1: hoopy@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + resolved "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-proxy-agent@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== dependencies: agent-base "4" @@ -3164,7 +3138,7 @@ http-proxy-agent@^2.1.0: https-proxy-agent@^2.2.0: version "2.2.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== dependencies: agent-base "^4.3.0" @@ -3172,7 +3146,7 @@ https-proxy-agent@^2.2.0: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -3180,38 +3154,38 @@ https-proxy-agent@^5.0.0: human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.2.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -3219,12 +3193,12 @@ inflight@^1.0.4: inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== is-arguments@^1.0.4: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -3232,102 +3206,102 @@ is-arguments@^1.0.4: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-callable@^1.1.3: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + version "2.15.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-generator-function@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-stream@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typed-array@^1.1.3: version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: which-typed-array "^1.1.14" is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4: version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -3337,9 +3311,9 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-instrument@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" - integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== + version "6.0.3" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== dependencies: "@babel/core" "^7.23.9" "@babel/parser" "^7.23.9" @@ -3349,7 +3323,7 @@ istanbul-lib-instrument@^6.0.0: istanbul-lib-report@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -3358,7 +3332,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -3367,16 +3341,16 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.1.3: version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" jake@^10.8.5: - version "10.9.1" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.1.tgz#8dc96b7fcc41cb19aa502af506da4e1d56f5e62b" - integrity sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w== + version "10.9.2" + resolved "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" @@ -3385,7 +3359,7 @@ jake@^10.8.5: jest-changed-files@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" @@ -3394,7 +3368,7 @@ jest-changed-files@^29.7.0: jest-circus@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: "@jest/environment" "^29.7.0" @@ -3420,7 +3394,7 @@ jest-circus@^29.7.0: jest-cli@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: "@jest/core" "^29.7.0" @@ -3437,7 +3411,7 @@ jest-cli@^29.7.0: jest-config@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" @@ -3465,7 +3439,7 @@ jest-config@^29.7.0: jest-diff@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" @@ -3475,14 +3449,14 @@ jest-diff@^29.7.0: jest-docblock@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" jest-each@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: "@jest/types" "^29.6.3" @@ -3493,7 +3467,7 @@ jest-each@^29.7.0: jest-environment-node@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: "@jest/environment" "^29.7.0" @@ -3505,12 +3479,12 @@ jest-environment-node@^29.7.0: jest-get-type@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: "@jest/types" "^29.6.3" @@ -3529,7 +3503,7 @@ jest-haste-map@^29.7.0: jest-leak-detector@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: jest-get-type "^29.6.3" @@ -3537,7 +3511,7 @@ jest-leak-detector@^29.7.0: jest-matcher-utils@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" @@ -3547,7 +3521,7 @@ jest-matcher-utils@^29.7.0: jest-message-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" @@ -3562,7 +3536,7 @@ jest-message-util@^29.7.0: jest-mock@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: "@jest/types" "^29.6.3" @@ -3571,17 +3545,17 @@ jest-mock@^29.7.0: jest-pnp-resolver@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== jest-resolve-dependencies@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: jest-regex-util "^29.6.3" @@ -3589,7 +3563,7 @@ jest-resolve-dependencies@^29.7.0: jest-resolve@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" @@ -3604,7 +3578,7 @@ jest-resolve@^29.7.0: jest-runner@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: "@jest/console" "^29.7.0" @@ -3631,7 +3605,7 @@ jest-runner@^29.7.0: jest-runtime@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== dependencies: "@jest/environment" "^29.7.0" @@ -3659,7 +3633,7 @@ jest-runtime@^29.7.0: jest-snapshot@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" @@ -3685,7 +3659,7 @@ jest-snapshot@^29.7.0: jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -3697,7 +3671,7 @@ jest-util@^29.0.0, jest-util@^29.7.0: jest-validate@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: "@jest/types" "^29.6.3" @@ -3709,7 +3683,7 @@ jest-validate@^29.7.0: jest-watcher@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: "@jest/test-result" "^29.7.0" @@ -3723,7 +3697,7 @@ jest-watcher@^29.7.0: jest-worker@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" @@ -3733,7 +3707,7 @@ jest-worker@^29.7.0: jest@^29.5.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: "@jest/core" "^29.7.0" @@ -3743,62 +3717,62 @@ jest@^29.5.0: js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonpath@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + resolved "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== dependencies: esprima "1.2.2" @@ -3807,17 +3781,17 @@ jsonpath@^1.1.1: kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" @@ -3825,46 +3799,46 @@ levn@~0.3.0: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.memoize@4.x: +lodash.memoize@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0: +log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -3872,130 +3846,123 @@ log-symbols@4.1.0: logplease@^1.2.15: version "1.2.15" - resolved "https://registry.yarnpkg.com/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" + resolved "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" integrity sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA== loupe@^2.3.6: version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: get-func-name "^2.0.1" lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" macos-release@^2.2.0: version "2.5.1" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.1.tgz#bccac4a8f7b93163a8d163b8ebf385b3c5f55bf9" + resolved "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz#bccac4a8f7b93163a8d163b8ebf385b3c5f55bf9" integrity sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A== make-dir@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-dir@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: semver "^7.5.3" -make-error@1.x: +make-error@^1.3.6: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.19: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: +minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" minipass@^3.0.0: version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" minipass@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -4003,129 +3970,129 @@ minizlib@^2.1.1: mkdirp@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mocha@^10.2.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.4.0.tgz#ed03db96ee9cfc6d20c56f8e2af07b961dbae261" - integrity sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "8.1.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" + version "10.7.3" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" + integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== nanoassert@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + resolved "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-addon-api@^3.0.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== node-fetch@^2.1.1, node-fetch@^2.6.7: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-gyp-build@^4.2.2: - version "4.8.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" - integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== + version "4.8.2" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" + integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -"node-pre-gyp-github@https://github.com/ultamatt/node-pre-gyp-github.git": +"node-pre-gyp-github@git+https://github.com/ultamatt/node-pre-gyp-github.git": version "1.4.3" - resolved "https://github.com/ultamatt/node-pre-gyp-github.git#e4961827f77751489bc8d4760a0479f3f985f34f" + resolved "git+https://github.com/ultamatt/node-pre-gyp-github.git#e4961827f77751489bc8d4760a0479f3f985f34f" dependencies: "@octokit/rest" "^15.9.5" commander "^2.17.0" mime-types "^2.1.19" -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== nopt@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== dependencies: abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npmlog@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== dependencies: are-we-there-yet "^2.0.0" @@ -4135,26 +4102,26 @@ npmlog@^5.0.1: object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" optionator@^0.8.1: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -4166,7 +4133,7 @@ optionator@^0.8.1: os-name@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + resolved "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== dependencies: macos-release "^2.2.0" @@ -4174,52 +4141,52 @@ os-name@^3.0.0: p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -4229,98 +4196,97 @@ parse-json@^5.2.0: path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pirates@^4.0.4: version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== possible-typed-array-names@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier-plugin-solidity@^1.1.3: - version "1.3.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz#59944d3155b249f7f234dee29f433524b9a4abcf" - integrity sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA== + version "1.4.1" + resolved "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9" + integrity sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg== dependencies: - "@solidity-parser/parser" "^0.17.0" + "@solidity-parser/parser" "^0.18.0" semver "^7.5.4" - solidity-comments-extractor "^0.0.8" prettier@^2.8.3: version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== prettier@^3.0.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" - integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== + version "3.3.3" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" @@ -4329,7 +4295,7 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: prompts@^2.0.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -4337,7 +4303,7 @@ prompts@^2.0.1: pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -4345,17 +4311,17 @@ pump@^3.0.0: punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== r1csfile@0.0.41, r1csfile@^0.0.41: version "0.0.41" - resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.41.tgz#e3d2709d36923156dd1fc2db9858987b30c92948" + resolved "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.41.tgz#e3d2709d36923156dd1fc2db9858987b30c92948" integrity sha512-Q1WDF3u1vYeAwjHo4YuddkA8Aq0TulbKjmGm99+Atn13Lf5fTsMZBnBV9T741w8iSyPFG6Uh6sapQby77sREqA== dependencies: "@iden3/bigarray" "0.0.2" @@ -4365,7 +4331,7 @@ r1csfile@0.0.41, r1csfile@^0.0.41: r1csfile@0.0.48: version "0.0.48" - resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.48.tgz#a317fc75407a9da92631666c75bdfc13f0a7835a" + resolved "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.48.tgz#a317fc75407a9da92631666c75bdfc13f0a7835a" integrity sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw== dependencies: "@iden3/bigarray" "0.0.2" @@ -4375,19 +4341,19 @@ r1csfile@0.0.48: randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" react-is@^18.0.0: version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -4396,38 +4362,38 @@ readable-stream@^3.6.0: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" regenerate-unicode-properties@^10.1.0: version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" regexpu-core@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" @@ -4439,46 +4405,46 @@ regexpu-core@^5.3.1: regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve.exports@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.14.2, resolve@^1.20.0: version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -4487,51 +4453,51 @@ resolve@^1.14.2, resolve@^1.20.0: rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== scrypt-js@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== semver@^5.5.0: version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -4543,46 +4509,46 @@ set-function-length@^1.2.1: shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== signal-exit@^3.0.0, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -4591,7 +4557,7 @@ slice-ansi@^4.0.0: snarkjs@0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.5.0.tgz#cf26bf1d3835eb16b4b330a438bad9824837d6b0" + resolved "https://registry.npmjs.org/snarkjs/-/snarkjs-0.5.0.tgz#cf26bf1d3835eb16b4b330a438bad9824837d6b0" integrity sha512-KWz8mZ2Y+6wvn6GGkQo6/ZlKwETdAGohd40Lzpwp5TUZCn6N6O4Az1SuX1rw/qREGL6Im+ycb19suCFE8/xaKA== dependencies: "@iden3/binfileutils" "0.0.11" @@ -4607,7 +4573,7 @@ snarkjs@0.5.0: snarkjs@^0.7.0: version "0.7.4" - resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.7.4.tgz#b9ad5813f055ab84d33f1831a6f1f34a71b6cd46" + resolved "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.4.tgz#b9ad5813f055ab84d33f1831a6f1f34a71b6cd46" integrity sha512-x4cOCR4YXSyBlLtfnUUwfbZrw8wFd/Y0lk83eexJzKwZB8ELdpH+10ts8YtDsm2/a3WK7c7p514bbE8NpqxW8w== dependencies: "@iden3/binfileutils" "0.0.12" @@ -4623,12 +4589,12 @@ snarkjs@^0.7.0: solady@^0.0.123: version "0.0.123" - resolved "https://registry.yarnpkg.com/solady/-/solady-0.0.123.tgz#7ef95767c1570e3efde7550da2a8b439b2f413d2" + resolved "https://registry.npmjs.org/solady/-/solady-0.0.123.tgz#7ef95767c1570e3efde7550da2a8b439b2f413d2" integrity sha512-F/B8OMCplGsS4FrdPrnEG0xdg8HKede5PwC+Rum8soj/LWxfKckA0p+Uwnlbgey2iI82IHvmSOCNhsdbA+lUrw== solhint@^3.6.1: version "3.6.2" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" + resolved "https://registry.npmjs.org/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== dependencies: "@solidity-parser/parser" "^0.16.0" @@ -4651,14 +4617,9 @@ solhint@^3.6.1: optionalDependencies: prettier "^2.8.3" -solidity-comments-extractor@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz#f6e148ab0c49f30c1abcbecb8b8df01ed8e879f8" - integrity sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g== - source-map-support@0.5.13: version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" @@ -4666,31 +4627,31 @@ source-map-support@0.5.13: source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stack-utils@^2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" static-eval@2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + resolved "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== dependencies: escodegen "^1.8.1" string-length@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -4698,7 +4659,7 @@ string-length@^4.0.1: "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -4707,67 +4668,67 @@ string-length@^4.0.1: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-eof@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@8.1.1, supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-color@^8.0.0, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== table@^6.8.1: version "6.8.2" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + resolved "https://registry.npmjs.org/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== dependencies: ajv "^8.0.1" @@ -4778,7 +4739,7 @@ table@^6.8.1: tar@^6.1.11: version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" @@ -4790,7 +4751,7 @@ tar@^6.1.11: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -4799,102 +4760,108 @@ test-exclude@^6.0.0: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== tmp-promise@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + resolved "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== dependencies: tmp "^0.2.0" tmp@^0.2.0: version "0.2.3" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== tmpl@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== tryer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== ts-jest@^29.1.1: - version "29.1.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.5.tgz#d6c0471cc78bffa2cb4664a0a6741ef36cfe8f69" - integrity sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg== + version "29.2.5" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" jest-util "^29.0.0" json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "^7.5.3" - yargs-parser "^21.0.1" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: +type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== typescript@^4.5.4, typescript@^4.8.3: version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== underscore@1.12.1: version "1.12.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -4902,49 +4869,49 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== universal-user-agent@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" + resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" integrity sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q== dependencies: os-name "^3.0.0" -update-browserslist-db@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: escalade "^3.1.2" picocolors "^1.0.1" -uri-js@^4.2.2, uri-js@^4.4.1: +uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-template@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + resolved "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== util-deprecate@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util@^0.12.4: version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" @@ -4954,9 +4921,9 @@ util@^0.12.4: which-typed-array "^1.1.2" v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + version "9.3.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -4964,48 +4931,48 @@ v8-to-istanbul@^9.0.1: walker@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" wasmbuilder@0.0.16: version "0.0.16" - resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" + resolved "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA== wasmcurves@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.0.tgz#ccfc5a7d3778b6e0768b82a9336c80054f9bc0cf" + resolved "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz#ccfc5a7d3778b6e0768b82a9336c80054f9bc0cf" integrity sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA== dependencies: wasmbuilder "0.0.16" wasmcurves@0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" + resolved "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ== dependencies: wasmbuilder "0.0.16" web-worker@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== web-worker@^1.2.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" + resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" integrity sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -5013,7 +4980,7 @@ whatwg-url@^5.0.0: which-typed-array@^1.1.14, which-typed-array@^1.1.2: version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: available-typed-arrays "^1.0.7" @@ -5024,45 +4991,45 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.2: which@^1.2.9: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wide-align@^1.1.2: version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" windows-release@^3.1.0: version "3.3.3" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" + resolved "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== dependencies: execa "^1.0.0" word-wrap@~1.2.3: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -5071,12 +5038,12 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" @@ -5084,42 +5051,37 @@ write-file-atomic@^4.0.2: ws@7.4.6: version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.0.1, yargs-parser@^21.1.1: +yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-unparser@2.0.0: +yargs-unparser@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -5127,9 +5089,9 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: +yargs@^16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -5142,7 +5104,7 @@ yargs@16.2.0: yargs@^17.3.1: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -5155,5 +5117,5 @@ yargs@^17.3.1: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 6f6a726d158e2e8614ade0d55ea635c66ef8263d Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Sun, 1 Sep 2024 22:08:46 +0530 Subject: [PATCH 005/121] fix: minor test changes --- packages/circuits/tests/email_auth.test.ts | 36 +++++++++++++++++----- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/packages/circuits/tests/email_auth.test.ts b/packages/circuits/tests/email_auth.test.ts index 32e94c56..de5752e1 100644 --- a/packages/circuits/tests/email_auth.test.ts +++ b/packages/circuits/tests/email_auth.test.ts @@ -12,6 +12,7 @@ describe("Email Auth", () => { beforeAll(async () => { const option = { include: path.join(__dirname, "../../../node_modules"), + recompile: true, }; circuit = await wasm_tester( path.join(__dirname, "../src/email_auth.circom"), @@ -36,7 +37,10 @@ describe("Email Auth", () => { command_idx, padded_cleaned_body, ...circuitInputsRelevant - } = await genEmailCircuitInput(emailFilePath, accountCode); + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); console.log(circuitInputsRelevant); const witness = await circuit.calculateWitness(circuitInputsRelevant); await circuit.checkConstraints(witness); @@ -98,7 +102,10 @@ describe("Email Auth", () => { command_idx, padded_cleaned_body, ...circuitInputsRelevant - } = await genEmailCircuitInput(emailFilePath, accountCode); + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); const witness = await circuit.calculateWitness(circuitInputsRelevant); await circuit.checkConstraints(witness); const domainName = "gmail.com"; @@ -159,7 +166,10 @@ describe("Email Auth", () => { command_idx, padded_cleaned_body, ...circuitInputsRelevant - } = await genEmailCircuitInput(emailFilePath, accountCode); + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); const witness = await circuit.calculateWitness(circuitInputsRelevant); await circuit.checkConstraints(witness); const domainName = "gmail.com"; @@ -220,7 +230,10 @@ describe("Email Auth", () => { command_idx, padded_cleaned_body, ...circuitInputsRelevant - } = await genEmailCircuitInput(emailFilePath, accountCode); + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); const witness = await circuit.calculateWitness(circuitInputsRelevant); await circuit.checkConstraints(witness); const domainName = "gmail.com"; @@ -282,7 +295,10 @@ describe("Email Auth", () => { command_idx, padded_cleaned_body, ...circuitInputsRelevant - } = await genEmailCircuitInput(emailFilePath, accountCode); + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); const witness = await circuit.calculateWitness(circuitInputsRelevant); await circuit.checkConstraints(witness); const domainName = "gmail.com"; @@ -343,7 +359,10 @@ describe("Email Auth", () => { command_idx, padded_cleaned_body, ...circuitInputsRelevant - } = await genEmailCircuitInput(emailFilePath, accountCode); + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); const witness = await circuit.calculateWitness(circuitInputsRelevant); await circuit.checkConstraints(witness); const domainName = "gmail.com"; @@ -403,7 +422,10 @@ describe("Email Auth", () => { command_idx, padded_cleaned_body, ...circuitInputsRelevant - } = await genEmailCircuitInput(emailFilePath, accountCode); + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); circuitInputsRelevant.from_addr_idx = circuitInputsRelevant.subject_idx; async function failFn() { const witness = await circuit.calculateWitness( From 4de8d4db4d31862d5e71a80568b2ea850f36638d Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Sun, 1 Sep 2024 23:00:54 +0530 Subject: [PATCH 006/121] chore: update dependencies --- packages/circuits/package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/circuits/package.json b/packages/circuits/package.json index ec86aef4..f66ed9bc 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -12,7 +12,7 @@ "dependencies": { "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.2.8", + "@zk-email/relayer-utils": "^0.2.9", "commander": "^11.0.0", "snarkjs": "^0.7.0" }, diff --git a/yarn.lock b/yarn.lock index fc8edd32..794c67da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1818,10 +1818,10 @@ "@openzeppelin/contracts" "^5.0.0" dotenv "^16.3.1" -"@zk-email/relayer-utils@^0.2.8": - version "0.2.8" - resolved "https://registry.npmjs.org/@zk-email/relayer-utils/-/relayer-utils-0.2.8.tgz#6451a3587b940888044e72308e5100f7cb5b1747" - integrity sha512-ZQObWnRdi7Gngp3PGuYlZr+6WO95kyaBISMqrSXjMM61kYuKuFingz5FuzynrW75I4dYHVgt+kyEGg1WhjSd1w== +"@zk-email/relayer-utils@^0.2.9": + version "0.2.9" + resolved "https://registry.npmjs.org/@zk-email/relayer-utils/-/relayer-utils-0.2.9.tgz#81f34cab29a444f56d99a79514afd7759789aa2a" + integrity sha512-QlkGBo0OxxD7I+U1SoS32B8R/bzqd7gI6uhEZZAWEY4lPrMc8NiNeC45xYXHIVYi7olAVn27GpxLnURmL8FrDg== dependencies: "@mapbox/node-pre-gyp" "^1.0" cargo-cp-artifact "^0.1" From 885b7a5939f61f2723708b0a0ddf93a6e9290f64 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Mon, 2 Sep 2024 11:25:45 +0000 Subject: [PATCH 007/121] (wip) chore: pass github workflow --- Cargo.lock | 1165 ++++---------- packages/circuits/package.json | 2 +- packages/relayer/Cargo.toml | 5 +- .../src/abis/email_account_recovery.rs | 70 - packages/relayer/src/modules/dkim.rs | 3 +- .../src/modules/web_server/rest_api.rs | 1 - yarn.lock | 1380 ++++++++--------- 7 files changed, 1035 insertions(+), 1591 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 558dfa58..97b42314 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,6 +27,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "aes" version = "0.8.4" @@ -89,21 +95,15 @@ checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.5.2" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii" @@ -185,13 +185,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -232,7 +232,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -290,17 +290,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "backoff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" -dependencies = [ - "getrandom", - "instant", - "rand", -] - [[package]] name = "backtrace" version = "0.3.73" @@ -311,7 +300,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.7.4", "object", "rustc-demangle", ] @@ -352,29 +341,6 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" -[[package]] -name = "binread" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16598dfc8e6578e9b597d9910ba2e73618385dc9f4b1d43dd92c349d6be6418f" -dependencies = [ - "binread_derive", - "lazy_static", - "rustversion", -] - -[[package]] -name = "binread_derive" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9672209df1714ee804b1f4d4f68c8eb2a90b1f7a07acf472f88ce198ef1fed" -dependencies = [ - "either", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "bit-set" version = "0.5.3" @@ -423,7 +389,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -433,17 +399,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", - "arrayvec 0.7.4", - "constant_time_eq 0.3.0", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", + "arrayvec", + "constant_time_eq 0.3.1", ] [[package]] @@ -455,27 +412,13 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bls12_381" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" -dependencies = [ - "digest 0.9.0", - "ff 0.12.1", - "group 0.12.1", - "pairing 0.22.0", - "rand_core", - "subtle", -] - [[package]] name = "bs58" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "sha2 0.10.8", + "sha2", "tinyvec", ] @@ -499,9 +442,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" dependencies = [ "serde", ] @@ -527,65 +470,13 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "cached" -version = "0.46.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c8c50262271cdf5abc979a5f76515c234e764fa025d1ba4862c0f0bcda0e95" -dependencies = [ - "ahash", - "hashbrown 0.14.5", - "instant", - "once_cell", - "thiserror", -] - [[package]] name = "camino" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" -dependencies = [ - "serde", -] - -[[package]] -name = "candid" -version = "0.9.11" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465c1ce01d8089ee5b49ba20d3a9da15a28bba64c35cdff2aa256d37e319625d" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" dependencies = [ - "anyhow", - "binread", - "byteorder", - "candid_derive", - "codespan-reporting", - "crc32fast", - "data-encoding", - "hex", - "leb128", - "num-bigint", - "num-traits", - "num_enum 0.6.1", - "paste", - "pretty", "serde", - "serde_bytes", - "sha2 0.10.8", - "stacker", - "thiserror", -] - -[[package]] -name = "candid_derive" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201ea498d901add0822653ac94cb0f8a92f9b1758a5273f4dafbb6673c9a5020" -dependencies = [ - "lazy_static", - "proc-macro2", - "quote", - "syn 2.0.71", ] [[package]] @@ -613,13 +504,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.2" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47de7e88bbbd467951ae7f5a6f34f70d1b4d9cfce53d5fd70f74ebe118b3db56" +checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" dependencies = [ "jobserver", "libc", - "once_cell", + "shlex", ] [[package]] @@ -630,8 +521,8 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfdkim" -version = "0.3.0" -source = "git+https://github.com/SoraSuegami/dkim.git#93829027f03a7442392a37b4635471d8b7f49e6b" +version = "0.3.3" +source = "git+https://github.com/zkemail/dkim.git#3b1cfd75e2afad12fbc1e8ece50e93e51415118b" dependencies = [ "base64 0.21.7", "chrono", @@ -648,7 +539,7 @@ dependencies = [ "rsa", "serde_json", "sha-1", - "sha2 0.10.8", + "sha2", "slog", "trust-dns-resolver", "wasm-bindgen", @@ -668,11 +559,11 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "charset" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e9079d1a12a2cc2bffb5db039c43661836ead4082120d5844f02555aca2d46" +checksum = "f1f927b07c74ba84c7e5fe4db2baeb3e996ab2688992e39ac68ce3220a677c7e" dependencies = [ - "base64 0.13.1", + "base64 0.22.1", "encoding_rs", ] @@ -707,16 +598,6 @@ dependencies = [ "inout", ] -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - [[package]] name = "coins-bip32" version = "0.8.7" @@ -725,11 +606,11 @@ checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ "bs58", "coins-core", - "digest 0.10.7", + "digest", "hmac", "k256", "serde", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -745,7 +626,7 @@ dependencies = [ "once_cell", "pbkdf2 0.12.2", "rand", - "sha2 0.10.8", + "sha2", "thiserror", ] @@ -758,13 +639,13 @@ dependencies = [ "base64 0.21.7", "bech32", "bs58", - "digest 0.10.7", + "digest", "generic-array", "hex", "ripemd", "serde", "serde_derive", - "sha2 0.10.8", + "sha2", "sha3", "thiserror", ] @@ -838,9 +719,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "core-foundation" @@ -854,15 +735,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] @@ -980,7 +861,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "rustc_version", "subtle", @@ -995,20 +876,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", -] - -[[package]] -name = "curve25519-dalek-ng" -version = "4.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core", - "subtle-ng", - "zeroize", + "syn 2.0.77", ] [[package]] @@ -1045,16 +913,7 @@ checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", + "syn 2.0.77", ] [[package]] @@ -1063,7 +922,7 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.4", + "block-buffer", "const-oid", "crypto-common", "subtle", @@ -1125,9 +984,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "ecdsa" @@ -1136,7 +995,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -1153,21 +1012,6 @@ dependencies = [ "signature", ] -[[package]] -name = "ed25519-consensus" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" -dependencies = [ - "curve25519-dalek-ng", - "hex", - "rand_core", - "serde", - "sha2 0.9.9", - "thiserror", - "zeroize", -] - [[package]] name = "ed25519-dalek" version = "2.1.1" @@ -1177,7 +1021,7 @@ dependencies = [ "curve25519-dalek", "ed25519", "serde", - "sha2 0.10.8", + "sha2", "subtle", "zeroize", ] @@ -1199,11 +1043,10 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", - "ff 0.13.0", + "digest", + "ff", "generic-array", - "group 0.13.0", - "pem-rfc7468", + "group", "pkcs8", "rand_core", "sec1", @@ -1223,9 +1066,9 @@ dependencies = [ [[package]] name = "email_address" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1019fa28f600f5b581b7a603d515c3f1635da041ca211b5055804788673abfe" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" [[package]] name = "ena" @@ -1310,7 +1153,7 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest 0.10.7", + "digest", "hex", "hmac", "pbkdf2 0.11.0", @@ -1318,7 +1161,7 @@ dependencies = [ "scrypt", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "sha3", "thiserror", "uuid 0.8.2", @@ -1438,7 +1281,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "syn 2.0.71", + "syn 2.0.77", "toml", "walkdir", ] @@ -1456,7 +1299,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -1465,7 +1308,7 @@ version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" dependencies = [ - "arrayvec 0.7.4", + "arrayvec", "bytes", "cargo_metadata", "chrono", @@ -1474,15 +1317,15 @@ dependencies = [ "ethabi", "generic-array", "k256", - "num_enum 0.7.2", + "num_enum", "once_cell", "open-fastrlp", "rand", "rlp", "serde", "serde_json", - "strum 0.26.3", - "syn 2.0.71", + "strum", + "syn 2.0.77", "tempfile", "thiserror", "tiny-keccak", @@ -1583,7 +1426,7 @@ dependencies = [ "eth-keystore", "ethers-core", "rand", - "sha2 0.10.8", + "sha2", "thiserror", "tracing", ] @@ -1667,6 +1510,17 @@ dependencies = [ "regex", ] +[[package]] +name = "fancy-regex" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + [[package]] name = "fastrand" version = "1.9.0" @@ -1678,19 +1532,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "ff" -version = "0.12.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core", - "subtle", -] +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "ff" @@ -1739,12 +1583,12 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.8.0", ] [[package]] @@ -1896,7 +1740,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -2055,24 +1899,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core", - "subtle", -] - [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff 0.13.0", + "ff", "rand_core", "subtle", ] @@ -2089,61 +1922,34 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.2.6", + "indexmap 2.5.0", "slab", "tokio", "tokio-util", "tracing", ] -[[package]] -name = "half" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" - [[package]] name = "halo2curves" -version = "0.4.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git?rev=81a078254518a7a4b7c69fab120621deaace9389#81a078254518a7a4b7c69fab120621deaace9389" -dependencies = [ - "blake2b_simd", - "ff 0.13.0", - "group 0.13.0", - "lazy_static", - "maybe-rayon", - "num-bigint", - "num-traits", - "pairing 0.23.0", - "pasta_curves", - "paste", - "rand", - "rand_core", - "static_assertions", - "subtle", -] - -[[package]] -name = "halo2curves" -version = "0.6.1" -source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#d34e9e46f7daacd194739455de3b356ca6c03206" +version = "0.7.0" +source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#b753a832e92d5c86c5c997327a9cf9de86a18851" dependencies = [ "blake2", - "digest 0.10.7", - "ff 0.13.0", - "group 0.13.0", + "digest", + "ff", + "group", "halo2derive", "lazy_static", "num-bigint", "num-integer", "num-traits", - "pairing 0.23.0", + "pairing", "pasta_curves", "paste", "rand", "rand_core", "rayon", - "sha2 0.10.8", + "sha2", "static_assertions", "subtle", "unroll", @@ -2152,7 +1958,7 @@ dependencies = [ [[package]] name = "halo2derive" version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#d34e9e46f7daacd194739455de3b356ca6c03206" +source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#b753a832e92d5c86c5c997327a9cf9de86a18851" dependencies = [ "num-bigint", "num-integer", @@ -2231,6 +2037,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -2252,9 +2064,14 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] +[[package]] +name = "hmac-sha256" +version = "1.1.7" +source = "git+https://github.com/zkemail/rust-hmac-sha256.git#e98ae695d2600c98b57de4b1ad1e0bfb7895f458" + [[package]] name = "home" version = "0.5.9" @@ -2394,105 +2211,6 @@ dependencies = [ "cc", ] -[[package]] -name = "ic-agent" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "263d5c7b295ba69eac0692e6f6b35a01ca323889d10612c0f8c8fd223b0bfec5" -dependencies = [ - "backoff", - "cached", - "candid", - "ed25519-consensus", - "futures-util", - "hex", - "http 0.2.12", - "http-body", - "ic-certification", - "ic-transport-types", - "ic-verify-bls-signature", - "k256", - "leb128", - "pem 2.0.1", - "pkcs8", - "rand", - "rangemap", - "reqwest", - "ring 0.16.20", - "rustls-webpki", - "sec1", - "serde", - "serde_bytes", - "serde_cbor", - "serde_repr", - "sha2 0.10.8", - "simple_asn1", - "thiserror", - "time", - "tokio", - "url", -] - -[[package]] -name = "ic-certification" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c04340437a32c8b9c80d36f09715909c1e0a755327503a2e2906dcd662ba4e" -dependencies = [ - "hex", - "serde", - "serde_bytes", - "sha2 0.10.8", -] - -[[package]] -name = "ic-transport-types" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2be3fc4f0641a8c3967fbc8ab52b08bc6d13bf65fb2460b090710374be49b1" -dependencies = [ - "candid", - "hex", - "ic-certification", - "leb128", - "serde", - "serde_bytes", - "serde_repr", - "sha2 0.10.8", - "thiserror", -] - -[[package]] -name = "ic-utils" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd6fac62c95df9f963c8a941431d86308c864ba1e9001da75843d79a355fb68" -dependencies = [ - "async-trait", - "candid", - "ic-agent", - "once_cell", - "semver 1.0.23", - "serde", - "serde_bytes", - "strum 0.24.1", - "strum_macros 0.24.3", - "thiserror", - "time", -] - -[[package]] -name = "ic-verify-bls-signature" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583b1c03380cf86059160cc6c91dcbf56c7b5f141bf3a4f06bc79762d775fac4" -dependencies = [ - "bls12_381", - "lazy_static", - "pairing 0.22.0", - "sha2 0.9.9", -] - [[package]] name = "idna" version = "0.2.3" @@ -2589,9 +2307,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown 0.14.5", @@ -2635,11 +2353,11 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi", + "hermit-abi 0.4.0", "libc", "windows-sys 0.52.0", ] @@ -2655,9 +2373,18 @@ dependencies = [ [[package]] name = "itertools" -version = "0.11.0" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] @@ -2692,18 +2419,18 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -2715,7 +2442,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ "base64 0.21.7", - "pem 1.1.1", + "pem", "ring 0.16.20", "serde", "serde_json", @@ -2732,7 +2459,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2 0.10.8", + "sha2", "signature", ] @@ -2784,12 +2511,6 @@ dependencies = [ "spin 0.9.8", ] -[[package]] -name = "leb128" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" - [[package]] name = "lettre" version = "0.10.4" @@ -2818,9 +2539,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.155" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libloading" @@ -2898,13 +2619,13 @@ dependencies = [ [[package]] name = "mailparse" -version = "0.14.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d096594926cab442e054e047eb8c1402f7d5b2272573b97ba68aa40629f9757" +checksum = "3da03d5980411a724e8aaf7b61a7b5e386ec55a7fb49ee3d0ff79efc7e5e7c7e" dependencies = [ "charset", "data-encoding", - "quoted_printable 0.5.0", + "quoted_printable 0.5.1", ] [[package]] @@ -2934,16 +2655,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - [[package]] name = "md-5" version = "0.10.6" @@ -2951,7 +2662,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest 0.10.7", + "digest", ] [[package]] @@ -2966,6 +2677,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minicov" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c71e683cd655513b99affab7d317deb690528255a0d5f717f1024093c12b169" +dependencies = [ + "cc", + "walkdir", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -2981,15 +2702,25 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3093,7 +2824,6 @@ dependencies = [ "num-integer", "num-traits", "rand", - "serde", ] [[package]] @@ -3156,50 +2886,29 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] [[package]] name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive 0.6.1", -] - -[[package]] -name = "num_enum" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" -dependencies = [ - "num_enum_derive 0.7.2", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 2.0.71", + "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -3217,7 +2926,7 @@ dependencies = [ "serde", "serde_json", "serde_path_to_error", - "sha2 0.10.8", + "sha2", "thiserror", "url", ] @@ -3233,9 +2942,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.1" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] @@ -3246,19 +2955,13 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "open-fastrlp" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" dependencies = [ - "arrayvec 0.7.4", + "arrayvec", "auto_impl", "bytes", "ethereum-types", @@ -3279,9 +2982,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -3300,7 +3003,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -3311,9 +3014,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -3327,22 +3030,13 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "pairing" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" -dependencies = [ - "group 0.12.1", -] - [[package]] name = "pairing" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" dependencies = [ - "group 0.13.0", + "group", ] [[package]] @@ -3351,7 +3045,7 @@ version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ - "arrayvec 0.7.4", + "arrayvec", "bitvec", "byte-slice-cast", "impl-trait-for-tuples", @@ -3365,7 +3059,7 @@ version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate", "proc-macro2", "quote", "syn 1.0.109", @@ -3420,7 +3114,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.2", + "redox_syscall 0.5.3", "smallvec", "windows-targets 0.52.6", ] @@ -3443,8 +3137,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" dependencies = [ "blake2b_simd", - "ff 0.13.0", - "group 0.13.0", + "ff", + "group", "lazy_static", "rand", "static_assertions", @@ -3469,10 +3163,10 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.7", + "digest", "hmac", "password-hash", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -3481,7 +3175,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest 0.10.7", + "digest", "hmac", ] @@ -3494,16 +3188,6 @@ dependencies = [ "base64 0.13.1", ] -[[package]] -name = "pem" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b13fe415cdf3c8e44518e18a7c95a13431d9bdf6d15367d82b23c377fdd441a" -dependencies = [ - "base64 0.21.7", - "serde", -] - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -3550,7 +3234,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -3561,7 +3245,7 @@ checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" dependencies = [ "once_cell", "pest", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -3571,7 +3255,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.2.6", + "indexmap 2.5.0", ] [[package]] @@ -3614,7 +3298,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -3652,7 +3336,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -3696,11 +3380,11 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "poseidon-rs" -version = "0.0.10" -source = "git+https://github.com/SoraSuegami/poseidon-rs.git?branch=master#15aa98d045e531806e39e48ba5a0b999f5de5d8d" +version = "1.0.0" +source = "git+https://github.com/zkemail/poseidon-rs.git#fe5ce2634c27326219d4faf75beb73b40a0beb7d" dependencies = [ "getrandom", - "halo2curves 0.6.1", + "halo2curves", "once_cell", "serde", "thiserror", @@ -3714,9 +3398,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -3724,25 +3411,14 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" -[[package]] -name = "pretty" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55c4d17d994b637e2f4daf6e5dc5d660d209d5642377d675d7a1c3ab69fa579" -dependencies = [ - "arrayvec 0.5.2", - "typed-arena", - "unicode-width", -] - [[package]] name = "prettyplease" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -3761,21 +3437,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.21.1", + "toml_edit", ] [[package]] @@ -3803,15 +3469,6 @@ dependencies = [ "unarray", ] -[[package]] -name = "psm" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" -dependencies = [ - "cc", -] - [[package]] name = "quick-error" version = "1.2.3" @@ -3826,9 +3483,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -3841,9 +3498,9 @@ checksum = "5a3866219251662ec3b26fc217e3e05bf9c4f84325234dfb96bf0bf840889e49" [[package]] name = "quoted_printable" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ec282e887b434b68c18fe5c121d38e72a5cf35119b59e54ec5b992ea9c8eb0" +checksum = "640c9bd8497b02465aeef5375144c26062e0dcd5939dfcbb0f5db76cb8c17c73" [[package]] name = "radium" @@ -3890,12 +3547,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "rangemap" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" - [[package]] name = "raw-window-handle" version = "0.5.2" @@ -3942,18 +3593,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", @@ -3962,9 +3613,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -3999,11 +3650,10 @@ dependencies = [ "async-trait", "axum", "base64 0.21.7", - "candid", "chrono", "dotenv", "ethers", - "ff 0.13.0", + "ff", "file-rotate", "function_name", "futures", @@ -4011,8 +3661,6 @@ dependencies = [ "handlebars", "hex", "http 1.1.0", - "ic-agent", - "ic-utils", "lazy_static", "lettre", "num-bigint", @@ -4039,17 +3687,18 @@ dependencies = [ [[package]] name = "relayer-utils" -version = "0.1.0" -source = "git+https://github.com/zkemail/relayer-utils?rev=2c3e9b8#2c3e9b80ae043cd038cd5c55279c60b1578587f7" +version = "0.3.0" +source = "git+https://github.com/zkemail/relayer-utils?rev=fd6c7bf#fd6c7bfd9508185b21d3ee6545b6b0357c068d99" dependencies = [ "anyhow", "base64 0.21.7", "cfdkim", "ethers", - "fancy-regex", + "fancy-regex 0.11.0", "file-rotate", - "halo2curves 0.4.0", + "halo2curves", "hex", + "hmac-sha256", "itertools 0.10.5", "lazy_static", "neon", @@ -4062,7 +3711,6 @@ dependencies = [ "serde", "serde_json", "serde_regex", - "sha2 0.10.8", "slog", "slog-async", "slog-json", @@ -4106,12 +3754,10 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls", - "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams", "web-sys", "webpki-roots", "winreg", @@ -4173,7 +3819,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -4205,7 +3851,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" dependencies = [ "const-oid", - "digest 0.10.7", + "digest", "num-bigint-dig", "num-integer", "num-traits", @@ -4213,7 +3859,7 @@ dependencies = [ "pkcs8", "rand_core", "serde", - "sha2 0.10.8", + "sha2", "signature", "spki", "subtle", @@ -4234,18 +3880,18 @@ checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver 1.0.23", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" dependencies = [ "bitflags 2.6.0", "errno", @@ -4333,7 +3979,7 @@ version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate", "proc-macro2", "quote", "syn 1.0.109", @@ -4369,7 +4015,7 @@ dependencies = [ "hmac", "pbkdf2 0.11.0", "salsa20", - "sha2 0.10.8", + "sha2", ] [[package]] @@ -4398,9 +4044,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -4411,9 +4057,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -4463,9 +4109,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.204" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] @@ -4481,43 +4127,25 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "serde_bytes" -version = "0.11.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_cbor" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" -dependencies = [ - "half", - "serde", -] - [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -4542,22 +4170,11 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.71", -] - [[package]] name = "serde_spanned" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" dependencies = [ "serde", ] @@ -4582,7 +4199,7 @@ checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -4593,20 +4210,7 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", + "digest", ] [[package]] @@ -4617,7 +4221,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -4626,10 +4230,16 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.7", + "digest", "keccak", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -4645,7 +4255,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -4845,7 +4455,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.2.6", + "indexmap 2.5.0", "log", "memchr", "once_cell", @@ -4853,7 +4463,7 @@ dependencies = [ "percent-encoding", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "smallvec", "sqlformat", "thiserror", @@ -4892,7 +4502,7 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "sqlx-core", "sqlx-mysql", "sqlx-postgres", @@ -4915,7 +4525,7 @@ dependencies = [ "byteorder", "bytes", "crc", - "digest 0.10.7", + "digest", "dotenvy", "either", "futures-channel", @@ -4936,7 +4546,7 @@ dependencies = [ "rsa", "serde", "sha1", - "sha2 0.10.8", + "sha2", "smallvec", "sqlx-core", "stringprep", @@ -4975,7 +4585,7 @@ dependencies = [ "serde", "serde_json", "sha1", - "sha2 0.10.8", + "sha2", "smallvec", "sqlx-core", "stringprep", @@ -5007,19 +4617,6 @@ dependencies = [ "urlencoding", ] -[[package]] -name = "stacker" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "winapi", -] - [[package]] name = "static_assertions" version = "1.1.0" @@ -5062,32 +4659,13 @@ dependencies = [ "unicode-properties", ] -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" - [[package]] name = "strum" version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", + "strum_macros", ] [[package]] @@ -5100,7 +4678,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -5109,12 +4687,6 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "subtle-ng" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" - [[package]] name = "svm-rs" version = "0.3.5" @@ -5129,7 +4701,7 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "sha2 0.10.8", + "sha2", "thiserror", "url", "zip", @@ -5148,9 +4720,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.71" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -5209,14 +4781,15 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", - "fastrand 2.1.0", + "fastrand 2.1.1", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5230,33 +4803,24 @@ dependencies = [ "winapi", ] -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - [[package]] name = "thiserror" -version = "1.0.62" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.62" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -5338,32 +4902,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", "socket2 0.5.7", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -5427,58 +4990,36 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.14" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.15", + "toml_edit", ] [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.22.15" +version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.5.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.13", + "winnow", ] [[package]] @@ -5515,15 +5056,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -5545,7 +5086,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -5638,12 +5179,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "typed-arena" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" - [[package]] name = "typenum" version = "1.17.0" @@ -5697,9 +5232,9 @@ dependencies = [ [[package]] name = "unicode-properties" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" +checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" [[package]] name = "unicode-segmentation" @@ -5707,17 +5242,11 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" -[[package]] -name = "unicode-width" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" - [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" [[package]] name = "unicode_categories" @@ -5804,9 +5333,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "void" @@ -5847,11 +5376,12 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "serde", "serde_json", "wasm-bindgen-macro", @@ -5859,24 +5389,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -5886,9 +5416,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5896,31 +5426,32 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wasm-bindgen-test" -version = "0.3.42" +version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bf62a58e0780af3e852044583deee40983e5886da43a271dd772379987667b" +checksum = "68497a05fb21143a08a7d24fc81763384a3072ee43c44e86aad1744d6adef9d9" dependencies = [ "console_error_panic_hook", "js-sys", + "minicov", "scoped-tls", "wasm-bindgen", "wasm-bindgen-futures", @@ -5929,33 +5460,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.42" +version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f89739351a2e03cb94beb799d47fb2cac01759b40ec441f7de39b00cbf7ef0" +checksum = "4b8220be1fa9e4c889b30fd207d4906657e7e90b12e0e6b0c8b8d8709f5de021" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", -] - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", + "syn 2.0.77", ] [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -6018,11 +5536,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -6067,6 +5585,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -6247,18 +5774,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.6.13" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] @@ -6313,6 +5831,7 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] @@ -6324,7 +5843,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.77", ] [[package]] @@ -6355,11 +5874,11 @@ dependencies = [ [[package]] name = "zk-regex-apis" -version = "2.1.0" -source = "git+https://github.com/zkemail/zk-regex.git?branch=main#279d77f774623b4ca50cf4322985f51f60c5a603" +version = "2.1.1" +source = "git+https://github.com/zkemail/zk-regex.git#3b626316b07081378ffdca0d36ed2bec6df5b55a" dependencies = [ - "fancy-regex", - "itertools 0.10.5", + "fancy-regex 0.13.0", + "itertools 0.13.0", "js-sys", "serde", "serde-wasm-bindgen", @@ -6390,9 +5909,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.12+zstd.1.5.6" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config", diff --git a/packages/circuits/package.json b/packages/circuits/package.json index f66ed9bc..33981fdb 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -12,7 +12,7 @@ "dependencies": { "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.2.9", + "@zk-email/relayer-utils": "^0.3.0", "commander": "^11.0.0", "snarkjs": "^0.7.0" }, diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 2ce3120e..8abc863d 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -24,7 +24,7 @@ serde_json = "1.0.68" tiny_http = "0.12.0" lettre = { version = "0.10.4", features = ["tokio1", "tokio1-native-tls"] } ethers = { version = "2.0.10", features = ["abigen"] } -relayer-utils = { git = "https://github.com/zkemail/relayer-utils", rev = "2c3e9b8" } +relayer-utils = { git = "https://github.com/zkemail/relayer-utils", rev = "fd6c7bf" } futures = "0.3.28" sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } regex = "1.10.2" @@ -39,9 +39,6 @@ ff = { version = "0.13.0", default-features = false, features = ["std"] } async-trait = "0.1.36" handlebars = "4.4.0" graphql_client = { version = "0.13.0", features = ["reqwest"] } -ic-utils = { version = "0.30.0" } -ic-agent = { version = "0.30.0", features = ["pem", "reqwest"] } -candid = "0.9.11" lazy_static = "1.4" slog = { version = "2.7.0", features = [ "max_level_trace", diff --git a/packages/relayer/src/abis/email_account_recovery.rs b/packages/relayer/src/abis/email_account_recovery.rs index 90b7a195..86e02813 100644 --- a/packages/relayer/src/abis/email_account_recovery.rs +++ b/packages/relayer/src/abis/email_account_recovery.rs @@ -483,28 +483,6 @@ pub mod email_account_recovery { }, ], ), - ( - ::std::borrow::ToOwned::to_owned("proxyBytecodeHash"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proxyBytecodeHash"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), ( ::std::borrow::ToOwned::to_owned("recoverySubjectTemplates"), ::std::vec![ @@ -776,14 +754,6 @@ pub mod email_account_recovery { .method_hash([201, 250, 167, 197], recovered_account) .expect("method not found (this should never happen)") } - ///Calls the contract's `proxyBytecodeHash` (0x85f60f7e) function - pub fn proxy_bytecode_hash( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([133, 246, 15, 126], ()) - .expect("method not found (this should never happen)") - } ///Calls the contract's `recoverySubjectTemplates` (0x3e91cdcd) function pub fn recovery_subject_templates( &self, @@ -1054,19 +1024,6 @@ pub mod email_account_recovery { pub struct IsActivatedCall { pub recovered_account: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `proxyBytecodeHash` function with signature `proxyBytecodeHash()` and selector `0x85f60f7e` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "proxyBytecodeHash", abi = "proxyBytecodeHash()")] - pub struct ProxyBytecodeHashCall; ///Container type for all input parameters for the `recoverySubjectTemplates` function with signature `recoverySubjectTemplates()` and selector `0x3e91cdcd` #[derive( Clone, @@ -1127,7 +1084,6 @@ pub mod email_account_recovery { HandleAcceptance(HandleAcceptanceCall), HandleRecovery(HandleRecoveryCall), IsActivated(IsActivatedCall), - ProxyBytecodeHash(ProxyBytecodeHashCall), RecoverySubjectTemplates(RecoverySubjectTemplatesCall), Verifier(VerifierCall), VerifierAddr(VerifierAddrCall), @@ -1207,11 +1163,6 @@ pub mod email_account_recovery { ) { return Ok(Self::IsActivated(decoded)); } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ProxyBytecodeHash(decoded)); - } if let Ok(decoded) = ::decode( data, ) { @@ -1273,9 +1224,6 @@ pub mod email_account_recovery { Self::IsActivated(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::ProxyBytecodeHash(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::RecoverySubjectTemplates(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -1321,7 +1269,6 @@ pub mod email_account_recovery { Self::HandleAcceptance(element) => ::core::fmt::Display::fmt(element, f), Self::HandleRecovery(element) => ::core::fmt::Display::fmt(element, f), Self::IsActivated(element) => ::core::fmt::Display::fmt(element, f), - Self::ProxyBytecodeHash(element) => ::core::fmt::Display::fmt(element, f), Self::RecoverySubjectTemplates(element) => { ::core::fmt::Display::fmt(element, f) } @@ -1408,11 +1355,6 @@ pub mod email_account_recovery { Self::IsActivated(value) } } - impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: ProxyBytecodeHashCall) -> Self { - Self::ProxyBytecodeHash(value) - } - } impl ::core::convert::From for EmailAccountRecoveryCalls { fn from(value: RecoverySubjectTemplatesCall) -> Self { @@ -1567,18 +1509,6 @@ pub mod email_account_recovery { Hash )] pub struct IsActivatedReturn(pub bool); - ///Container type for all return fields from the `proxyBytecodeHash` function with signature `proxyBytecodeHash()` and selector `0x85f60f7e` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ProxyBytecodeHashReturn(pub [u8; 32]); ///Container type for all return fields from the `recoverySubjectTemplates` function with signature `recoverySubjectTemplates()` and selector `0x3e91cdcd` #[derive( Clone, diff --git a/packages/relayer/src/modules/dkim.rs b/packages/relayer/src/modules/dkim.rs index 1be188ef..31019f74 100644 --- a/packages/relayer/src/modules/dkim.rs +++ b/packages/relayer/src/modules/dkim.rs @@ -3,7 +3,6 @@ use relayer_utils::extract_substr_idxes; use relayer_utils::LOG; use crate::*; -use candid::CandidType; use ethers::types::Bytes; use ethers::utils::hex::FromHex; use ic_agent::agent::http_transport::ReqwestTransport; @@ -18,7 +17,7 @@ pub struct DkimOracleClient<'a> { pub canister: Canister<'a>, } -#[derive(Default, CandidType, Deserialize, Debug, Clone)] +#[derive(Default, Deserialize, Debug, Clone)] pub struct SignedDkimPublicKey { pub selector: String, pub domain: String, diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 46a28c6e..1aa5e796 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -6,7 +6,6 @@ use rand::Rng; use relayer_utils::LOG; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; -use slog::log; use std::str; #[derive(Serialize, Deserialize)] diff --git a/yarn.lock b/yarn.lock index 794c67da..d04a1edd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.2.0": version "2.3.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -12,7 +12,7 @@ "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: "@babel/highlight" "^7.24.7" @@ -20,12 +20,12 @@ "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2", "@babel/compat-data@^7.25.4": version "7.25.4" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.22.5", "@babel/core@^7.23.9": version "7.25.2" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" @@ -44,26 +44,26 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.25.0", "@babel/generator@^7.25.4", "@babel/generator@^7.7.2": - version "7.25.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz#b31cf05b3fe8c32d206b6dad03bb0aacbde73450" - integrity sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w== +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== dependencies: - "@babel/types" "^7.25.4" + "@babel/types" "^7.25.6" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== dependencies: "@babel/types" "^7.24.7" "@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== dependencies: "@babel/traverse" "^7.24.7" @@ -71,7 +71,7 @@ "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": version "7.25.2" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: "@babel/compat-data" "^7.25.2" @@ -82,7 +82,7 @@ "@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.0", "@babel/helper-create-class-features-plugin@^7.25.4": version "7.25.4" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" @@ -95,7 +95,7 @@ "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0", "@babel/helper-create-regexp-features-plugin@^7.25.2": version "7.25.2" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" @@ -104,7 +104,7 @@ "@babel/helper-define-polyfill-provider@^0.6.2": version "0.6.2" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== dependencies: "@babel/helper-compilation-targets" "^7.22.6" @@ -115,7 +115,7 @@ "@babel/helper-member-expression-to-functions@^7.24.8": version "7.24.8" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== dependencies: "@babel/traverse" "^7.24.8" @@ -123,7 +123,7 @@ "@babel/helper-module-imports@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== dependencies: "@babel/traverse" "^7.24.7" @@ -131,7 +131,7 @@ "@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": version "7.25.2" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== dependencies: "@babel/helper-module-imports" "^7.24.7" @@ -141,19 +141,19 @@ "@babel/helper-optimise-call-expression@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== dependencies: "@babel/types" "^7.24.7" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.24.8" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== "@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": version "7.25.0" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" @@ -162,7 +162,7 @@ "@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": version "7.25.0" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== dependencies: "@babel/helper-member-expression-to-functions" "^7.24.8" @@ -171,7 +171,7 @@ "@babel/helper-simple-access@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== dependencies: "@babel/traverse" "^7.24.7" @@ -179,7 +179,7 @@ "@babel/helper-skip-transparent-expression-wrappers@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== dependencies: "@babel/traverse" "^7.24.7" @@ -187,22 +187,22 @@ "@babel/helper-string-parser@^7.24.8": version "7.24.8" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== "@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": version "7.24.8" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== "@babel/helper-wrap-function@^7.25.0": version "7.25.0" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== dependencies: "@babel/template" "^7.25.0" @@ -210,16 +210,16 @@ "@babel/types" "^7.25.0" "@babel/helpers@^7.25.0": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" - integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== dependencies: "@babel/template" "^7.25.0" - "@babel/types" "^7.25.0" + "@babel/types" "^7.25.6" "@babel/highlight@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== dependencies: "@babel/helper-validator-identifier" "^7.24.7" @@ -227,16 +227,16 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.4": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz#af4f2df7d02440286b7de57b1c21acfb2a6f257a" - integrity sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== dependencies: - "@babel/types" "^7.25.4" + "@babel/types" "^7.25.6" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": version "7.25.3" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== dependencies: "@babel/helper-plugin-utils" "^7.24.8" @@ -244,21 +244,21 @@ "@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": version "7.25.0" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== dependencies: "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": version "7.25.0" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== dependencies: "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -267,7 +267,7 @@ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": version "7.25.0" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== dependencies: "@babel/helper-plugin-utils" "^7.24.8" @@ -275,152 +275,152 @@ "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-import-assertions@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" - integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz#bb918905c58711b86f9710d74a3744b6c56573b5" + integrity sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" - integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" + integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.24.7", "@babel/plugin-syntax-jsx@^7.7.2": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.24.7", "@babel/plugin-syntax-typescript@^7.7.2": version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== dependencies: "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -428,14 +428,14 @@ "@babel/plugin-transform-arrow-functions@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-async-generator-functions@^7.25.4": version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz#2afd4e639e2d055776c9f091b6c0c180ed8cf083" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz#2afd4e639e2d055776c9f091b6c0c180ed8cf083" integrity sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg== dependencies: "@babel/helper-plugin-utils" "^7.24.8" @@ -445,7 +445,7 @@ "@babel/plugin-transform-async-to-generator@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== dependencies: "@babel/helper-module-imports" "^7.24.7" @@ -454,21 +454,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-block-scoping@^7.25.0": version "7.25.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== dependencies: "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-class-properties@^7.25.4": version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== dependencies: "@babel/helper-create-class-features-plugin" "^7.25.4" @@ -476,7 +476,7 @@ "@babel/plugin-transform-class-static-block@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.24.7" @@ -485,7 +485,7 @@ "@babel/plugin-transform-classes@^7.25.4": version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz#d29dbb6a72d79f359952ad0b66d88518d65ef89a" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz#d29dbb6a72d79f359952ad0b66d88518d65ef89a" integrity sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" @@ -497,7 +497,7 @@ "@babel/plugin-transform-computed-properties@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -505,14 +505,14 @@ "@babel/plugin-transform-destructuring@^7.24.8": version "7.24.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== dependencies: "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-dotall-regex@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.24.7" @@ -520,14 +520,14 @@ "@babel/plugin-transform-duplicate-keys@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": version "7.25.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.25.0" @@ -535,7 +535,7 @@ "@babel/plugin-transform-dynamic-import@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -543,7 +543,7 @@ "@babel/plugin-transform-exponentiation-operator@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" @@ -551,7 +551,7 @@ "@babel/plugin-transform-export-namespace-from@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -559,7 +559,7 @@ "@babel/plugin-transform-for-of@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -567,7 +567,7 @@ "@babel/plugin-transform-function-name@^7.25.1": version "7.25.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== dependencies: "@babel/helper-compilation-targets" "^7.24.8" @@ -576,7 +576,7 @@ "@babel/plugin-transform-json-strings@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -584,14 +584,14 @@ "@babel/plugin-transform-literals@^7.25.2": version "7.25.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== dependencies: "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-logical-assignment-operators@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -599,14 +599,14 @@ "@babel/plugin-transform-member-expression-literals@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-modules-amd@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== dependencies: "@babel/helper-module-transforms" "^7.24.7" @@ -614,7 +614,7 @@ "@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8": version "7.24.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== dependencies: "@babel/helper-module-transforms" "^7.24.8" @@ -623,7 +623,7 @@ "@babel/plugin-transform-modules-systemjs@^7.25.0": version "7.25.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== dependencies: "@babel/helper-module-transforms" "^7.25.0" @@ -633,7 +633,7 @@ "@babel/plugin-transform-modules-umd@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== dependencies: "@babel/helper-module-transforms" "^7.24.7" @@ -641,7 +641,7 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.24.7" @@ -649,14 +649,14 @@ "@babel/plugin-transform-new-target@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -664,7 +664,7 @@ "@babel/plugin-transform-numeric-separator@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -672,7 +672,7 @@ "@babel/plugin-transform-object-rest-spread@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== dependencies: "@babel/helper-compilation-targets" "^7.24.7" @@ -682,7 +682,7 @@ "@babel/plugin-transform-object-super@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -690,7 +690,7 @@ "@babel/plugin-transform-optional-catch-binding@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -698,7 +698,7 @@ "@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": version "7.24.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== dependencies: "@babel/helper-plugin-utils" "^7.24.8" @@ -707,14 +707,14 @@ "@babel/plugin-transform-parameters@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-private-methods@^7.25.4": version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz#9bbefbe3649f470d681997e0b64a4b254d877242" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz#9bbefbe3649f470d681997e0b64a4b254d877242" integrity sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw== dependencies: "@babel/helper-create-class-features-plugin" "^7.25.4" @@ -722,7 +722,7 @@ "@babel/plugin-transform-private-property-in-object@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" @@ -732,28 +732,28 @@ "@babel/plugin-transform-property-literals@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-react-display-name@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-react-jsx-development@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== dependencies: "@babel/plugin-transform-react-jsx" "^7.24.7" "@babel/plugin-transform-react-jsx@^7.24.7": version "7.25.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" @@ -764,7 +764,7 @@ "@babel/plugin-transform-react-pure-annotations@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" @@ -772,7 +772,7 @@ "@babel/plugin-transform-regenerator@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -780,21 +780,21 @@ "@babel/plugin-transform-reserved-words@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-shorthand-properties@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-spread@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -802,28 +802,28 @@ "@babel/plugin-transform-sticky-regex@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-template-literals@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-typeof-symbol@^7.24.8": version "7.24.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== dependencies: "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-typescript@^7.24.7": version "7.25.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add" integrity sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A== dependencies: "@babel/helper-annotate-as-pure" "^7.24.7" @@ -834,14 +834,14 @@ "@babel/plugin-transform-unicode-escapes@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-unicode-property-regex@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.24.7" @@ -849,7 +849,7 @@ "@babel/plugin-transform-unicode-regex@^7.24.7": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.24.7" @@ -857,7 +857,7 @@ "@babel/plugin-transform-unicode-sets-regex@^7.25.4": version "7.25.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz#be664c2a0697ffacd3423595d5edef6049e8946c" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz#be664c2a0697ffacd3423595d5edef6049e8946c" integrity sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.25.2" @@ -865,7 +865,7 @@ "@babel/preset-env@^7.22.2", "@babel/preset-env@^7.22.20": version "7.25.4" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz#be23043d43a34a2721cd0f676c7ba6f1481f6af6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.4.tgz#be23043d43a34a2721cd0f676c7ba6f1481f6af6" integrity sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw== dependencies: "@babel/compat-data" "^7.25.4" @@ -954,7 +954,7 @@ "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -963,7 +963,7 @@ "@babel/preset-react@^7.22.0": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -975,7 +975,7 @@ "@babel/preset-typescript@^7.21.5", "@babel/preset-typescript@^7.23.0": version "7.24.7" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" @@ -986,19 +986,19 @@ "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.8.4": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz#6ef37d678428306e7d75f054d5b1bdb8cf8aa8ee" - integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== dependencies: regenerator-runtime "^0.14.0" "@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.3.3": version "7.25.0" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== dependencies: "@babel/code-frame" "^7.24.7" @@ -1006,22 +1006,22 @@ "@babel/types" "^7.25.0" "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.4": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz#648678046990f2957407e3086e97044f13c3e18e" - integrity sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.4" - "@babel/parser" "^7.25.4" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" "@babel/template" "^7.25.0" - "@babel/types" "^7.25.4" + "@babel/types" "^7.25.6" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.25.4" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz#6bcb46c72fdf1012a209d016c07f769e10adcb5f" - integrity sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== dependencies: "@babel/helper-string-parser" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" @@ -1029,12 +1029,12 @@ "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: "@ethersproject/address" "^5.7.0" @@ -1049,7 +1049,7 @@ "@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -1062,7 +1062,7 @@ "@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -1073,7 +1073,7 @@ "@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -1084,14 +1084,14 @@ "@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1099,7 +1099,7 @@ "@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1108,21 +1108,21 @@ "@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/contracts@5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== dependencies: "@ethersproject/abi" "^5.7.0" @@ -1138,7 +1138,7 @@ "@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -1153,7 +1153,7 @@ "@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -1171,7 +1171,7 @@ "@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -1190,7 +1190,7 @@ "@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1198,19 +1198,19 @@ "@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== "@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": version "5.7.1" - resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1218,14 +1218,14 @@ "@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" "@ethersproject/providers@5.7.2": version "5.7.2" - resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -1251,7 +1251,7 @@ "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1259,7 +1259,7 @@ "@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1267,7 +1267,7 @@ "@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1276,7 +1276,7 @@ "@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1288,7 +1288,7 @@ "@ethersproject/solidity@5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -1300,7 +1300,7 @@ "@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1309,7 +1309,7 @@ "@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== dependencies: "@ethersproject/address" "^5.7.0" @@ -1324,7 +1324,7 @@ "@ethersproject/units@5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -1333,7 +1333,7 @@ "@ethersproject/wallet@5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -1354,7 +1354,7 @@ "@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": version "5.7.1" - resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" @@ -1365,7 +1365,7 @@ "@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -1376,12 +1376,12 @@ "@iden3/bigarray@0.0.2": version "0.0.2" - resolved "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz#6fc4ba5be18daf8a26ee393f2fb62b80d98c05e9" + resolved "https://registry.yarnpkg.com/@iden3/bigarray/-/bigarray-0.0.2.tgz#6fc4ba5be18daf8a26ee393f2fb62b80d98c05e9" integrity sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g== "@iden3/binfileutils@0.0.11": version "0.0.11" - resolved "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.11.tgz#9ffbbcc1279f2b2182bb6dcff4eee8a5b2167911" + resolved "https://registry.yarnpkg.com/@iden3/binfileutils/-/binfileutils-0.0.11.tgz#9ffbbcc1279f2b2182bb6dcff4eee8a5b2167911" integrity sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA== dependencies: fastfile "0.0.20" @@ -1389,7 +1389,7 @@ "@iden3/binfileutils@0.0.12": version "0.0.12" - resolved "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.12.tgz#3772552f57551814ff606fa68ea1e0ef52795ce3" + resolved "https://registry.yarnpkg.com/@iden3/binfileutils/-/binfileutils-0.0.12.tgz#3772552f57551814ff606fa68ea1e0ef52795ce3" integrity sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ== dependencies: fastfile "0.0.20" @@ -1397,7 +1397,7 @@ "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -1408,12 +1408,12 @@ "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: "@jest/types" "^29.6.3" @@ -1425,7 +1425,7 @@ "@jest/core@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: "@jest/console" "^29.7.0" @@ -1459,7 +1459,7 @@ "@jest/environment@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: "@jest/fake-timers" "^29.7.0" @@ -1469,14 +1469,14 @@ "@jest/expect-utils@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: jest-get-type "^29.6.3" "@jest/expect@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: expect "^29.7.0" @@ -1484,7 +1484,7 @@ "@jest/fake-timers@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: "@jest/types" "^29.6.3" @@ -1496,7 +1496,7 @@ "@jest/globals@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: "@jest/environment" "^29.7.0" @@ -1506,7 +1506,7 @@ "@jest/reporters@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" @@ -1536,14 +1536,14 @@ "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/source-map@^29.6.3": version "29.6.3" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: "@jridgewell/trace-mapping" "^0.3.18" @@ -1552,7 +1552,7 @@ "@jest/test-result@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: "@jest/console" "^29.7.0" @@ -1562,7 +1562,7 @@ "@jest/test-sequencer@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: "@jest/test-result" "^29.7.0" @@ -1572,7 +1572,7 @@ "@jest/transform@^29.7.0": version "29.7.0" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" @@ -1593,7 +1593,7 @@ "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -1605,7 +1605,7 @@ "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -1614,22 +1614,22 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -1637,7 +1637,7 @@ "@mapbox/node-pre-gyp@^1.0": version "1.0.11" - resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== dependencies: detect-libc "^2.0.0" @@ -1652,12 +1652,12 @@ "@matterlabs/zksync-contracts@^0.6.1": version "0.6.1" - resolved "https://registry.npmjs.org/@matterlabs/zksync-contracts/-/zksync-contracts-0.6.1.tgz#39f061959d5890fd0043a2f1ae710f764b172230" + resolved "https://registry.yarnpkg.com/@matterlabs/zksync-contracts/-/zksync-contracts-0.6.1.tgz#39f061959d5890fd0043a2f1ae710f764b172230" integrity sha512-+hucLw4DhGmTmQlXOTEtpboYCaOm/X2VJcWmnW4abNcOgQXEHX+mTxQrxEfPjIZT0ZE6z5FTUrOK9+RgUZwBMQ== "@octokit/rest@^15.9.5": version "15.18.3" - resolved "https://registry.npmjs.org/@octokit/rest/-/rest-15.18.3.tgz#ff4ecbb784ca286c40cc1d568abceda6d99b36fc" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.3.tgz#ff4ecbb784ca286c40cc1d568abceda6d99b36fc" integrity sha512-oHABAvvC83tPIuvUfWRaw9eLThFrCxBgywl+KvEwfTFjoCrMOfEaMh0r39+Ub/EEbV345GJiMzN+zPZ4kqOvbA== dependencies: before-after-hook "^1.1.0" @@ -1672,48 +1672,48 @@ "@openzeppelin/contracts-upgradeable@^5.0.0": version "5.0.2" - resolved "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.2.tgz#3e5321a2ecdd0b206064356798c21225b6ec7105" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.2.tgz#3e5321a2ecdd0b206064356798c21225b6ec7105" integrity sha512-0MmkHSHiW2NRFiT9/r5Lu4eJq5UJ4/tzlOgYXNAIj/ONkQTVnz22pLxDvp4C4uZ9he7ZFvGn3Driptn1/iU7tQ== "@openzeppelin/contracts@^5.0.0": version "5.0.2" - resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.2.tgz#b1d03075e49290d06570b2fd42154d76c2a5d210" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.2.tgz#b1d03075e49290d06570b2fd42154d76c2a5d210" integrity sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA== "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": version "3.0.1" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": version "10.3.0" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" "@solidity-parser/parser@^0.16.0": version "0.16.2" - resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== dependencies: antlr4ts "^0.5.0-alpha.4" "@solidity-parser/parser@^0.18.0": version "0.18.0" - resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== "@types/babel__core@^7.1.14": version "7.20.5" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" @@ -1724,14 +1724,14 @@ "@types/babel__generator@*": version "7.6.8" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" @@ -1739,72 +1739,72 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.20.6" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" "@types/graceful-fs@^4.1.3": version "4.1.9" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.3" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^29.5.4": version "29.5.12" - resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== dependencies: expect "^29.0.0" pretty-format "^29.0.0" "@types/node@*": - version "22.5.1" - resolved "https://registry.npmjs.org/@types/node/-/node-22.5.1.tgz#de01dce265f6b99ed32b295962045d10b5b99560" - integrity sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw== + version "22.5.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.2.tgz#e42344429702e69e28c839a7e16a8262a8086793" + integrity sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg== dependencies: undici-types "~6.19.2" "@types/stack-utils@^2.0.0": version "2.0.3" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/yargs-parser@*": version "21.0.3" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": version "17.0.33" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" "@zk-email/circuits@^6.1.5": version "6.1.5" - resolved "https://registry.npmjs.org/@zk-email/circuits/-/circuits-6.1.5.tgz#53462456638edf97bbc206ead01c302ba11e7850" + resolved "https://registry.yarnpkg.com/@zk-email/circuits/-/circuits-6.1.5.tgz#53462456638edf97bbc206ead01c302ba11e7850" integrity sha512-Hx+R7ARIZ1JLJ6Ba3qqkWdGweOS63P2VyldVgZ5z0KZ5PvgAsM1ka8AUWzq1RFZCmgbluY8yiHLzWREbQm9bOQ== dependencies: "@zk-email/zk-regex-circom" "^2.1.0" @@ -1812,16 +1812,16 @@ "@zk-email/contracts@^6.1.2": version "6.1.5" - resolved "https://registry.npmjs.org/@zk-email/contracts/-/contracts-6.1.5.tgz#979c2aaa30cdcdb7433ff37d74c396df0cb60107" + resolved "https://registry.yarnpkg.com/@zk-email/contracts/-/contracts-6.1.5.tgz#979c2aaa30cdcdb7433ff37d74c396df0cb60107" integrity sha512-1RW3dpYGBQXjmIlcTGMtYsux7FQoR1MezA0D0pssrNEaCO2CuQd6oAxJLpbCxFQWPbujLKn8PiEVcjP+eiGvVw== dependencies: "@openzeppelin/contracts" "^5.0.0" dotenv "^16.3.1" -"@zk-email/relayer-utils@^0.2.9": - version "0.2.9" - resolved "https://registry.npmjs.org/@zk-email/relayer-utils/-/relayer-utils-0.2.9.tgz#81f34cab29a444f56d99a79514afd7759789aa2a" - integrity sha512-QlkGBo0OxxD7I+U1SoS32B8R/bzqd7gI6uhEZZAWEY4lPrMc8NiNeC45xYXHIVYi7olAVn27GpxLnURmL8FrDg== +"@zk-email/relayer-utils@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@zk-email/relayer-utils/-/relayer-utils-0.3.0.tgz#789acca5de52fbc056bfca5d248638c5b0cddc33" + integrity sha512-j555Fgx5BL6comQQe3i+Iqa5i7hR5IyqqNkqwe7xzyJNpXkZEC1Nw3UNXqH1CY3W/nYLR3UyUUWzK4c3zXEjWA== dependencies: "@mapbox/node-pre-gyp" "^1.0" cargo-cp-artifact "^0.1" @@ -1829,7 +1829,7 @@ "@zk-email/zk-regex-circom@^2.1.0": version "2.1.0" - resolved "https://registry.npmjs.org/@zk-email/zk-regex-circom/-/zk-regex-circom-2.1.0.tgz#cc2f1d93fb130a9f8ac88114d3559a296df97538" + resolved "https://registry.yarnpkg.com/@zk-email/zk-regex-circom/-/zk-regex-circom-2.1.0.tgz#cc2f1d93fb130a9f8ac88114d3559a296df97538" integrity sha512-Ayq0Hk4m7w1UHPPx2c5bUWLdKUPnuK62AZFOyiIvA7x4NgRyvjxe+S4D5KFH5FIz4PgEnXVxgscSSbe5p/GCvQ== dependencies: commander "^11.0.0" @@ -1837,31 +1837,31 @@ abbrev@1: version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== aes-js@3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@4, agent-base@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: es6-promisify "^5.0.0" agent-base@6: version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" ajv@^6.12.6: version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1871,7 +1871,7 @@ ajv@^6.12.6: ajv@^8.0.1: version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" @@ -1881,53 +1881,53 @@ ajv@^8.0.1: ansi-colors@^4.1.3: version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.2.1: version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== antlr4@^4.11.0: version "4.13.2" - resolved "https://registry.npmjs.org/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" integrity sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg== antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" - resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -1935,12 +1935,12 @@ anymatch@^3.0.3, anymatch@~3.1.2: "aproba@^1.0.3 || ^2.0.0": version "2.0.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== are-we-there-yet@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== dependencies: delegates "^1.0.0" @@ -1948,51 +1948,51 @@ are-we-there-yet@^2.0.0: argparse@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== ast-parents@^0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" + resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async@^3.2.3: version "3.2.6" - resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" b4a@^1.0.1: version "1.6.6" - resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== babel-jest@^29.5.0, babel-jest@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: "@jest/transform" "^29.7.0" @@ -2005,7 +2005,7 @@ babel-jest@^29.5.0, babel-jest@^29.7.0: babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -2016,7 +2016,7 @@ babel-plugin-istanbul@^6.1.1: babel-plugin-jest-hoist@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" @@ -2026,7 +2026,7 @@ babel-plugin-jest-hoist@^29.6.3: babel-plugin-polyfill-corejs2@^0.4.10: version "0.4.11" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: "@babel/compat-data" "^7.22.6" @@ -2035,7 +2035,7 @@ babel-plugin-polyfill-corejs2@^0.4.10: babel-plugin-polyfill-corejs3@^0.10.6: version "0.10.6" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.2" @@ -2043,14 +2043,14 @@ babel-plugin-polyfill-corejs3@^0.10.6: babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.2" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.2" babel-preset-current-node-syntax@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -2071,7 +2071,7 @@ babel-preset-current-node-syntax@^1.0.0: babel-preset-jest@^29.5.0, babel-preset-jest@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: babel-plugin-jest-hoist "^29.6.3" @@ -2079,22 +2079,22 @@ babel-preset-jest@^29.5.0, babel-preset-jest@^29.6.3: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bech32@1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== before-after-hook@^1.1.0: version "1.4.0" - resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== bfj@^7.0.2: version "7.1.0" - resolved "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== dependencies: bluebird "^3.7.2" @@ -2105,12 +2105,12 @@ bfj@^7.0.2: binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== blake-hash@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" + resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w== dependencies: node-addon-api "^3.0.0" @@ -2119,7 +2119,7 @@ blake-hash@^2.0.0: blake2b-wasm@^2.4.0: version "2.4.0" - resolved "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== dependencies: b4a "^1.0.1" @@ -2127,7 +2127,7 @@ blake2b-wasm@^2.4.0: blake2b@^2.1.3: version "2.1.4" - resolved "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" + resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== dependencies: blake2b-wasm "^2.4.0" @@ -2135,22 +2135,22 @@ blake2b@^2.1.3: bluebird@^3.7.2: version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.11.9: version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.2.1: version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2158,31 +2158,31 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.3, braces@~3.0.2: version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" brorand@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-stdout@^1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserslist@^4.23.1, browserslist@^4.23.3: version "4.23.3" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: caniuse-lite "^1.0.30001646" @@ -2192,31 +2192,31 @@ browserslist@^4.23.1, browserslist@^4.23.3: bs-logger@^0.2.6: version "0.2.6" - resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: fast-json-stable-stringify "2.x" bser@2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" btoa-lite@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA== buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== call-bind@^1.0.2, call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -2227,32 +2227,32 @@ call-bind@^1.0.2, call-bind@^1.0.7: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001646: - version "1.0.30001653" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz#b8af452f8f33b1c77f122780a4aecebea0caca56" - integrity sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw== + version "1.0.30001655" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f" + integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg== cargo-cp-artifact@^0.1: version "0.1.9" - resolved "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.9.tgz#32264a0a48109e26c48da334daff9a1da9d9b7c8" + resolved "https://registry.yarnpkg.com/cargo-cp-artifact/-/cargo-cp-artifact-0.1.9.tgz#32264a0a48109e26c48da334daff9a1da9d9b7c8" integrity sha512-6F+UYzTaGB+awsTXg0uSJA1/b/B3DDJzpKVRu0UmyI7DmNeaAl2RFHuTGIN6fEgpadRxoXGb7gbC1xo4C3IdyA== chai@^4.3.6, chai@^4.3.7: version "4.5.0" - resolved "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== dependencies: assertion-error "^1.1.0" @@ -2265,7 +2265,7 @@ chai@^4.3.6, chai@^4.3.7: chalk@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -2274,7 +2274,7 @@ chalk@^2.4.2: chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2282,29 +2282,29 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== check-error@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== dependencies: get-func-name "^2.0.2" check-types@^11.2.3: version "11.2.3" - resolved "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== child_process@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz#b1f7e7fc73d25e7fd1d455adc94e143830182b5a" + resolved "https://registry.yarnpkg.com/child_process/-/child_process-1.0.2.tgz#b1f7e7fc73d25e7fd1d455adc94e143830182b5a" integrity sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g== chokidar@^3.5.3: version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -2319,31 +2319,31 @@ chokidar@^3.5.3: chownr@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== circom_runtime@0.1.21: version "0.1.21" - resolved "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.21.tgz#0ee93bb798b5afb8ecec30725ed14d94587a999b" + resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.1.21.tgz#0ee93bb798b5afb8ecec30725ed14d94587a999b" integrity sha512-qTkud630B/GK8y76hnOaaS1aNuF6prfV0dTrkeRsiJKnlP1ryQbP2FWLgDOPqn6aKyaPlam+Z+DTbBhkEzh8dA== dependencies: ffjavascript "0.2.56" circom_runtime@0.1.25: version "0.1.25" - resolved "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.25.tgz#62a33b371f4633f30238db7a326c43d988e3a170" + resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.1.25.tgz#62a33b371f4633f30238db7a326c43d988e3a170" integrity sha512-xBGsBFF5Uv6AKvbpgExYqpHfmfawH2HKe+LyjfKSRevqEV8u63i9KGHVIILsbJNW+0c5bm/66f0PUYQ7qZSkJA== dependencies: ffjavascript "0.3.0" circom_tester@^0.0.19: version "0.0.19" - resolved "https://registry.npmjs.org/circom_tester/-/circom_tester-0.0.19.tgz#e8bed494d080f8186bd0ac6571755d00ccec83bd" + resolved "https://registry.yarnpkg.com/circom_tester/-/circom_tester-0.0.19.tgz#e8bed494d080f8186bd0ac6571755d00ccec83bd" integrity sha512-SNHaBsGxcBH6XsVWfsRbRPA7NF8m8AMKJI9dtJJCFGUtOTT2+zsoIqAwi50z6XCnO4TtjyXq7AeXa1PLHqT0tw== dependencies: chai "^4.3.6" @@ -2357,12 +2357,12 @@ circom_tester@^0.0.19: circomlib@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/circomlib/-/circomlib-2.0.5.tgz#183c703e53ed7d011811842dbeeeb9819f4cc1d6" + resolved "https://registry.yarnpkg.com/circomlib/-/circomlib-2.0.5.tgz#183c703e53ed7d011811842dbeeeb9819f4cc1d6" integrity sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A== circomlibjs@^0.1.2: version "0.1.7" - resolved "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" + resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" integrity sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg== dependencies: blake-hash "^2.0.0" @@ -2372,12 +2372,12 @@ circomlibjs@^0.1.2: cjs-module-lexer@^1.0.0: version "1.4.0" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz#677de7ed7efff67cc40c9bf1897fea79d41b5215" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz#677de7ed7efff67cc40c9bf1897fea79d41b5215" integrity sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g== cliui@^7.0.2: version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -2386,7 +2386,7 @@ cliui@^7.0.2: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -2395,83 +2395,83 @@ cliui@^8.0.1: co@^4.6.0: version "4.6.0" - resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-support@^1.1.2: version "1.1.3" - resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== commander@^10.0.0: version "10.0.1" - resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^11.0.0: version "11.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== commander@^2.17.0: version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== core-js-compat@^3.37.1, core-js-compat@^3.38.0: version "3.38.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== dependencies: browserslist "^4.23.3" cosmiconfig@^8.0.0: version "8.3.6" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: import-fresh "^3.3.0" @@ -2481,7 +2481,7 @@ cosmiconfig@^8.0.0: create-jest@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== dependencies: "@jest/types" "^29.6.3" @@ -2494,7 +2494,7 @@ create-jest@^29.7.0: cross-spawn@^6.0.0: version "6.0.5" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -2505,7 +2505,7 @@ cross-spawn@^6.0.0: cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -2514,55 +2514,55 @@ cross-spawn@^7.0.3: debug@3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.5: version "4.3.6" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" debug@^3.1.0: version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== dedent@^1.0.0: version "1.5.3" - resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deep-eql@^4.1.3: version "4.1.4" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== dependencies: type-detect "^4.0.0" deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -2571,32 +2571,32 @@ define-data-property@^1.1.4: delegates@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== detect-libc@^2.0.0: version "2.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== diff-sequences@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== diff@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dotenv@^16.3.1: version "16.4.5" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== "ds-test@https://github.com/dapphub/ds-test": @@ -2605,19 +2605,19 @@ dotenv@^16.3.1: ejs@^3.1.10, ejs@^3.1.6: version "3.1.10" - resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" electron-to-chromium@^1.5.4: version "1.5.13" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== elliptic@6.5.4: version "6.5.4" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -2630,75 +2630,75 @@ elliptic@6.5.4: emittery@^0.13.1: version "0.13.1" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es6-promise@^4.0.3: version "4.2.8" - resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== es6-promisify@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== dependencies: es6-promise "^4.0.3" escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^1.8.1: version "1.14.3" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" @@ -2710,27 +2710,27 @@ escodegen@^1.8.1: esprima@1.2.2: version "1.2.2" - resolved "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^4.2.0: version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== ethers@^5.5.1: version "5.7.2" - resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" @@ -2766,7 +2766,7 @@ ethers@^5.5.1: execa@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: cross-spawn "^6.0.0" @@ -2779,7 +2779,7 @@ execa@^1.0.0: execa@^5.0.0: version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -2794,12 +2794,12 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expect@^29.0.0, expect@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: "@jest/expect-utils" "^29.7.0" @@ -2810,44 +2810,44 @@ expect@^29.0.0, expect@^29.7.0: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.2.0: version "1.3.0" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-uri@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== fastfile@0.0.20: version "0.0.20" - resolved "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz#794a143d58cfda2e24c298e5ef619c748c8a1879" + resolved "https://registry.yarnpkg.com/fastfile/-/fastfile-0.0.20.tgz#794a143d58cfda2e24c298e5ef619c748c8a1879" integrity sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA== fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" ffjavascript@0.2.56: version "0.2.56" - resolved "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.56.tgz#3509f98fcbd3e44ea93cd23519071b76d6eae433" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.56.tgz#3509f98fcbd3e44ea93cd23519071b76d6eae433" integrity sha512-em6G5Lrj7ucIqj4TYEgyoHs/j99Urwwqa4+YxEVY2hggnpRimVj+noX5pZQTxI1pvtiekZI4rG65JBf0xraXrg== dependencies: wasmbuilder "0.0.16" @@ -2856,7 +2856,7 @@ ffjavascript@0.2.56: ffjavascript@0.3.0, ffjavascript@^0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.0.tgz#442cd8fbb1ee4cbb1be9d26fd7b2951a1ea45d6a" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.0.tgz#442cd8fbb1ee4cbb1be9d26fd7b2951a1ea45d6a" integrity sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ== dependencies: wasmbuilder "0.0.16" @@ -2865,7 +2865,7 @@ ffjavascript@0.3.0, ffjavascript@^0.3.0: ffjavascript@^0.2.45, ffjavascript@^0.2.48, ffjavascript@^0.2.56, ffjavascript@^0.2.59: version "0.2.63" - resolved "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.63.tgz#0c1216a1f123dc9181df69e144473704d2f115eb" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.63.tgz#0c1216a1f123dc9181df69e144473704d2f115eb" integrity sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A== dependencies: wasmbuilder "0.0.16" @@ -2874,21 +2874,21 @@ ffjavascript@^0.2.45, ffjavascript@^0.2.48, ffjavascript@^0.2.56, ffjavascript@^ filelist@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: minimatch "^5.0.1" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -2896,7 +2896,7 @@ find-up@^4.0.0, find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -2904,50 +2904,50 @@ find-up@^5.0.0: flat@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== fnv-plus@^1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/fnv-plus/-/fnv-plus-1.3.1.tgz#c34cb4572565434acb08ba257e4044ce2b006d67" + resolved "https://registry.yarnpkg.com/fnv-plus/-/fnv-plus-1.3.1.tgz#c34cb4572565434acb08ba257e4044ce2b006d67" integrity sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" "forge-std@https://github.com/foundry-rs/forge-std": version "1.9.2" - resolved "https://github.com/foundry-rs/forge-std#58d30519826c313ce47345abedfdc07679e944d1" + resolved "https://github.com/foundry-rs/forge-std#4695fac44b2934aaa6d7150e2eaf0256fdc566a7" fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== gauge@^3.0.0: version "3.0.2" - resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== dependencies: aproba "^1.0.3 || ^2.0.0" @@ -2962,22 +2962,22 @@ gauge@^3.0.0: gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -2988,31 +2988,31 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stream@^4.0.0: version "4.1.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob@^7.1.3, glob@^7.1.4: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -3024,7 +3024,7 @@ glob@^7.1.3, glob@^7.1.4: glob@^8.0.3, glob@^8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" @@ -3035,63 +3035,63 @@ glob@^8.0.3, glob@^8.1.0: globals@^11.1.0: version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== gopd@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.0.1: version "1.0.3" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" has-unicode@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" @@ -3099,19 +3099,19 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" he@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" @@ -3120,17 +3120,17 @@ hmac-drbg@^1.0.1: hoopy@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-proxy-agent@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== dependencies: agent-base "4" @@ -3138,7 +3138,7 @@ http-proxy-agent@^2.1.0: https-proxy-agent@^2.2.0: version "2.2.4" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== dependencies: agent-base "^4.3.0" @@ -3146,7 +3146,7 @@ https-proxy-agent@^2.2.0: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -3154,17 +3154,17 @@ https-proxy-agent@^5.0.0: human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== ignore@^5.2.4: version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -3172,7 +3172,7 @@ import-fresh@^3.3.0: import-local@^3.0.2: version "3.2.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" @@ -3180,12 +3180,12 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -3193,12 +3193,12 @@ inflight@^1.0.4: inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== is-arguments@^1.0.4: version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -3206,102 +3206,102 @@ is-arguments@^1.0.4: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-callable@^1.1.3: version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.13.0: version "2.15.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: hasown "^2.0.2" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-generator-function@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-stream@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typed-array@^1.1.3: version "1.1.13" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: which-typed-array "^1.1.14" is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4: version "5.2.1" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -3312,7 +3312,7 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-instrument@^6.0.0: version "6.0.3" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== dependencies: "@babel/core" "^7.23.9" @@ -3323,7 +3323,7 @@ istanbul-lib-instrument@^6.0.0: istanbul-lib-report@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -3332,7 +3332,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -3341,7 +3341,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.1.3: version "3.1.7" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" @@ -3349,7 +3349,7 @@ istanbul-reports@^3.1.3: jake@^10.8.5: version "10.9.2" - resolved "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" @@ -3359,7 +3359,7 @@ jake@^10.8.5: jest-changed-files@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" @@ -3368,7 +3368,7 @@ jest-changed-files@^29.7.0: jest-circus@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: "@jest/environment" "^29.7.0" @@ -3394,7 +3394,7 @@ jest-circus@^29.7.0: jest-cli@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: "@jest/core" "^29.7.0" @@ -3411,7 +3411,7 @@ jest-cli@^29.7.0: jest-config@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" @@ -3439,7 +3439,7 @@ jest-config@^29.7.0: jest-diff@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" @@ -3449,14 +3449,14 @@ jest-diff@^29.7.0: jest-docblock@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" jest-each@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: "@jest/types" "^29.6.3" @@ -3467,7 +3467,7 @@ jest-each@^29.7.0: jest-environment-node@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: "@jest/environment" "^29.7.0" @@ -3479,12 +3479,12 @@ jest-environment-node@^29.7.0: jest-get-type@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: "@jest/types" "^29.6.3" @@ -3503,7 +3503,7 @@ jest-haste-map@^29.7.0: jest-leak-detector@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: jest-get-type "^29.6.3" @@ -3511,7 +3511,7 @@ jest-leak-detector@^29.7.0: jest-matcher-utils@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" @@ -3521,7 +3521,7 @@ jest-matcher-utils@^29.7.0: jest-message-util@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" @@ -3536,7 +3536,7 @@ jest-message-util@^29.7.0: jest-mock@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: "@jest/types" "^29.6.3" @@ -3545,17 +3545,17 @@ jest-mock@^29.7.0: jest-pnp-resolver@^1.2.2: version "1.2.3" - resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== jest-resolve-dependencies@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: jest-regex-util "^29.6.3" @@ -3563,7 +3563,7 @@ jest-resolve-dependencies@^29.7.0: jest-resolve@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" @@ -3578,7 +3578,7 @@ jest-resolve@^29.7.0: jest-runner@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: "@jest/console" "^29.7.0" @@ -3605,7 +3605,7 @@ jest-runner@^29.7.0: jest-runtime@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== dependencies: "@jest/environment" "^29.7.0" @@ -3633,7 +3633,7 @@ jest-runtime@^29.7.0: jest-snapshot@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" @@ -3659,7 +3659,7 @@ jest-snapshot@^29.7.0: jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -3671,7 +3671,7 @@ jest-util@^29.0.0, jest-util@^29.7.0: jest-validate@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: "@jest/types" "^29.6.3" @@ -3683,7 +3683,7 @@ jest-validate@^29.7.0: jest-watcher@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: "@jest/test-result" "^29.7.0" @@ -3697,7 +3697,7 @@ jest-watcher@^29.7.0: jest-worker@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" @@ -3707,7 +3707,7 @@ jest-worker@^29.7.0: jest@^29.5.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: "@jest/core" "^29.7.0" @@ -3717,17 +3717,17 @@ jest@^29.5.0: js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -3735,44 +3735,44 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json5@^2.2.3: version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonpath@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== dependencies: esprima "1.2.2" @@ -3781,17 +3781,17 @@ jsonpath@^1.1.1: kleur@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== leven@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@~0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" @@ -3799,46 +3799,46 @@ levn@~0.3.0: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.memoize@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -3846,62 +3846,62 @@ log-symbols@^4.1.0: logplease@^1.2.15: version "1.2.15" - resolved "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" + resolved "https://registry.yarnpkg.com/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" integrity sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA== loupe@^2.3.6: version "2.3.7" - resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: get-func-name "^2.0.1" lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" macos-release@^2.2.0: version "2.5.1" - resolved "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz#bccac4a8f7b93163a8d163b8ebf385b3c5f55bf9" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.1.tgz#bccac4a8f7b93163a8d163b8ebf385b3c5f55bf9" integrity sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A== make-dir@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-dir@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: semver "^7.5.3" make-error@^1.3.6: version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.12: version "1.0.12" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.4: version "4.0.8" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" @@ -3909,60 +3909,60 @@ micromatch@^4.0.4: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.19: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.6" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" minipass@^3.0.0: version "3.3.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" minipass@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -3970,12 +3970,12 @@ minizlib@^2.1.1: mkdirp@^1.0.3: version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mocha@^10.2.0: version "10.7.3" - resolved "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== dependencies: ansi-colors "^4.1.3" @@ -4001,54 +4001,54 @@ mocha@^10.2.0: ms@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== nanoassert@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-addon-api@^3.0.0: version "3.2.1" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== node-fetch@^2.1.1, node-fetch@^2.6.7: version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-gyp-build@^4.2.2: version "4.8.2" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== "node-pre-gyp-github@git+https://github.com/ultamatt/node-pre-gyp-github.git": @@ -4061,38 +4061,38 @@ node-int64@^0.4.0: node-releases@^2.0.18: version "2.0.18" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== nopt@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== dependencies: abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npmlog@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== dependencies: are-we-there-yet "^2.0.0" @@ -4102,26 +4102,26 @@ npmlog@^5.0.1: object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" optionator@^0.8.1: version "0.8.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -4133,7 +4133,7 @@ optionator@^0.8.1: os-name@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== dependencies: macos-release "^2.2.0" @@ -4141,52 +4141,52 @@ os-name@^3.0.0: p-finally@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -4196,79 +4196,79 @@ parse-json@^5.2.0: path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pirates@^4.0.4: version "4.0.6" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pluralize@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== possible-typed-array-names@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier-plugin-solidity@^1.1.3: version "1.4.1" - resolved "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz#8060baf18853a9e34d2e09e47e87b4f19e15afe9" integrity sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg== dependencies: "@solidity-parser/parser" "^0.18.0" @@ -4276,17 +4276,17 @@ prettier-plugin-solidity@^1.1.3: prettier@^2.8.3: version "2.8.8" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== prettier@^3.0.0: version "3.3.3" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" @@ -4295,7 +4295,7 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: prompts@^2.0.1: version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -4303,7 +4303,7 @@ prompts@^2.0.1: pump@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -4311,17 +4311,17 @@ pump@^3.0.0: punycode@^2.1.0: version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: version "6.1.0" - resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== r1csfile@0.0.41, r1csfile@^0.0.41: version "0.0.41" - resolved "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.41.tgz#e3d2709d36923156dd1fc2db9858987b30c92948" + resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.41.tgz#e3d2709d36923156dd1fc2db9858987b30c92948" integrity sha512-Q1WDF3u1vYeAwjHo4YuddkA8Aq0TulbKjmGm99+Atn13Lf5fTsMZBnBV9T741w8iSyPFG6Uh6sapQby77sREqA== dependencies: "@iden3/bigarray" "0.0.2" @@ -4331,7 +4331,7 @@ r1csfile@0.0.41, r1csfile@^0.0.41: r1csfile@0.0.48: version "0.0.48" - resolved "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.48.tgz#a317fc75407a9da92631666c75bdfc13f0a7835a" + resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.48.tgz#a317fc75407a9da92631666c75bdfc13f0a7835a" integrity sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw== dependencies: "@iden3/bigarray" "0.0.2" @@ -4341,19 +4341,19 @@ r1csfile@0.0.48: randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" react-is@^18.0.0: version "18.3.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -4362,38 +4362,38 @@ readable-stream@^3.6.0: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" regenerate-unicode-properties@^10.1.0: version "10.1.1" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" regexpu-core@^5.3.1: version "5.3.2" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" @@ -4405,46 +4405,46 @@ regexpu-core@^5.3.1: regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve.exports@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.14.2, resolve@^1.20.0: version "1.22.8" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -4453,51 +4453,51 @@ resolve@^1.14.2, resolve@^1.20.0: rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== scrypt-js@3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== semver@^5.5.0: version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: version "7.6.3" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== serialize-javascript@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -4509,46 +4509,46 @@ set-function-length@^1.2.1: shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== signal-exit@^3.0.0, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -4557,7 +4557,7 @@ slice-ansi@^4.0.0: snarkjs@0.5.0: version "0.5.0" - resolved "https://registry.npmjs.org/snarkjs/-/snarkjs-0.5.0.tgz#cf26bf1d3835eb16b4b330a438bad9824837d6b0" + resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.5.0.tgz#cf26bf1d3835eb16b4b330a438bad9824837d6b0" integrity sha512-KWz8mZ2Y+6wvn6GGkQo6/ZlKwETdAGohd40Lzpwp5TUZCn6N6O4Az1SuX1rw/qREGL6Im+ycb19suCFE8/xaKA== dependencies: "@iden3/binfileutils" "0.0.11" @@ -4573,7 +4573,7 @@ snarkjs@0.5.0: snarkjs@^0.7.0: version "0.7.4" - resolved "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.4.tgz#b9ad5813f055ab84d33f1831a6f1f34a71b6cd46" + resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.7.4.tgz#b9ad5813f055ab84d33f1831a6f1f34a71b6cd46" integrity sha512-x4cOCR4YXSyBlLtfnUUwfbZrw8wFd/Y0lk83eexJzKwZB8ELdpH+10ts8YtDsm2/a3WK7c7p514bbE8NpqxW8w== dependencies: "@iden3/binfileutils" "0.0.12" @@ -4589,12 +4589,12 @@ snarkjs@^0.7.0: solady@^0.0.123: version "0.0.123" - resolved "https://registry.npmjs.org/solady/-/solady-0.0.123.tgz#7ef95767c1570e3efde7550da2a8b439b2f413d2" + resolved "https://registry.yarnpkg.com/solady/-/solady-0.0.123.tgz#7ef95767c1570e3efde7550da2a8b439b2f413d2" integrity sha512-F/B8OMCplGsS4FrdPrnEG0xdg8HKede5PwC+Rum8soj/LWxfKckA0p+Uwnlbgey2iI82IHvmSOCNhsdbA+lUrw== solhint@^3.6.1: version "3.6.2" - resolved "https://registry.npmjs.org/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== dependencies: "@solidity-parser/parser" "^0.16.0" @@ -4619,7 +4619,7 @@ solhint@^3.6.1: source-map-support@0.5.13: version "0.5.13" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" @@ -4627,31 +4627,31 @@ source-map-support@0.5.13: source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stack-utils@^2.0.3: version "2.0.6" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" static-eval@2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== dependencies: escodegen "^1.8.1" string-length@^4.0.1: version "4.0.2" - resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -4659,7 +4659,7 @@ string-length@^4.0.1: "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -4668,67 +4668,67 @@ string-length@^4.0.1: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-eof@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== table@^6.8.1: version "6.8.2" - resolved "https://registry.npmjs.org/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== dependencies: ajv "^8.0.1" @@ -4739,7 +4739,7 @@ table@^6.8.1: tar@^6.1.11: version "6.2.1" - resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" @@ -4751,7 +4751,7 @@ tar@^6.1.11: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -4760,51 +4760,51 @@ test-exclude@^6.0.0: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== tmp-promise@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== dependencies: tmp "^0.2.0" tmp@^0.2.0: version "0.2.3" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== tmpl@1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== tryer@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== ts-jest@^29.1.1: version "29.2.5" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== dependencies: bs-logger "^0.2.6" @@ -4819,49 +4819,49 @@ ts-jest@^29.1.1: type-check@~0.3.2: version "0.3.2" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" type-detect@4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-detect@^4.0.0, type-detect@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== typescript@^4.5.4, typescript@^4.8.3: version "4.9.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== underscore@1.12.1: version "1.12.1" - resolved "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== undici-types@~6.19.2: version "6.19.8" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -4869,24 +4869,24 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== universal-user-agent@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" integrity sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q== dependencies: os-name "^3.0.0" update-browserslist-db@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: escalade "^3.1.2" @@ -4894,24 +4894,24 @@ update-browserslist-db@^1.1.0: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-template@^2.0.8: version "2.0.8" - resolved "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== util-deprecate@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util@^0.12.4: version "0.12.5" - resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" @@ -4922,7 +4922,7 @@ util@^0.12.4: v8-to-istanbul@^9.0.1: version "9.3.0" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" @@ -4931,48 +4931,48 @@ v8-to-istanbul@^9.0.1: walker@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" wasmbuilder@0.0.16: version "0.0.16" - resolved "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" + resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA== wasmcurves@0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz#ccfc5a7d3778b6e0768b82a9336c80054f9bc0cf" + resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.0.tgz#ccfc5a7d3778b6e0768b82a9336c80054f9bc0cf" integrity sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA== dependencies: wasmbuilder "0.0.16" wasmcurves@0.2.2: version "0.2.2" - resolved "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" + resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ== dependencies: wasmbuilder "0.0.16" web-worker@1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== web-worker@^1.2.0: version "1.3.0" - resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" integrity sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -4980,7 +4980,7 @@ whatwg-url@^5.0.0: which-typed-array@^1.1.14, which-typed-array@^1.1.2: version "1.1.15" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: available-typed-arrays "^1.0.7" @@ -4991,45 +4991,45 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.2: which@^1.2.9: version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wide-align@^1.1.2: version "1.1.5" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" windows-release@^3.1.0: version "3.3.3" - resolved "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== dependencies: execa "^1.0.0" word-wrap@~1.2.3: version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== workerpool@^6.5.1: version "6.5.1" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -5038,12 +5038,12 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^4.0.2: version "4.0.2" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" @@ -5051,37 +5051,37 @@ write-file-atomic@^4.0.2: ws@7.4.6: version "7.4.6" - resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs-unparser@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -5091,7 +5091,7 @@ yargs-unparser@^2.0.0: yargs@^16.2.0: version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -5104,7 +5104,7 @@ yargs@^16.2.0: yargs@^17.3.1: version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -5117,5 +5117,5 @@ yargs@^17.3.1: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From c88c5742cde5862fd5ee10cd12d2d2603c630372 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Mon, 2 Sep 2024 20:44:11 +0900 Subject: [PATCH 008/121] Add a verifier contract --- packages/circuits/package.json | 1 + packages/circuits/scripts/dev-setup.ts | 23 +- .../contracts/src/utils/Groth16Verifier.sol | 294 +++++------------- packages/contracts/src/utils/Verifier.sol | 4 +- yarn.lock | 4 +- 5 files changed, 105 insertions(+), 221 deletions(-) diff --git a/packages/circuits/package.json b/packages/circuits/package.json index f66ed9bc..d3207bbf 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -4,6 +4,7 @@ "version": "1.0.0", "scripts": { "build": "mkdir -p build && circom src/email_auth.circom --r1cs --wasm --sym -l ../../node_modules -o ./build", + "build-body": "mkdir -p build && circom src/email_auth_with_body_parsing_with_qp_encoding.circom --r1cs --wasm --sym -l ../../node_modules -o ./build", "dev-setup": "NODE_OPTIONS=--max_old_space_size=8192 npx ts-node scripts/dev-setup.ts --output ./build", "gen-input": "NODE_OPTIONS=--max_old_space_size=8192 npx ts-node scripts/gen_input.ts", "verify-proofs": "NODE_OPTIONS=--max_old_space_size=8192 npx ts-node scripts/verify_proofs.ts", diff --git a/packages/circuits/scripts/dev-setup.ts b/packages/circuits/scripts/dev-setup.ts index e8466c31..eed4a613 100644 --- a/packages/circuits/scripts/dev-setup.ts +++ b/packages/circuits/scripts/dev-setup.ts @@ -20,7 +20,8 @@ program "--output ", "Path to the directory storing output files" ) - .option("--silent", "No console logs"); + .option("--silent", "No console logs") + .option("--body", "Enable body parsing"); program.parse(); const args = program.opts(); @@ -140,14 +141,22 @@ async function exec() { await downloadPhase1(phase1Path); log("✓ Phase 1:", phase1Path); - const emailAuthR1csPath = path.join(buildDir, "email_auth.r1cs"); - if (!fs.existsSync(emailAuthR1csPath)) { - throw new Error(`${emailAuthR1csPath} does not exist.`); + if (!args.body) { + const emailAuthR1csPath = path.join(buildDir, "email_auth.r1cs"); + if (!fs.existsSync(emailAuthR1csPath)) { + throw new Error(`${emailAuthR1csPath} does not exist.`); + } + await generateKeys(phase1Path, emailAuthR1csPath, path.join(buildDir, "email_auth.zkey"), path.join(buildDir, "email_auth.vkey"), path.join(buildDir, "Groth16Verifier.sol")); + log("✓ Keys for email auth circuit generated"); + } else { + const emailAuthR1csPath = path.join(buildDir, "email_auth_with_body_parsing_with_qp_encoding.r1cs"); + if (!fs.existsSync(emailAuthR1csPath)) { + throw new Error(`${emailAuthR1csPath} does not exist.`); + } + await generateKeys(phase1Path, emailAuthR1csPath, path.join(buildDir, "email_auth_with_body_parsing_with_qp_encoding.zkey"), path.join(buildDir, "email_auth_with_body_parsing_with_qp_encoding.vkey"), path.join(buildDir, "Groth16BodyParsingVerifier.sol")); + log("✓ Keys for email auth with body parsing circuit generated"); } - await generateKeys(phase1Path, emailAuthR1csPath, path.join(buildDir, "email_auth.zkey"), path.join(buildDir, "email_auth.vkey"), path.join(buildDir, "Groth16Verifier.sol")); - log("✓ Keys for email auth circuit generated"); - } diff --git a/packages/contracts/src/utils/Groth16Verifier.sol b/packages/contracts/src/utils/Groth16Verifier.sol index 914d7dfa..b3b499a2 100644 --- a/packages/contracts/src/utils/Groth16Verifier.sol +++ b/packages/contracts/src/utils/Groth16Verifier.sol @@ -37,126 +37,84 @@ contract Groth16Verifier { uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 12348375662783824431360707906202475009449369812921990201376235771680861701966; - uint256 constant deltax2 = 1390621091717691233659791897033569945783127756008503250856151404215287127098; - uint256 constant deltay1 = 21545653682963288007472972452138234474169143155774752223643789231933860474340; - uint256 constant deltay2 = 10610549897370405036411988417557836327116891506639515374316821127902275605593; + uint256 constant deltax1 = 7512310166790179922504683523654316114051222191831169356747444038269967648305; + uint256 constant deltax2 = 14358591220354673294638423548838009163329059984271248943224595375523946440844; + uint256 constant deltay1 = 10945165491323316120158090062372436583843822551186653547350912773785745492908; + uint256 constant deltay2 = 12977491133002118873088909332652159965708924468719154246248274593582873461934; - uint256 constant IC0x = 5901406458595327327953646561359621442218448144107991955344827840671354857930; - uint256 constant IC0y = 21253883398616811363937453025480398551698716152192802899988370991179418894921; + uint256 constant IC0x = 13963177540950809295782204463516277073432173625654096650299395551650393709604; + uint256 constant IC0y = 15602945741766824338761981015932856359177200661747787110583509305519171311689; - uint256 constant IC1x = 1112924942971302135990579038492068551965379862222416146684206705079782572000; - uint256 constant IC1y = 6845816202276549205403237603547410855545803354942552863847676397548741086071; + uint256 constant IC1x = 13901364820478321928616223034286870916279818972373410460098510478160011053099; + uint256 constant IC1y = 14236131152778024758629670193607195289980506228078730330692122051313154306570; - uint256 constant IC2x = 14146397086704743317768846126489596483634956428235300380826232977310804058751; - uint256 constant IC2y = 19618883007025739156467626277666586024401705866552606313791444982720962403992; + uint256 constant IC2x = 9230583203032536232829062152692285477328633564550620828795526551927932673258; + uint256 constant IC2y = 12823968485634865433296790678185713696956177429058503916497795155602629992619; - uint256 constant IC3x = 3901572409202614942721645284047738923242593674037512752046910139604415193490; - uint256 constant IC3y = 20492449392704526941468738279820790768424887146903635663987211396806301809154; + uint256 constant IC3x = 17639740392526803545767112437667038900196736383732820044731439393404104455892; + uint256 constant IC3y = 185489738400311207281216872971624070048902329723183825977411360815457155921; - uint256 constant IC4x = 18540181064351079043471661082110994395960833330341135578479476830087776228683; - uint256 constant IC4y = 11176005255132390129621080493002450161350701375862520723126575901394028996036; + uint256 constant IC4x = 12069519432129553376683732542057521791951300837387868001349505113926238600603; + uint256 constant IC4y = 5179805167216122560022161376021253470175122378869865440572964817206688034995; - uint256 constant IC5x = 19561918792572579721654605669351975749853953476158354443105355794367963998057; - uint256 constant IC5y = 8218678694141104830016990002861269810060858478661593498963178088127632633272; + uint256 constant IC5x = 13341741969026085479452747303102949204889069730043799331450553531777313415027; + uint256 constant IC5y = 12622154326191207141879122439134936928996883243183804472561540303328627402611; - uint256 constant IC6x = 9430924798221081020093287735191121193795036835461664479209198319741867653703; - uint256 constant IC6y = 8320455794218847878770580093897658145962468495286236900439725456006531945699; + uint256 constant IC6x = 5524249138004641558839056031282734507960291855160204994698994244702630374695; + uint256 constant IC6y = 2838545179481365224586078663128105413457151412717798861182352117115080523068; - uint256 constant IC7x = 5026847283727041400632489144741052290976729570767028644525050581059876916251; - uint256 constant IC7y = 18709603090338372683001965035561848282369713676288357172691730209331905334650; + uint256 constant IC7x = 19554330184893289081351857198918890940131287920028938901123258851925997091096; + uint256 constant IC7y = 21187120635590833154352478658750104019492268925659795328629826170424237790467; - uint256 constant IC8x = 17783950150020738154914534833285662833687830065154708170534593149023190841571; - uint256 constant IC8y = 6711670108831861054349992265875143708175087706665287716580642850559233815182; + uint256 constant IC8x = 7760862852091446869454661318724098439035438362089550104244769932517916868839; + uint256 constant IC8y = 19254393654613960117332409830738981805954756960359620518017135829429172873772; - uint256 constant IC9x = 6456809683101221239825536925658971026995917443342977471616457395354933010826; - uint256 constant IC9y = 2014292748365982904981992383163603273504856743882959093701478470668783800522; + uint256 constant IC9x = 15564940155024906142999107362340815858137284449493640983339345075622293100658; + uint256 constant IC9y = 1617046506300089432116787730161816212709927386986013437340513810060016149022; - uint256 constant IC10x = 6628245325000975286546535223213930648454767286000819266622720989919128655736; - uint256 constant IC10y = 14513751619334179776611945559238333965209884013883320491822197554011245102668; + uint256 constant IC10x = 8761289037800026614344829900088226723021361306934107788103479929938837644308; + uint256 constant IC10y = 18887041123828916694468022436722879291739062402223689213701674861638998067598; - uint256 constant IC11x = 18570424159211943648550772570282559547250130191621494465657111355378707354500; - uint256 constant IC11y = 3142881938352899028782850032628554749777583832256141371247984173352247988131; + uint256 constant IC11x = 15078796297798212555417977593995358910740633024789147595871485081022877594688; + uint256 constant IC11y = 8470804935050612973272335097844258163084303298699216060651895502152836140266; - uint256 constant IC12x = 5223991002378260090449510454796281831282905631623677469960113091483024319301; - uint256 constant IC12y = 9427018011817145184335218137442223127741016816822775509206816206494077869941; + uint256 constant IC12x = 13148554463252000159734437740750147355285467799702838626674782427621833651862; + uint256 constant IC12y = 4154912502683952848865244880904626773017467395251182073432201348576612338512; - uint256 constant IC13x = 17733384847564503082934979078550596341075160377145956961996412508907155849602; - uint256 constant IC13y = 15345500273986785785979010183753446192836470842052033037545791683924216389909; + uint256 constant IC13x = 9971258020291304535684934520409197417844738102841933849336209194551684387260; + uint256 constant IC13y = 11597854766455209249051872024659116726914370916348872165676874573511692371038; - uint256 constant IC14x = 6541603162653988673614876540286498610416711433782997011446804048984497507717; - uint256 constant IC14y = 9471585496716317833911101487553454694761435169521054429602533117895220539092; + uint256 constant IC14x = 2930562317584608077941323563288223695503253706485531251156544883634158242043; + uint256 constant IC14y = 9240840788488657599771118100535077289767006523619812853863860241862442262419; - uint256 constant IC15x = 6574110840837190171512762164893486105535576711656029901056739039814628526912; - uint256 constant IC15y = 12107221022070295505274408663667253928323650746131661962928553805430682213730; + uint256 constant IC15x = 16422784168814990015933552338417309538225820837997155930682270086046353015844; + uint256 constant IC15y = 19869469930650174203989020181864562320111438711593759069952187898326610664818; - uint256 constant IC16x = 2983775925467162306639671044788352921278318217335490557023737802970494396161; - uint256 constant IC16y = 15155657642358487296835454918514213311356981076876734700573166757257484354564; + uint256 constant IC16x = 13790631431800806141462691434744099435298278652239216597838090515088257481073; + uint256 constant IC16y = 5970741811988419030089819655471571807951451817787149436342954581604814989654; - uint256 constant IC17x = 8967042914633055089306636825844718647849951037719728238537295360572488150548; - uint256 constant IC17y = 16316365584620447093615538375124020157614277415345119540410103156547686499616; + uint256 constant IC17x = 14976736427051209441599895542115651186815700359766023720088346036777288255538; + uint256 constant IC17y = 12852402101788491586826305692493329786060447274461406286947282250831762004864; - uint256 constant IC18x = 10539075382040152021577786214341262536565753081943101851679620745620126843721; - uint256 constant IC18y = 4734602432159888257161632785059762380496749946015675717019228118945872853040; + uint256 constant IC18x = 4280125422602481644778681032156727291998269141310669530728230860253156845126; + uint256 constant IC18y = 16682143429272254699133459970696787349636739657860469986526142128107512434480; - uint256 constant IC19x = 16904274081002162388173688128412241495718571792446724759784404749590000812400; - uint256 constant IC19y = 10801084318813806801902242112307629808119029411792686266329164737317751231217; + uint256 constant IC19x = 10147951062270258918013679058779577570351008390025368069146440787810065746771; + uint256 constant IC19y = 5090148640187367354670039734538337475397977849830533292031088125570710070678; - uint256 constant IC20x = 15575787937775277998941372228242544347460724933647624890935023166333401850163; - uint256 constant IC20y = 7296638718677056910701470329118855562874930285186351569007798599358833717218; + uint256 constant IC20x = 578255745441773075639210078803617950558342577360305877996037440974850723995; + uint256 constant IC20y = 12520655905142699409929405181761549544517927774724036032382536924347165049220; - uint256 constant IC21x = 4551313941391400232712859196059035637265126775160423752556164701565012171961; - uint256 constant IC21y = 21401656423982733211718420214626338184514587667446979844631973864641456629261; + uint256 constant IC21x = 3355415877559605146458275122957543229539987007795496380499840576047274644423; + uint256 constant IC21y = 20476643636313926200244212968226317708756519977425220516640115874928427933331; - uint256 constant IC22x = 2935540066773152386094450378156329519379475479888931777862603161088003692041; - uint256 constant IC22y = 3754706265995206762948051647660125270465347882441656302776943004798594006627; + uint256 constant IC22x = 21449378479565844466348985747983272828741700435723692245161366305682834816693; + uint256 constant IC22y = 506562745742676866252077181735736358296299192584367348641528429905789575988; - uint256 constant IC23x = 14941485327978437375521006241254634444037644973379906367567115351627139641414; - uint256 constant IC23y = 10702407562034274430221897944829443699402512693373259167588271091307663372710; + uint256 constant IC23x = 20726751273737403605532121718064449872454430937365235084763999011467146824138; + uint256 constant IC23y = 2569317581613789680208520789013703218069888753995406910612291831117799394742; - uint256 constant IC24x = 8275896680177260146907953439805305572759478043924598922328323793281943403370; - uint256 constant IC24y = 4247674182996730416195978445155055073549714994568066175487529509583649388873; - - uint256 constant IC25x = 5689003246975774737588871342271076456426408075813318043434367952407244465697; - uint256 constant IC25y = 5331139184498747881817447962895230742876804067387026910085264060106931675015; - - uint256 constant IC26x = 9133389296516422045582607363916275184958302548102626374643142889003044665947; - uint256 constant IC26y = 21212127989644328313744743046359043793974008456261367858588476558007302881330; - - uint256 constant IC27x = 1846381662521291690941661313906009843371539776920831630929177290350683400816; - uint256 constant IC27y = 14037588365801936321970551415842797526891505906435930017587651178284699267713; - - uint256 constant IC28x = 9781100104817210330466721014252420484088695894046800561845749556748658092046; - uint256 constant IC28y = 5247283488585909287681175111965979900241094426050812131890410213638115643151; - - uint256 constant IC29x = 2601884709396729070900092103586635418201773412881087270429648554918650589212; - uint256 constant IC29y = 9908981325212548797939830108274909156521241172863051558205007650971279318517; - - uint256 constant IC30x = 9939266818987304280716292846681442246091197219658249578844451051169120630547; - uint256 constant IC30y = 2572015044563341438903424542575536095020061887469225890988354903901552937232; - - uint256 constant IC31x = 13118893670705126645185968274218628155008227884751114852720068135196260630881; - uint256 constant IC31y = 6230722867526865558981774022287077378574474669760549030286133277816703673143; - - uint256 constant IC32x = 17212407207955414163237618089196466668701707894128397707051726962337098549169; - uint256 constant IC32y = 8404846513505663468605283225980364311579458231305844344066234966448248022846; - - uint256 constant IC33x = 11738484603497709502459820489878480711987723990943728339865918189223648597498; - uint256 constant IC33y = 4876663067150136827802187921986818211983158246723787276826534383019800886864; - - uint256 constant IC34x = 10388736566666345681097260475847864743327046424517259125467497894377198799740; - uint256 constant IC34y = 18058504066267363666256588143336895545386092144245446448007719752461244713629; - - // For zksync mainnet TODO: Current addresses are on zkSync sepolia, - // Please deploy them before you deploy the Groth16Verifier. - address constant ecAddAddrZkSync = 0x4cc3aa31951FADa114cBAd54686E2A082Df6C4fa; - address constant ecMulAddrZkSync = 0x2abE798291c05B054475BDEB017161737A6A1b4F; - address constant ecPairingAddrZkSync = 0x9F7D2961D2E522D5B1407dD1e364A520DdC8a77F; - // For zksync sepolia - address constant ecAddAddrZkSyncSepolia = 0x4cc3aa31951FADa114cBAd54686E2A082Df6C4fa; - address constant ecMulAddrZkSyncSepolia = 0x2abE798291c05B054475BDEB017161737A6A1b4F; - address constant ecPairingAddrZkSyncSepolia = 0x9F7D2961D2E522D5B1407dD1e364A520DdC8a77F; // Memory data uint16 constant pVk = 0; @@ -164,45 +122,25 @@ contract Groth16Verifier { uint16 constant pLastMem = 896; - function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[34] calldata _pubSignals) public view returns (bool) { - - uint16 zksync; - if(block.chainid == 300) { - zksync = 2; // zkSync sepolia - } else if(block.chainid == 324) { - zksync = 1; // zkSync mainnet - } else { - zksync = 0; // others - } - + function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[23] calldata _pubSignals) public view returns (bool) { assembly { - function checkField(v) { - if iszero(lt(v, q)) { + if iszero(lt(v, r)) { mstore(0, 0) return(0, 0x20) } } // G1 function to multiply a G1 value(x,y) to value in an address - function g1_mulAccC(pR, x, y, s, z) { + function g1_mulAccC(pR, x, y, s) { let success let mIn := mload(0x40) mstore(mIn, x) mstore(add(mIn, 32), y) mstore(add(mIn, 64), s) - switch z - case 1 { - success := staticcall(sub(gas(), 2000), ecMulAddrZkSync, mIn, 96, mIn, 64) - } - case 2 { - success := staticcall(sub(gas(), 2000), ecMulAddrZkSyncSepolia, mIn, 96, mIn, 64) - } - default { - success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) - } - + success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) + if iszero(success) { mstore(0, 0) return(0, 0x20) @@ -211,17 +149,7 @@ contract Groth16Verifier { mstore(add(mIn, 64), mload(pR)) mstore(add(mIn, 96), mload(add(pR, 32))) - switch z - case 1 { - success := staticcall(sub(gas(), 2000), ecAddAddrZkSync, mIn, 128, pR, 64) - } - case 2 { - success := staticcall(sub(gas(), 2000), ecAddAddrZkSyncSepolia, mIn, 128, pR, 64) - } - default { - success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) - } - + success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) if iszero(success) { mstore(0, 0) @@ -229,7 +157,7 @@ contract Groth16Verifier { } } - function checkPairing(pA, pB, pC, pubSignals, pMem, z) -> isOk { + function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { let _pPairing := add(pMem, pPairing) let _pVk := add(pMem, pVk) @@ -238,73 +166,51 @@ contract Groth16Verifier { // Compute the linear combination vk_x - g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)), z) - - g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)), z) - - g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)), z) + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) - g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)), z) + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) - g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)), z) + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) - g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)), z) + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) - g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)), z) + g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) - g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)), z) + g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) - g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)), z) + g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192))) - g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)), z) + g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224))) - g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320)), z) + g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256))) - g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352)), z) + g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288))) - g1_mulAccC(_pVk, IC13x, IC13y, calldataload(add(pubSignals, 384)), z) + g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320))) - g1_mulAccC(_pVk, IC14x, IC14y, calldataload(add(pubSignals, 416)), z) + g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352))) - g1_mulAccC(_pVk, IC15x, IC15y, calldataload(add(pubSignals, 448)), z) + g1_mulAccC(_pVk, IC13x, IC13y, calldataload(add(pubSignals, 384))) - g1_mulAccC(_pVk, IC16x, IC16y, calldataload(add(pubSignals, 480)), z) + g1_mulAccC(_pVk, IC14x, IC14y, calldataload(add(pubSignals, 416))) - g1_mulAccC(_pVk, IC17x, IC17y, calldataload(add(pubSignals, 512)), z) + g1_mulAccC(_pVk, IC15x, IC15y, calldataload(add(pubSignals, 448))) - g1_mulAccC(_pVk, IC18x, IC18y, calldataload(add(pubSignals, 544)), z) + g1_mulAccC(_pVk, IC16x, IC16y, calldataload(add(pubSignals, 480))) - g1_mulAccC(_pVk, IC19x, IC19y, calldataload(add(pubSignals, 576)), z) + g1_mulAccC(_pVk, IC17x, IC17y, calldataload(add(pubSignals, 512))) - g1_mulAccC(_pVk, IC20x, IC20y, calldataload(add(pubSignals, 608)), z) + g1_mulAccC(_pVk, IC18x, IC18y, calldataload(add(pubSignals, 544))) - g1_mulAccC(_pVk, IC21x, IC21y, calldataload(add(pubSignals, 640)), z) + g1_mulAccC(_pVk, IC19x, IC19y, calldataload(add(pubSignals, 576))) - g1_mulAccC(_pVk, IC22x, IC22y, calldataload(add(pubSignals, 672)), z) + g1_mulAccC(_pVk, IC20x, IC20y, calldataload(add(pubSignals, 608))) - g1_mulAccC(_pVk, IC23x, IC23y, calldataload(add(pubSignals, 704)), z) + g1_mulAccC(_pVk, IC21x, IC21y, calldataload(add(pubSignals, 640))) - g1_mulAccC(_pVk, IC24x, IC24y, calldataload(add(pubSignals, 736)), z) + g1_mulAccC(_pVk, IC22x, IC22y, calldataload(add(pubSignals, 672))) - g1_mulAccC(_pVk, IC25x, IC25y, calldataload(add(pubSignals, 768)), z) - - g1_mulAccC(_pVk, IC26x, IC26y, calldataload(add(pubSignals, 800)), z) - - g1_mulAccC(_pVk, IC27x, IC27y, calldataload(add(pubSignals, 832)), z) - - g1_mulAccC(_pVk, IC28x, IC28y, calldataload(add(pubSignals, 864)), z) - - g1_mulAccC(_pVk, IC29x, IC29y, calldataload(add(pubSignals, 896)), z) - - g1_mulAccC(_pVk, IC30x, IC30y, calldataload(add(pubSignals, 928)), z) - - g1_mulAccC(_pVk, IC31x, IC31y, calldataload(add(pubSignals, 960)), z) - - g1_mulAccC(_pVk, IC32x, IC32y, calldataload(add(pubSignals, 992)), z) - - g1_mulAccC(_pVk, IC33x, IC33y, calldataload(add(pubSignals, 1024)), z) - - g1_mulAccC(_pVk, IC34x, IC34y, calldataload(add(pubSignals, 1056)), z) + g1_mulAccC(_pVk, IC23x, IC23y, calldataload(add(pubSignals, 704))) // -A @@ -349,17 +255,7 @@ contract Groth16Verifier { mstore(add(_pPairing, 736), deltay2) - let success := false - switch z - case 1 { - success := staticcall(sub(gas(), 2000), ecPairingAddrZkSync, _pPairing, 768, _pPairing, 0x20) - } - case 2 { - success := staticcall(sub(gas(), 2000), ecPairingAddrZkSyncSepolia, _pPairing, 768, _pPairing, 0x20) - } - default { - success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) - } + let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) isOk := and(success, mload(_pPairing)) } @@ -417,31 +313,9 @@ contract Groth16Verifier { checkField(calldataload(add(_pubSignals, 736))) - checkField(calldataload(add(_pubSignals, 768))) - - checkField(calldataload(add(_pubSignals, 800))) - - checkField(calldataload(add(_pubSignals, 832))) - - checkField(calldataload(add(_pubSignals, 864))) - - checkField(calldataload(add(_pubSignals, 896))) - - checkField(calldataload(add(_pubSignals, 928))) - - checkField(calldataload(add(_pubSignals, 960))) - - checkField(calldataload(add(_pubSignals, 992))) - - checkField(calldataload(add(_pubSignals, 1024))) - - checkField(calldataload(add(_pubSignals, 1056))) - - checkField(calldataload(add(_pubSignals, 1088))) - // Validate all evaluations - let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem, zksync) + let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) mstore(0, isValid) return(0, 0x20) diff --git a/packages/contracts/src/utils/Verifier.sol b/packages/contracts/src/utils/Verifier.sol index 2ccff85d..6ef8a51f 100644 --- a/packages/contracts/src/utils/Verifier.sol +++ b/packages/contracts/src/utils/Verifier.sol @@ -21,8 +21,8 @@ contract Verifier is OwnableUpgradeable, UUPSUpgradeable { uint256 public constant DOMAIN_FIELDS = 9; uint256 public constant DOMAIN_BYTES = 255; - uint256 public constant SUBJECT_FIELDS = 20; - uint256 public constant SUBJECT_BYTES = 605; + uint256 public constant SUBJECT_FIELDS = 9; + uint256 public constant SUBJECT_BYTES = 256; constructor() {} diff --git a/yarn.lock b/yarn.lock index 794c67da..bda5fb78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4051,9 +4051,9 @@ node-int64@^0.4.0: resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -"node-pre-gyp-github@git+https://github.com/ultamatt/node-pre-gyp-github.git": +"node-pre-gyp-github@https://github.com/ultamatt/node-pre-gyp-github.git": version "1.4.3" - resolved "git+https://github.com/ultamatt/node-pre-gyp-github.git#e4961827f77751489bc8d4760a0479f3f985f34f" + resolved "https://github.com/ultamatt/node-pre-gyp-github.git#e4961827f77751489bc8d4760a0479f3f985f34f" dependencies: "@octokit/rest" "^15.9.5" commander "^2.17.0" From 8a69a6182cc75313cfafaafc235655d2b10cb7bf Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Mon, 2 Sep 2024 21:02:52 +0900 Subject: [PATCH 009/121] Update proving key url --- packages/prover/Dockerfile | 2 +- packages/prover/local_setup.sh | 2 +- packages/prover/modal_server.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/prover/Dockerfile b/packages/prover/Dockerfile index f0430c2a..4a0b364b 100644 --- a/packages/prover/Dockerfile +++ b/packages/prover/Dockerfile @@ -24,7 +24,7 @@ RUN ls /root # RUN cp /email-wallet/packages/prover/params/email_sender.wasm /root/params RUN mkdir params WORKDIR /root/params -RUN gdown "https://drive.google.com/uc?id=1TChinAnHr9eV8H_OV9SVReF8Rvu6h1XH" +RUN gdown "https://drive.google.com/uc?id=1LLLTmUxqevSvMAKfQMOiJIdpYxZEPlSf" RUN unzip params.zip RUN mv params/* /root/params WORKDIR /root diff --git a/packages/prover/local_setup.sh b/packages/prover/local_setup.sh index 58f35ea3..7fdda877 100755 --- a/packages/prover/local_setup.sh +++ b/packages/prover/local_setup.sh @@ -6,7 +6,7 @@ mkdir -p build npm install -g snarkjs@latest pip install -r requirements.txt mkdir build && cd build -gdown "https://drive.google.com/uc?id=1TChinAnHr9eV8H_OV9SVReF8Rvu6h1XH" +gdown "https://drive.google.com/uc?id=1LLLTmUxqevSvMAKfQMOiJIdpYxZEPlSf" unzip params.zip # curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-account-creation/contributions/emailwallet-account-creation_00019.zkey --output /root/params/account_creation.zkey # curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-account-init/contributions/emailwallet-account-init_00007.zkey --output /root/params/account_init.zkey diff --git a/packages/prover/modal_server.py b/packages/prover/modal_server.py index ab0490e4..0f3adf9c 100644 --- a/packages/prover/modal_server.py +++ b/packages/prover/modal_server.py @@ -6,7 +6,7 @@ from google.oauth2 import service_account -app = modal.App("email-auth-prover-v1.0.4") +app = modal.App("email-auth-prover-body-parsing-v1.0.0") image = modal.Image.from_dockerfile("Dockerfile") From f5164a5db9ba78421c70e3250465022a7864356a Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Wed, 21 Aug 2024 18:52:23 +0530 Subject: [PATCH 010/121] feat: add body parsing --- packages/relayer/Cargo.toml | 4 ++++ .../relayer/eml_templates/acceptance_request.html | 5 +++-- packages/relayer/src/core.rs | 15 +++++++++++---- packages/relayer/src/modules/mail.rs | 12 ++++++++---- .../relayer/src/modules/web_server/rest_api.rs | 4 ++-- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 8abc863d..cabfef21 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -24,7 +24,11 @@ serde_json = "1.0.68" tiny_http = "0.12.0" lettre = { version = "0.10.4", features = ["tokio1", "tokio1-native-tls"] } ethers = { version = "2.0.10", features = ["abigen"] } +<<<<<<< HEAD relayer-utils = { git = "https://github.com/zkemail/relayer-utils", rev = "fd6c7bf" } +======= +relayer-utils = { version = "0.2.6", git = "https://github.com/zkemail/relayer-utils" } +>>>>>>> aac458f (feat: add body parsing) futures = "0.3.28" sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } regex = "1.10.2" diff --git a/packages/relayer/eml_templates/acceptance_request.html b/packages/relayer/eml_templates/acceptance_request.html index f350817a..4dfcf524 100644 --- a/packages/relayer/eml_templates/acceptance_request.html +++ b/packages/relayer/eml_templates/acceptance_request.html @@ -166,8 +166,9 @@ margin-bottom: 15px; " > - You have received an guardian request from the wallet address {{walletAddress}}. - Reply "Confirm" to this email to accept the request. + You have received an guardian request from the wallet address {{walletAddress}}. + {{command}}. + Reply "Confirm" to this email to accept the request.
Your request ID is #{{requestId}}.

diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 00e1c195..4bc85be3 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -21,7 +21,9 @@ pub async fn handle_email(email: String) -> Result { let guardian_email_addr = parsed_email.get_from_addr()?; let padded_from_addr = PaddedEmailAddr::from_email_addr(&guardian_email_addr); trace!(LOG, "From address: {}", guardian_email_addr; "func" => function_name!()); - let subject = parsed_email.get_subject_all()?; + let email_body = parsed_email.get_body()?; + + println!("Email body1: {}", email_body); let request_decomposed_def = serde_json::from_str(include_str!("./regex_json/request_def.json"))?; @@ -85,7 +87,10 @@ pub async fn handle_email(email: String) -> Result { ) .await?; - let result = extract_template_vals_and_skipped_subject_idx(&subject, subject_template); + println!("Subject template: {:?}", subject_template); + + let result = + extract_template_vals_and_skipped_subject_idx(&email_body, subject_template); let (subject_params, skipped_subject_prefix) = match result { Ok((subject_params, skipped_subject_prefix)) => { (subject_params, skipped_subject_prefix) @@ -216,7 +221,8 @@ pub async fn handle_email(email: String) -> Result { .get_recovery_subject_templates(&request.controller_eth_addr, request.template_idx) .await?; - let result = extract_template_vals_and_skipped_subject_idx(&subject, subject_template); + let result = + extract_template_vals_and_skipped_subject_idx(&email_body, subject_template); let (subject_params, skipped_subject_prefix) = match result { Ok((subject_params, skipped_subject_prefix)) => { (subject_params, skipped_subject_prefix) @@ -340,7 +346,8 @@ pub async fn handle_email(email: String) -> Result { .get_recovery_subject_templates(&request.controller_eth_addr, request.template_idx) .await?; - let result = extract_template_vals_and_skipped_subject_idx(&subject, subject_template); + let result = + extract_template_vals_and_skipped_subject_idx(&email_body, subject_template); let (subject_params, skipped_subject_prefix) = match result { Ok((subject_params, skipped_subject_prefix)) => { (subject_params, skipped_subject_prefix) diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs index de7b27ce..3cb110c5 100644 --- a/packages/relayer/src/modules/mail.rs +++ b/packages/relayer/src/modules/mail.rs @@ -10,7 +10,7 @@ pub enum EmailAuthEvent { account_eth_addr: String, guardian_email_addr: String, request_id: u32, - subject: String, + command: String, account_code: String, }, GuardianAlreadyExists { @@ -79,22 +79,26 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<()> { account_eth_addr, guardian_email_addr, request_id, - subject, + command, account_code, } => { - let subject = format!("{} Code {}", subject, account_code); + let command = format!("{} Code {}", command, account_code); let body_plain = format!( "You have received an guardian request from the wallet address {}. \ + {} Code {}. \ Reply \"Confirm\" to this email to accept the request. \ Your request ID is #{}. \ If you did not initiate this request, please contact us immediately.", - account_eth_addr, request_id + account_eth_addr, command, account_code, request_id ); + let subject = format!("Email Recovery: Acceptance Request"); + let render_data = serde_json::json!({ "userEmailAddr": guardian_email_addr, "walletAddress": account_eth_addr, + "command": command, "requestId": request_id, }); let body_html = render_html("acceptance_request.html", render_data).await?; diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 131a11ce..f7fe786c 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -267,7 +267,7 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response Response Date: Wed, 21 Aug 2024 18:59:23 +0530 Subject: [PATCH 011/121] chore: update --- packages/relayer/src/core.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 4bc85be3..758f9cfc 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -23,8 +23,6 @@ pub async fn handle_email(email: String) -> Result { trace!(LOG, "From address: {}", guardian_email_addr; "func" => function_name!()); let email_body = parsed_email.get_body()?; - println!("Email body1: {}", email_body); - let request_decomposed_def = serde_json::from_str(include_str!("./regex_json/request_def.json"))?; let request_idxes = extract_substr_idxes(&email, &request_decomposed_def)?; @@ -87,8 +85,6 @@ pub async fn handle_email(email: String) -> Result { ) .await?; - println!("Subject template: {:?}", subject_template); - let result = extract_template_vals_and_skipped_subject_idx(&email_body, subject_template); let (subject_params, skipped_subject_prefix) = match result { From f4dbfce18e6391301eba033aaf7f8b9fa3f8f4b7 Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Mon, 2 Sep 2024 19:19:03 +0530 Subject: [PATCH 012/121] chore: separated body parsing tests --- packages/circuits/tests/email_auth.test.ts | 429 ------------------ .../email_auth_with_body_parsing.test.ts | 227 +++++++++ ...with_body_parsing_with_qp_encoding.test.ts | 216 +++++++++ 3 files changed, 443 insertions(+), 429 deletions(-) create mode 100644 packages/circuits/tests/email_auth_with_body_parsing.test.ts create mode 100644 packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts diff --git a/packages/circuits/tests/email_auth.test.ts b/packages/circuits/tests/email_auth.test.ts index de5752e1..eb0b45f3 100644 --- a/packages/circuits/tests/email_auth.test.ts +++ b/packages/circuits/tests/email_auth.test.ts @@ -436,432 +436,3 @@ describe("Email Auth", () => { await expect(failFn).rejects.toThrow(); }); }); - -jest.setTimeout(1440000); -describe("Email Auth With Body Parsing", () => { - let circuit; - beforeAll(async () => { - const option = { - include: path.join(__dirname, "../../../node_modules"), - output: path.join(__dirname, "../build"), - recompile: true, - }; - circuit = await wasm_tester( - path.join(__dirname, "../src/email_auth_with_body_parsing.circom"), - option - ); - }); - - it("Verify a sent email whose body has an email address", async () => { - const emailFilePath = path.join( - __dirname, - "./emails/email_auth_with_body_parsing_test1.eml" - ); - - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - - const accountCode = await relayerUtils.genAccountCode(); - - const { subject_idx, ...circuitInputsRelevant } = - await genEmailCircuitInput(emailFilePath, accountCode, { - maxHeaderLength: 640, - maxBodyLength: 768, - ignoreBodyHashCheck: false, - }); - circuitInputsRelevant.padded_cleaned_body = - circuitInputsRelevant.padded_body; - const witness = await circuit.calculateWitness(circuitInputsRelevant); - await circuit.checkConstraints(witness); - - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - - const timestamp = 1725116446n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - - const maskedCommand = "Send 0.1 ETH to "; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); - const maskedCommandFields = - relayerUtils.bytes2Fields(paddedMaskedCommand); - for (let idx = 0; idx < maskedCommandFields.length; ++idx) { - expect(BigInt(maskedCommandFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - - const fromAddr = "zkemail.relayer.test@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedCommandFields.length] - ); - - expect(0n).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 - ] - ); - }); - - it("Verify a sent email whose subject does not have an email address", async () => { - const emailFilePath = path.join( - __dirname, - "./emails/email_auth_with_body_parsing_test2.eml" - ); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - - const accountCode = await relayerUtils.genAccountCode(); - const { subject_idx, ...circuitInputsRelevant } = - await genEmailCircuitInput(emailFilePath, accountCode, { - maxHeaderLength: 640, - maxBodyLength: 768, - ignoreBodyHashCheck: false, - }); - circuitInputsRelevant.padded_cleaned_body = - circuitInputsRelevant.padded_body; - const witness = await circuit.calculateWitness(circuitInputsRelevant); - await circuit.checkConstraints(witness); - - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - - const timestamp = 1725116459n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - - const maskedCommand = "Swap 1 ETH to DAI"; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); - const maskedCommandFields = - relayerUtils.bytes2Fields(paddedMaskedCommand); - for (let idx = 0; idx < maskedCommandFields.length; ++idx) { - expect(BigInt(maskedCommandFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - - const fromAddr = "zkemail.relayer.test@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedCommandFields.length] - ); - - expect(0n).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 - ] - ); - }); - - it("Verify a sent email whose from field has a dummy email address name", async () => { - const emailFilePath = path.join( - __dirname, - "./emails/email_auth_with_body_parsing_test3.eml" - ); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - - const accountCode = await relayerUtils.genAccountCode(); - - const { subject_idx, ...circuitInputsRelevant } = - await genEmailCircuitInput(emailFilePath, accountCode, { - maxHeaderLength: 640, - maxBodyLength: 768, - ignoreBodyHashCheck: false, - }); - circuitInputsRelevant.padded_cleaned_body = - circuitInputsRelevant.padded_body; - - const witness = await circuit.calculateWitness(circuitInputsRelevant); - await circuit.checkConstraints(witness); - - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - - const timestamp = 1725116474n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - - const maskedCommand = "Send 1 ETH to "; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); - const maskedCommandFields = - relayerUtils.bytes2Fields(paddedMaskedCommand); - for (let idx = 0; idx < maskedCommandFields.length; ++idx) { - expect(BigInt(maskedCommandFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - - const fromAddr = "zkemail.relayer.test@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedCommandFields.length] - ); - expect(0n).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 - ] - ); - }); -}); - -jest.setTimeout(1440000); -describe("Email Auth With Body Parsing (QP Encoded)", () => { - let circuit; - beforeAll(async () => { - const option = { - include: path.join(__dirname, "../../../node_modules"), - output: path.join(__dirname, "../build"), - recompile: true, - }; - circuit = await wasm_tester( - path.join( - __dirname, - "../src/email_auth_with_body_parsing_with_qp_encoding.circom" - ), - option - ); - }); - - // it("Verify a sent email whose from field has a non-English name", async () => { - // const emailFilePath = path.join( - // __dirname, - // "./emails/email_auth_with_body_parsing_test4.eml" - // ); - // const emailRaw = readFileSync(emailFilePath, "utf8"); - // const parsedEmail = await relayerUtils.parseEmail(emailRaw); - // console.log(parsedEmail.canonicalizedHeader); - // const accountCode = await relayerUtils.genAccountCode(); - // const circuitInputs = await genEmailAuthInput( - // emailFilePath, - // accountCode - // ); - // const witness = await circuit.calculateWitness(circuitInputs); - // await circuit.checkConstraints(witness); - // const domainName = "gmail.com"; - // const paddedDomain = relayerUtils.padString(domainName, 255); - // const domainFields = relayerUtils.bytes2Fields(paddedDomain); - // for (let idx = 0; idx < domainFields.length; ++idx) { - // expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - // } - // const expectedPubKeyHash = relayerUtils.publicKeyHash( - // parsedEmail.publicKey - // ); - // expect(BigInt(expectedPubKeyHash)).toEqual( - // witness[1 + domainFields.length] - // ); - // const expectedEmailNullifier = relayerUtils.emailNullifier( - // parsedEmail.signature - // ); - // expect(BigInt(expectedEmailNullifier)).toEqual( - // witness[1 + domainFields.length + 1] - // ); - // const timestamp = 1696967028n; - // expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - // const maskedSubject = "Send 1 ETH to "; - // const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - // const maskedSubjectFields = - // relayerUtils.bytes2Fields(paddedMaskedSubject); - // for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - // expect(BigInt(maskedSubjectFields[idx])).toEqual( - // witness[1 + domainFields.length + 3 + idx] - // ); - // } - // const fromAddr = "suegamisora@gmail.com"; - // const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - // expect(BigInt(accountSalt)).toEqual( - // witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - // ); - // expect(0n).toEqual( - // witness[ - // 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 - // ] - // ); - // }); - - it("Verify a sent email whose body has an email address and an invitation code", async () => { - const emailFilePath = path.join( - __dirname, - "./emails/email_auth_with_body_parsing_test4.eml" - ); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - - const accountCode = - "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - - const { subject_idx, ...circuitInputsRelevant } = - await genEmailCircuitInput(emailFilePath, accountCode, { - maxHeaderLength: 640, - maxBodyLength: 768, - ignoreBodyHashCheck: false, - }); - const witness = await circuit.calculateWitness(circuitInputsRelevant); - await circuit.checkConstraints(witness); - - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - - const timestamp = 1725116497n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - - const maskedCommand = "Send 0.12 ETH to "; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); - const maskedCommandFields = - relayerUtils.bytes2Fields(paddedMaskedCommand); - for (let idx = 0; idx < maskedCommandFields.length; ++idx) { - expect(BigInt(maskedCommandFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - - const fromAddr = "zkemail.relayer.test@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedCommandFields.length] - ); - - expect(1n).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 - ] - ); - }); - - it("Verify a sent email whose subject has an invitation code", async () => { - const emailFilePath = path.join( - __dirname, - "./emails/email_auth_with_body_parsing_test5.eml" - ); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - - const accountCode = - "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - - const { subject_idx, ...circuitInputsRelevant } = - await genEmailCircuitInput(emailFilePath, accountCode, { - maxHeaderLength: 640, - maxBodyLength: 768, - ignoreBodyHashCheck: false, - }); - const witness = await circuit.calculateWitness(circuitInputsRelevant); - await circuit.checkConstraints(witness); - - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - - const timestamp = 1725116520n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - - const maskedCommand = - "Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); - const maskedCommandFields = - relayerUtils.bytes2Fields(paddedMaskedCommand); - for (let idx = 0; idx < maskedCommandFields.length; ++idx) { - expect(BigInt(maskedCommandFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "zkemail.relayer.test@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedCommandFields.length] - ); - - expect(1n).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 - ] - ); - }); -}); diff --git a/packages/circuits/tests/email_auth_with_body_parsing.test.ts b/packages/circuits/tests/email_auth_with_body_parsing.test.ts new file mode 100644 index 00000000..3d6eaf78 --- /dev/null +++ b/packages/circuits/tests/email_auth_with_body_parsing.test.ts @@ -0,0 +1,227 @@ +const circom_tester = require("circom_tester"); +const wasm_tester = circom_tester.wasm; +import * as path from "path"; +const relayerUtils = require("@zk-email/relayer-utils"); + +import { genEmailCircuitInput } from "../helpers/email_auth"; +import { readFileSync } from "fs"; + +jest.setTimeout(1440000); +describe("Email Auth With Body Parsing", () => { + let circuit; + beforeAll(async () => { + const option = { + include: path.join(__dirname, "../../../node_modules"), + output: path.join(__dirname, "../build"), + recompile: true, + }; + circuit = await wasm_tester( + path.join(__dirname, "../src/email_auth_with_body_parsing.circom"), + option + ); + }); + + it("Verify a sent email whose body has an email address", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test1.eml" + ); + + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = await relayerUtils.genAccountCode(); + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + circuitInputsRelevant.padded_cleaned_body = + circuitInputsRelevant.padded_body; + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725116446n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Send 0.1 ETH to "; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose subject does not have an email address", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test2.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = await relayerUtils.genAccountCode(); + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + circuitInputsRelevant.padded_cleaned_body = + circuitInputsRelevant.padded_body; + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725116459n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Swap 1 ETH to DAI"; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose from field has a dummy email address name", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test3.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = await relayerUtils.genAccountCode(); + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + circuitInputsRelevant.padded_cleaned_body = + circuitInputsRelevant.padded_body; + + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725116474n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Send 1 ETH to "; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); +}); diff --git a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts new file mode 100644 index 00000000..75362daa --- /dev/null +++ b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts @@ -0,0 +1,216 @@ +const circom_tester = require("circom_tester"); +const wasm_tester = circom_tester.wasm; +import * as path from "path"; +const relayerUtils = require("@zk-email/relayer-utils"); + +import { genEmailCircuitInput } from "../helpers/email_auth"; +import { readFileSync } from "fs"; + +jest.setTimeout(1440000); +describe("Email Auth With Body Parsing (QP Encoded)", () => { + let circuit; + beforeAll(async () => { + const option = { + include: path.join(__dirname, "../../../node_modules"), + output: path.join(__dirname, "../build"), + recompile: true, + }; + circuit = await wasm_tester( + path.join( + __dirname, + "../src/email_auth_with_body_parsing_with_qp_encoding.circom" + ), + option + ); + }); + + // it("Verify a sent email whose from field has a non-English name", async () => { + // const emailFilePath = path.join( + // __dirname, + // "./emails/email_auth_with_body_parsing_test4.eml" + // ); + // const emailRaw = readFileSync(emailFilePath, "utf8"); + // const parsedEmail = await relayerUtils.parseEmail(emailRaw); + // console.log(parsedEmail.canonicalizedHeader); + // const accountCode = await relayerUtils.genAccountCode(); + // const circuitInputs = await genEmailAuthInput( + // emailFilePath, + // accountCode + // ); + // const witness = await circuit.calculateWitness(circuitInputs); + // await circuit.checkConstraints(witness); + // const domainName = "gmail.com"; + // const paddedDomain = relayerUtils.padString(domainName, 255); + // const domainFields = relayerUtils.bytes2Fields(paddedDomain); + // for (let idx = 0; idx < domainFields.length; ++idx) { + // expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + // } + // const expectedPubKeyHash = relayerUtils.publicKeyHash( + // parsedEmail.publicKey + // ); + // expect(BigInt(expectedPubKeyHash)).toEqual( + // witness[1 + domainFields.length] + // ); + // const expectedEmailNullifier = relayerUtils.emailNullifier( + // parsedEmail.signature + // ); + // expect(BigInt(expectedEmailNullifier)).toEqual( + // witness[1 + domainFields.length + 1] + // ); + // const timestamp = 1696967028n; + // expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + // const maskedSubject = "Send 1 ETH to "; + // const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + // const maskedSubjectFields = + // relayerUtils.bytes2Fields(paddedMaskedSubject); + // for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + // expect(BigInt(maskedSubjectFields[idx])).toEqual( + // witness[1 + domainFields.length + 3 + idx] + // ); + // } + // const fromAddr = "suegamisora@gmail.com"; + // const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + // expect(BigInt(accountSalt)).toEqual( + // witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + // ); + // expect(0n).toEqual( + // witness[ + // 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + // ] + // ); + // }); + + it("Verify a sent email whose body has an email address and an invitation code", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test4.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725116497n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Send 0.12 ETH to "; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose subject has an invitation code", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test5.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725116520n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = + "Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); +}); From 7214d3bd32a61670d232f35eafc6c508d997d9aa Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Mon, 2 Sep 2024 19:57:49 +0530 Subject: [PATCH 013/121] fix: refactring in recipent_enabled test --- .../circuits/tests/recipient_enabled.test.ts | 604 ++++++++++-------- 1 file changed, 344 insertions(+), 260 deletions(-) diff --git a/packages/circuits/tests/recipient_enabled.test.ts b/packages/circuits/tests/recipient_enabled.test.ts index fa6a2c80..c168d3b6 100644 --- a/packages/circuits/tests/recipient_enabled.test.ts +++ b/packages/circuits/tests/recipient_enabled.test.ts @@ -2,273 +2,357 @@ const circom_tester = require("circom_tester"); const wasm_tester = circom_tester.wasm; import * as path from "path"; const relayerUtils = require("@zk-email/relayer-utils"); -import { genEmailAuthInput } from "../helpers/email_auth"; +import { genEmailCircuitInput } from "../helpers/email_auth"; import { genRecipientInput } from "../helpers/recipient"; import { readFileSync } from "fs"; jest.setTimeout(1440000); describe("Email Auth", () => { - let circuit; - beforeAll(async () => { - const option = { - include: path.join(__dirname, "../../../node_modules"), - }; - circuit = await wasm_tester( - path.join(__dirname, "./circuits/email_auth_with_recipient.circom"), - option - ); - }); + let circuit; + beforeAll(async () => { + const option = { + include: path.join(__dirname, "../../../node_modules"), + }; + circuit = await wasm_tester( + path.join(__dirname, "./circuits/email_auth_with_recipient.circom"), + option + ); + }); - it("Verify a sent email whose subject has an email address", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test1.eml"); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - console.log(parsedEmail.canonicalizedHeader); - const accountCode = await relayerUtils.genAccountCode(); - const emailAuthInput = await genEmailAuthInput(emailFilePath, accountCode); - const recipientInput = await genRecipientInput(emailFilePath); - const circuitInputs = { - ...emailAuthInput, - subject_email_addr_idx: recipientInput.subject_email_addr_idx, - }; - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - const timestamp = 1694989812n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - const maskedSubject = "Send 0.1 ETH to "; - const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); - for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - expect(BigInt(maskedSubjectFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "suegamisora@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - ); - expect(0n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] - ); - expect(1n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 2] - ); - const recipientEmailAddr = "alice@gmail.com"; - const emailAddrCommit = relayerUtils.emailAddrCommitWithSignature( - recipientEmailAddr, - parsedEmail.signature - ); - expect(BigInt(emailAddrCommit)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 3] - ); - }); + it("Verify a sent email whose subject has an email address", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test1.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + console.log(parsedEmail.canonicalizedHeader); + const accountCode = await relayerUtils.genAccountCode(); + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...emailAuthInput + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + const recipientInput = await genRecipientInput(emailFilePath); + const circuitInputs = { + ...emailAuthInput, + subject_email_addr_idx: recipientInput.subject_email_addr_idx, + }; + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + const timestamp = 1694989812n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + const maskedSubject = "Send 0.1 ETH to "; + const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + const maskedSubjectFields = + relayerUtils.bytes2Fields(paddedMaskedSubject); + for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + expect(BigInt(maskedSubjectFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "suegamisora@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + ); + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + ] + ); + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 + ] + ); + const recipientEmailAddr = "alice@gmail.com"; + const emailAddrCommit = relayerUtils.emailAddrCommitWithSignature( + recipientEmailAddr, + parsedEmail.signature + ); + expect(BigInt(emailAddrCommit)).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 + ] + ); + }); - it("Verify a sent email whose from field has a dummy email address name", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test3.eml"); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - console.log(parsedEmail.canonicalizedHeader); - const accountCode = await relayerUtils.genAccountCode(); - const emailAuthInput = await genEmailAuthInput(emailFilePath, accountCode); - const recipientInput = await genRecipientInput(emailFilePath); - const circuitInputs = { - ...emailAuthInput, - subject_email_addr_idx: recipientInput.subject_email_addr_idx, - }; - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - const timestamp = 1696965932n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - const maskedSubject = "Send 1 ETH to "; - const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); - for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - expect(BigInt(maskedSubjectFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "suegamisora@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - ); - expect(0n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] - ); - expect(1n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 2] - ); - const recipientEmailAddr = "bob@example.com"; - const emailAddrCommit = relayerUtils.emailAddrCommitWithSignature( - recipientEmailAddr, - parsedEmail.signature - ); - expect(BigInt(emailAddrCommit)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 3] - ); - }); + it("Verify a sent email whose from field has a dummy email address name", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test3.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + console.log(parsedEmail.canonicalizedHeader); + const accountCode = await relayerUtils.genAccountCode(); + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...emailAuthInput + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + const recipientInput = await genRecipientInput(emailFilePath); + const circuitInputs = { + ...emailAuthInput, + subject_email_addr_idx: recipientInput.subject_email_addr_idx, + }; + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + const timestamp = 1696965932n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + const maskedSubject = "Send 1 ETH to "; + const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + const maskedSubjectFields = + relayerUtils.bytes2Fields(paddedMaskedSubject); + for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + expect(BigInt(maskedSubjectFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "suegamisora@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + ); + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + ] + ); + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 + ] + ); + const recipientEmailAddr = "bob@example.com"; + const emailAddrCommit = relayerUtils.emailAddrCommitWithSignature( + recipientEmailAddr, + parsedEmail.signature + ); + expect(BigInt(emailAddrCommit)).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 + ] + ); + }); - it("Verify a sent email whose from field has a non-English name", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test4.eml"); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - console.log(parsedEmail.canonicalizedHeader); - const accountCode = await relayerUtils.genAccountCode(); - const emailAuthInput = await genEmailAuthInput(emailFilePath, accountCode); - const recipientInput = await genRecipientInput(emailFilePath); - const circuitInputs = { - ...emailAuthInput, - subject_email_addr_idx: recipientInput.subject_email_addr_idx, - }; - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - const timestamp = 1696967028n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - const maskedSubject = "Send 1 ETH to "; - const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); - for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - expect(BigInt(maskedSubjectFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "suegamisora@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - ); - expect(0n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] - ); - expect(1n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 2] - ); - const recipientEmailAddr = "bob@example.com"; - const emailAddrCommit = relayerUtils.emailAddrCommitWithSignature( - recipientEmailAddr, - parsedEmail.signature - ); - expect(BigInt(emailAddrCommit)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 3] - ); - }); + it("Verify a sent email whose from field has a non-English name", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test4.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + console.log(parsedEmail.canonicalizedHeader); + const accountCode = await relayerUtils.genAccountCode(); + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...emailAuthInput + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + const recipientInput = await genRecipientInput(emailFilePath); + const circuitInputs = { + ...emailAuthInput, + subject_email_addr_idx: recipientInput.subject_email_addr_idx, + }; + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + const timestamp = 1696967028n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + const maskedSubject = "Send 1 ETH to "; + const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + const maskedSubjectFields = + relayerUtils.bytes2Fields(paddedMaskedSubject); + for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + expect(BigInt(maskedSubjectFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "suegamisora@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + ); + expect(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + ] + ); + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 + ] + ); + const recipientEmailAddr = "bob@example.com"; + const emailAddrCommit = relayerUtils.emailAddrCommitWithSignature( + recipientEmailAddr, + parsedEmail.signature + ); + expect(BigInt(emailAddrCommit)).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 + ] + ); + }); - it("Verify a sent email whose subject has an invitation code", async () => { - const emailFilePath = path.join(__dirname, "./emails/email_auth_test5.eml"); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - console.log(parsedEmail.canonicalizedHeader); - const accountCode = - "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - const emailAuthInput = await genEmailAuthInput(emailFilePath, accountCode); - const recipientInput = await genRecipientInput(emailFilePath); - const circuitInputs = { - ...emailAuthInput, - subject_email_addr_idx: recipientInput.subject_email_addr_idx, - }; - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - const timestamp = 1707866192n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - const maskedSubject = "Send 0.12 ETH to "; - const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); - for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - expect(BigInt(maskedSubjectFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "suegamisora@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - ); - expect(1n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] - ); - expect(1n).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 2] - ); - const recipientEmailAddr = "alice@gmail.com"; - const emailAddrCommit = relayerUtils.emailAddrCommitWithSignature( - recipientEmailAddr, - parsedEmail.signature - ); - expect(BigInt(emailAddrCommit)).toEqual( - witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 3] - ); - }); + it("Verify a sent email whose subject has an invitation code", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_test5.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + console.log(parsedEmail.canonicalizedHeader); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...emailAuthInput + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + const recipientInput = await genRecipientInput(emailFilePath); + const circuitInputs = { + ...emailAuthInput, + subject_email_addr_idx: recipientInput.subject_email_addr_idx, + }; + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + const timestamp = 1707866192n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + const maskedSubject = "Send 0.12 ETH to "; + const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + const maskedSubjectFields = + relayerUtils.bytes2Fields(paddedMaskedSubject); + for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + expect(BigInt(maskedSubjectFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "suegamisora@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + ); + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + ] + ); + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 + ] + ); + const recipientEmailAddr = "alice@gmail.com"; + const emailAddrCommit = relayerUtils.emailAddrCommitWithSignature( + recipientEmailAddr, + parsedEmail.signature + ); + expect(BigInt(emailAddrCommit)).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 + ] + ); + }); }); From eedd202a3e023c79a72965514765d56d07d514af Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Mon, 2 Sep 2024 20:05:55 +0530 Subject: [PATCH 014/121] fix: minor --- packages/relayer/Cargo.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index cabfef21..8abc863d 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -24,11 +24,7 @@ serde_json = "1.0.68" tiny_http = "0.12.0" lettre = { version = "0.10.4", features = ["tokio1", "tokio1-native-tls"] } ethers = { version = "2.0.10", features = ["abigen"] } -<<<<<<< HEAD relayer-utils = { git = "https://github.com/zkemail/relayer-utils", rev = "fd6c7bf" } -======= -relayer-utils = { version = "0.2.6", git = "https://github.com/zkemail/relayer-utils" } ->>>>>>> aac458f (feat: add body parsing) futures = "0.3.28" sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } regex = "1.10.2" From e6caddf083f56554b19eb26688452607429b1476 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Mon, 2 Sep 2024 21:14:19 +0000 Subject: [PATCH 015/121] chore: update relayer --- Cargo.lock | 896 +++++++++++-- packages/relayer/Cargo.toml | 4 +- .../src/abis/email_account_recovery.rs | 1142 ++++++++++------- packages/relayer/src/abis/mod.rs | 4 +- packages/relayer/src/core.rs | 52 +- packages/relayer/src/database.rs | 27 +- packages/relayer/src/lib.rs | 8 +- packages/relayer/src/modules/dkim.rs | 24 +- .../relayer/src/modules/web_server/server.rs | 3 +- packages/relayer/src/utils/utils.rs | 11 +- rust-toolchain | 2 +- 11 files changed, 1525 insertions(+), 648 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 97b42314..85a1ce6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -99,6 +99,12 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "arrayvec" version = "0.7.6" @@ -171,6 +177,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + [[package]] name = "async-native-tls" version = "0.5.0" @@ -253,8 +270,8 @@ dependencies = [ "bytes", "futures-util", "http 0.2.12", - "http-body", - "hyper", + "http-body 0.4.6", + "hyper 0.14.30", "itoa", "matchit", "memchr", @@ -266,7 +283,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "tokio", "tower", "tower-layer", @@ -283,13 +300,24 @@ dependencies = [ "bytes", "futures-util", "http 0.2.12", - "http-body", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", "tower-service", ] +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom", + "instant", + "rand", +] + [[package]] name = "backtrace" version = "0.3.73" @@ -341,6 +369,29 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "binread" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16598dfc8e6578e9b597d9910ba2e73618385dc9f4b1d43dd92c349d6be6418f" +dependencies = [ + "binread_derive", + "lazy_static", + "rustversion", +] + +[[package]] +name = "binread_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9672209df1714ee804b1f4d4f68c8eb2a90b1f7a07acf472f88ce198ef1fed" +dependencies = [ + "either", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -389,7 +440,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -399,10 +450,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.7.6", "constant_time_eq 0.3.1", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -418,7 +478,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "sha2", + "sha2 0.10.8", "tinyvec", ] @@ -470,6 +530,19 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "cached" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8466736fe5dbcaf8b8ee24f9bbefe43c884dc3e9ff7178da70f55bffca1133c" +dependencies = [ + "ahash", + "hashbrown 0.14.5", + "instant", + "once_cell", + "thiserror", +] + [[package]] name = "camino" version = "1.1.9" @@ -479,6 +552,41 @@ dependencies = [ "serde", ] +[[package]] +name = "candid" +version = "0.10.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c30ee7f886f296b6422c0ff017e89dd4f831521dfdcc76f3f71aae1ce817222" +dependencies = [ + "anyhow", + "binread", + "byteorder", + "candid_derive", + "hex", + "ic_principal", + "leb128", + "num-bigint", + "num-traits", + "paste", + "pretty", + "serde", + "serde_bytes", + "stacker", + "thiserror", +] + +[[package]] +name = "candid_derive" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3de398570c386726e7a59d9887b68763c481477f9a043fb998a2e09d428df1a9" +dependencies = [ + "lazy_static", + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "cargo-platform" version = "0.1.8" @@ -539,7 +647,7 @@ dependencies = [ "rsa", "serde_json", "sha-1", - "sha2", + "sha2 0.10.8", "slog", "trust-dns-resolver", "wasm-bindgen", @@ -606,11 +714,11 @@ checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ "bs58", "coins-core", - "digest", + "digest 0.10.7", "hmac", "k256", "serde", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -626,7 +734,7 @@ dependencies = [ "once_cell", "pbkdf2 0.12.2", "rand", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -639,13 +747,13 @@ dependencies = [ "base64 0.21.7", "bech32", "bs58", - "digest", + "digest 0.10.7", "generic-array", "hex", "ripemd", "serde", "serde_derive", - "sha2", + "sha2 0.10.8", "sha3", "thiserror", ] @@ -861,7 +969,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "rustc_version", "subtle", @@ -879,6 +987,19 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core", + "subtle-ng", + "zeroize", +] + [[package]] name = "data-encoding" version = "2.6.0" @@ -916,13 +1037,22 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", @@ -995,7 +1125,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -1012,6 +1142,21 @@ dependencies = [ "signature", ] +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core", + "serde", + "sha2 0.9.9", + "thiserror", + "zeroize", +] + [[package]] name = "ed25519-dalek" version = "2.1.1" @@ -1021,7 +1166,7 @@ dependencies = [ "curve25519-dalek", "ed25519", "serde", - "sha2", + "sha2 0.10.8", "subtle", "zeroize", ] @@ -1043,10 +1188,11 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core", "sec1", @@ -1153,7 +1299,7 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest", + "digest 0.10.7", "hex", "hmac", "pbkdf2 0.11.0", @@ -1161,7 +1307,7 @@ dependencies = [ "scrypt", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "sha3", "thiserror", "uuid 0.8.2", @@ -1278,7 +1424,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "syn 2.0.77", @@ -1308,7 +1454,7 @@ version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" dependencies = [ - "arrayvec", + "arrayvec 0.7.6", "bytes", "cargo_metadata", "chrono", @@ -1340,7 +1486,7 @@ checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" dependencies = [ "chrono", "ethers-core", - "reqwest", + "reqwest 0.11.27", "semver 1.0.23", "serde", "serde_json", @@ -1365,7 +1511,7 @@ dependencies = [ "futures-locks", "futures-util", "instant", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror", @@ -1397,7 +1543,7 @@ dependencies = [ "jsonwebtoken", "once_cell", "pin-project", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror", @@ -1426,7 +1572,7 @@ dependencies = [ "eth-keystore", "ethers-core", "rand", - "sha2", + "sha2 0.10.8", "thiserror", "tracing", ] @@ -1642,21 +1788,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "function_name" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1ab577a896d09940b5fe12ec5ae71f9d8211fff62c919c03a3750a9901e98a7" -dependencies = [ - "function_name-proc-macro", -] - -[[package]] -name = "function_name-proc-macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673464e1e314dd67a0fd9544abc99e8eb28d0c7e3b69b033bcff9b2d00b87333" - [[package]] name = "funty" version = "2.0.0" @@ -1866,7 +1997,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cdf7b487d864c2939b23902291a5041bc4a84418268f25fda1c8d4e15ad8fa" dependencies = [ "graphql_query_derive", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", ] @@ -1929,13 +2060,19 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" + [[package]] name = "halo2curves" version = "0.7.0" source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#b753a832e92d5c86c5c997327a9cf9de86a18851" dependencies = [ "blake2", - "digest", + "digest 0.10.7", "ff", "group", "halo2derive", @@ -1949,7 +2086,7 @@ dependencies = [ "rand", "rand_core", "rayon", - "sha2", + "sha2 0.10.8", "static_assertions", "subtle", "unroll", @@ -2064,7 +2201,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -2125,6 +2262,29 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "pin-project-lite", +] + [[package]] name = "httparse" version = "1.9.4" @@ -2149,7 +2309,7 @@ dependencies = [ "futures-util", "h2", "http 0.2.12", - "http-body", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -2161,6 +2321,25 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -2169,10 +2348,28 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper", - "rustls", + "hyper 0.14.30", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls 0.23.12", + "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.0", + "tower-service", + "webpki-roots 0.26.5", ] [[package]] @@ -2182,12 +2379,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.30", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "hyper-util" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -2211,6 +2428,139 @@ dependencies = [ "cc", ] +[[package]] +name = "ic-agent" +version = "0.37.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd3fdf5e5c4f4a9fe5ca612f0febd22dcb161d2f2b75b0142326732be5e4978" +dependencies = [ + "async-lock", + "backoff", + "cached", + "candid", + "ed25519-consensus", + "futures-util", + "hex", + "http 1.1.0", + "http-body 1.0.1", + "ic-certification", + "ic-transport-types", + "ic-verify-bls-signature", + "k256", + "leb128", + "p256", + "pem 3.0.4", + "pkcs8", + "rand", + "rangemap", + "reqwest 0.12.7", + "ring 0.17.8", + "rustls-webpki 0.102.7", + "sec1", + "serde", + "serde_bytes", + "serde_cbor", + "serde_repr", + "sha2 0.10.8", + "simple_asn1", + "thiserror", + "time", + "tokio", + "url", +] + +[[package]] +name = "ic-certification" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64ee3d8b6e81b51f245716d3e0badb63c283c00f3c9fb5d5219afc30b5bf821" +dependencies = [ + "hex", + "serde", + "serde_bytes", + "sha2 0.10.8", +] + +[[package]] +name = "ic-transport-types" +version = "0.37.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875dc4704780383112e8e8b5063a1b98de114321d0c7d3e7f635dcf360a57fba" +dependencies = [ + "candid", + "hex", + "ic-certification", + "leb128", + "serde", + "serde_bytes", + "serde_repr", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "ic-utils" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fa832296800758c9c921dd1704985ded6b3e6fbc3aee409727eb1f00d69a595" +dependencies = [ + "async-trait", + "candid", + "futures-util", + "ic-agent", + "once_cell", + "semver 1.0.23", + "serde", + "serde_bytes", + "sha2 0.10.8", + "strum", + "strum_macros", + "thiserror", + "time", + "tokio", +] + +[[package]] +name = "ic-verify-bls-signature" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d420b25c0091059f6c3c23a21427a81915e6e0aca3b79e0d403ed767f286a3b9" +dependencies = [ + "hex", + "ic_bls12_381", + "lazy_static", + "pairing", + "rand", + "sha2 0.10.8", +] + +[[package]] +name = "ic_bls12_381" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22c65787944f32af084dffd0c68c1e544237b76e215654ddea8cd9f527dd8b69" +dependencies = [ + "digest 0.10.7", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + +[[package]] +name = "ic_principal" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1762deb6f7c8d8c2bdee4b6c5a47b60195b74e9b5280faa5ba29692f8e17429c" +dependencies = [ + "crc32fast", + "data-encoding", + "serde", + "sha2 0.10.8", + "thiserror", +] + [[package]] name = "idna" version = "0.2.3" @@ -2442,7 +2792,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ "base64 0.21.7", - "pem", + "pem 1.1.1", "ring 0.16.20", "serde", "serde_json", @@ -2459,7 +2809,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2", + "sha2 0.10.8", "signature", ] @@ -2511,6 +2861,12 @@ dependencies = [ "spin 0.9.8", ] +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "lettre" version = "0.10.4" @@ -2662,7 +3018,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest", + "digest 0.10.7", ] [[package]] @@ -2824,6 +3180,7 @@ dependencies = [ "num-integer", "num-traits", "rand", + "serde", ] [[package]] @@ -2922,11 +3279,11 @@ dependencies = [ "getrandom", "http 0.2.12", "rand", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "serde_path_to_error", - "sha2", + "sha2 0.10.8", "thiserror", "url", ] @@ -2955,13 +3312,19 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "open-fastrlp" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" dependencies = [ - "arrayvec", + "arrayvec 0.7.6", "auto_impl", "bytes", "ethereum-types", @@ -3030,6 +3393,18 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.8", +] + [[package]] name = "pairing" version = "0.23.0" @@ -3045,7 +3420,7 @@ version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ - "arrayvec", + "arrayvec 0.7.6", "bitvec", "byte-slice-cast", "impl-trait-for-tuples", @@ -3163,10 +3538,10 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest", + "digest 0.10.7", "hmac", "password-hash", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -3175,7 +3550,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest", + "digest 0.10.7", "hmac", ] @@ -3188,6 +3563,16 @@ dependencies = [ "base64 0.13.1", ] +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.1", + "serde", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -3245,7 +3630,7 @@ checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" dependencies = [ "once_cell", "pest", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -3411,6 +3796,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "pretty" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55c4d17d994b637e2f4daf6e5dc5d660d209d5642377d675d7a1c3ab69fa579" +dependencies = [ + "arrayvec 0.5.2", + "typed-arena", + "unicode-width", +] + [[package]] name = "prettyplease" version = "0.2.22" @@ -3421,6 +3817,15 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "primitive-types" version = "0.12.2" @@ -3469,6 +3874,15 @@ dependencies = [ "unarray", ] +[[package]] +name = "psm" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1f9bf148c15500d44581654fb9260bc9d82970f3ef777a79a40534f6aa784f" +dependencies = [ + "cc", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -3481,6 +3895,54 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +[[package]] +name = "quinn" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d2fb862b7ba45e615c1429def928f2e15f815bdf933b27a2d3824e224c1f46" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.12", + "socket2 0.5.7", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0a9b3a42929fad8a7c3de7f86ce0814cfa893328157672680e9fb1145549c5" +dependencies = [ + "bytes", + "rand", + "ring 0.17.8", + "rustc-hash", + "rustls 0.23.12", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" +dependencies = [ + "libc", + "once_cell", + "socket2 0.5.7", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.37" @@ -3547,6 +4009,12 @@ dependencies = [ "rand_core", ] +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -3650,17 +4118,19 @@ dependencies = [ "async-trait", "axum", "base64 0.21.7", + "candid", "chrono", "dotenv", "ethers", "ff", "file-rotate", - "function_name", "futures", "graphql_client", "handlebars", "hex", "http 1.1.0", + "ic-agent", + "ic-utils", "lazy_static", "lettre", "num-bigint", @@ -3669,7 +4139,7 @@ dependencies = [ "rand", "regex", "relayer-utils", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "sled", @@ -3732,9 +4202,9 @@ dependencies = [ "futures-util", "h2", "http 0.2.12", - "http-body", - "hyper", - "hyper-rustls", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-rustls 0.24.2", "hyper-tls", "ipnet", "js-sys", @@ -3744,25 +4214,70 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls", - "rustls-pemfile", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", - "tokio-rustls", + "tokio-rustls 0.24.1", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 0.25.4", "winreg", ] +[[package]] +name = "reqwest" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls 0.27.2", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.12", + "rustls-pemfile 2.1.3", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "tokio", + "tokio-rustls 0.26.0", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 0.26.5", + "windows-registry", +] + [[package]] name = "resolv-conf" version = "0.7.0" @@ -3819,7 +4334,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -3851,7 +4366,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" dependencies = [ "const-oid", - "digest", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-traits", @@ -3859,7 +4374,7 @@ dependencies = [ "pkcs8", "rand_core", "serde", - "sha2", + "sha2 0.10.8", "signature", "spki", "subtle", @@ -3872,6 +4387,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -3908,10 +4429,24 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring 0.17.8", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.23.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +dependencies = [ + "once_cell", + "ring 0.17.8", + "rustls-pki-types", + "rustls-webpki 0.102.7", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -3921,6 +4456,22 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -3931,6 +4482,17 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustls-webpki" +version = "0.102.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84678086bd54edf2b415183ed7a94d0efb049f1b646a33e22a36f3794be6ae56" +dependencies = [ + "ring 0.17.8", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -4015,7 +4577,7 @@ dependencies = [ "hmac", "pbkdf2 0.11.0", "salsa20", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -4127,6 +4689,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_cbor" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.209" @@ -4170,6 +4751,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "serde_spanned" version = "0.6.7" @@ -4199,7 +4791,7 @@ checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -4210,7 +4802,20 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", ] [[package]] @@ -4221,7 +4826,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -4230,7 +4835,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] @@ -4255,7 +4860,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -4463,7 +5068,7 @@ dependencies = [ "percent-encoding", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "smallvec", "sqlformat", "thiserror", @@ -4502,7 +5107,7 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "sqlx-core", "sqlx-mysql", "sqlx-postgres", @@ -4525,7 +5130,7 @@ dependencies = [ "byteorder", "bytes", "crc", - "digest", + "digest 0.10.7", "dotenvy", "either", "futures-channel", @@ -4546,7 +5151,7 @@ dependencies = [ "rsa", "serde", "sha1", - "sha2", + "sha2 0.10.8", "smallvec", "sqlx-core", "stringprep", @@ -4585,7 +5190,7 @@ dependencies = [ "serde", "serde_json", "sha1", - "sha2", + "sha2 0.10.8", "smallvec", "sqlx-core", "stringprep", @@ -4617,6 +5222,19 @@ dependencies = [ "urlencoding", ] +[[package]] +name = "stacker" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -4687,6 +5305,12 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "svm-rs" version = "0.3.5" @@ -4697,11 +5321,11 @@ dependencies = [ "fs2", "hex", "once_cell", - "reqwest", + "reqwest 0.11.27", "semver 1.0.23", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "thiserror", "url", "zip", @@ -4746,6 +5370,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -4945,7 +5578,18 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls 0.23.12", + "rustls-pki-types", "tokio", ] @@ -4968,11 +5612,11 @@ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", - "rustls", + "rustls 0.21.12", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tungstenite", - "webpki-roots", + "webpki-roots 0.25.4", ] [[package]] @@ -5048,7 +5692,7 @@ dependencies = [ "futures-core", "futures-util", "http 0.2.12", - "http-body", + "http-body 0.4.6", "pin-project-lite", "tower-layer", "tower-service", @@ -5172,13 +5816,19 @@ dependencies = [ "httparse", "log", "rand", - "rustls", + "rustls 0.21.12", "sha1", "thiserror", "url", "utf-8", ] +[[package]] +name = "typed-arena" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" + [[package]] name = "typenum" version = "1.17.0" @@ -5242,6 +5892,12 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + [[package]] name = "unicode-xid" version = "0.2.5" @@ -5469,6 +6125,19 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "wasm-streams" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.70" @@ -5502,6 +6171,15 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "webpki-roots" +version = "0.26.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "whoami" version = "1.5.1" @@ -5558,6 +6236,36 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.45.0" diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 8abc863d..d883d951 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -48,10 +48,12 @@ slog-async = "2.8.0" slog-term = "2.9.0" slog-json = "2.6.1" file-rotate = "0.7.5" -function_name = "0.3.0" base64 = "0.21.7" uuid = "1.8.0" http = "1.1.0" +ic-agent = { version = "0.37.1", features = ["pem", "reqwest"] } +ic-utils = "0.37.0" +candid = "0.10.10" [build-dependencies] ethers = "2.0.10" diff --git a/packages/relayer/src/abis/email_account_recovery.rs b/packages/relayer/src/abis/email_account_recovery.rs index 79605210..86e02813 100644 --- a/packages/relayer/src/abis/email_account_recovery.rs +++ b/packages/relayer/src/abis/email_account_recovery.rs @@ -7,7 +7,7 @@ pub use email_account_recovery::*; clippy::upper_case_acronyms, clippy::type_complexity, dead_code, - non_camel_case_types + non_camel_case_types, )] pub mod email_account_recovery { #[allow(deprecated)] @@ -17,431 +17,541 @@ pub mod email_account_recovery { functions: ::core::convert::From::from([ ( ::std::borrow::ToOwned::to_owned("acceptanceSubjectTemplates"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("acceptanceSubjectTemplates",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Array( + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "acceptanceSubjectTemplates", + ), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Array( ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::String, + ::ethers::core::abi::ethabi::ParamType::Array( + ::std::boxed::Box::new( + ::ethers::core::abi::ethabi::ParamType::String, + ), + ), ), ), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string[][]"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("string[][]"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("completeRecovery"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("completeRecovery"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("completeCalldata"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("completeRecovery"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("account"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("completeCalldata"), + kind: ::ethers::core::abi::ethabi::ParamType::Bytes, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes"), + ), + }, + ], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("computeAcceptanceTemplateId"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("computeAcceptanceTemplateId",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "computeAcceptanceTemplateId", ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("templateIdx"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("computeEmailAuthAddress"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("computeEmailAuthAddress",), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("recoveredAccount"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("accountSalt"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "computeEmailAuthAddress", ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("recoveredAccount"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("accountSalt"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( + 32usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + }, + ], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("computeRecoveryTemplateId"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("computeRecoveryTemplateId",), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "computeRecoveryTemplateId", ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - },], + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("templateIdx"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("dkim"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("dkim"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("dkim"), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("dkimAddr"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("dkimAddr"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("dkimAddr"), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("emailAuthImplementation"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("emailAuthImplementation",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "emailAuthImplementation", ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("emailAuthImplementationAddr"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("emailAuthImplementationAddr",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "emailAuthImplementationAddr", ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ( ::std::borrow::ToOwned::to_owned( "extractRecoveredAccountFromAcceptanceSubject", ), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "extractRecoveredAccountFromAcceptanceSubject", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("subjectParams"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes[]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "extractRecoveredAccountFromAcceptanceSubject", ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("extractRecoveredAccountFromRecoverySubject"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "extractRecoveredAccountFromRecoverySubject", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("subjectParams"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("subjectParams"), + kind: ::ethers::core::abi::ethabi::ParamType::Array( + ::std::boxed::Box::new( + ::ethers::core::abi::ethabi::ParamType::Bytes, + ), ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes[]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes[]"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("templateIdx"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ( - ::std::borrow::ToOwned::to_owned("handleAcceptance"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("handleAcceptance"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("emailAuthMsg"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Array( + ::std::borrow::ToOwned::to_owned( + "extractRecoveredAccountFromRecoverySubject", + ), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "extractRecoveredAccountFromRecoverySubject", + ), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("subjectParams"), + kind: ::ethers::core::abi::ethabi::ParamType::Array( ::std::boxed::Box::new( ::ethers::core::abi::ethabi::ParamType::Bytes, ), ), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::String, - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::String, - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::Bool, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ],), - ],), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct EmailAuthMsg"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes[]"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("templateIdx"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], + ), + ( + ::std::borrow::ToOwned::to_owned("handleAcceptance"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("handleAcceptance"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("emailAuthMsg"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple( + ::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Array( + ::std::boxed::Box::new( + ::ethers::core::abi::ethabi::ParamType::Bytes, + ), + ), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Tuple( + ::std::vec![ + ::ethers::core::abi::ethabi::ParamType::String, + ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::String, + ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), + ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), + ::ethers::core::abi::ethabi::ParamType::Bool, + ::ethers::core::abi::ethabi::ParamType::Bytes, + ], + ), + ], + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("struct EmailAuthMsg"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("templateIdx"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("handleRecovery"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("handleRecovery"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("emailAuthMsg"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("handleRecovery"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("emailAuthMsg"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple( + ::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Array( + ::std::boxed::Box::new( + ::ethers::core::abi::ethabi::ParamType::Bytes, + ), + ), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Tuple( + ::std::vec![ + ::ethers::core::abi::ethabi::ParamType::String, + ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::String, + ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), + ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), + ::ethers::core::abi::ethabi::ParamType::Bool, + ::ethers::core::abi::ethabi::ParamType::Bytes, + ], + ), + ], + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("struct EmailAuthMsg"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("templateIdx"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), ), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::String, - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::String, - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::Bool, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ],), - ],), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct EmailAuthMsg"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - },], + }, + ], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("isActivated"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("isActivated"), - inputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("recoveredAccount"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("isActivated"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("recoveredAccount"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("recoverySubjectTemplates"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("recoverySubjectTemplates",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Array( + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned( + "recoverySubjectTemplates", + ), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Array( ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::String, + ::ethers::core::abi::ethabi::ParamType::Array( + ::std::boxed::Box::new( + ::ethers::core::abi::ethabi::ParamType::String, + ), + ), ), ), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string[][]"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("string[][]"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("verifier"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifier"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("verifier"), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ( ::std::borrow::ToOwned::to_owned("verifierAddr"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifierAddr"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("verifierAddr"), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], ), ]), events: ::std::collections::BTreeMap::new(), @@ -451,8 +561,9 @@ pub mod email_account_recovery { } } ///The parsed JSON ABI of the contract. - pub static EMAILACCOUNTRECOVERY_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); + pub static EMAILACCOUNTRECOVERY_ABI: ::ethers::contract::Lazy< + ::ethers::core::abi::Abi, + > = ::ethers::contract::Lazy::new(__abi); pub struct EmailAccountRecovery(::ethers::contract::Contract); impl ::core::clone::Clone for EmailAccountRecovery { fn clone(&self) -> Self { @@ -484,11 +595,13 @@ pub mod email_account_recovery { address: T, client: ::std::sync::Arc, ) -> Self { - Self(::ethers::contract::Contract::new( - address.into(), - EMAILACCOUNTRECOVERY_ABI.clone(), - client, - )) + Self( + ::ethers::contract::Contract::new( + address.into(), + EMAILACCOUNTRECOVERY_ABI.clone(), + client, + ), + ) } ///Calls the contract's `acceptanceSubjectTemplates` (0x5bafadda) function pub fn acceptance_subject_templates( @@ -525,7 +638,10 @@ pub mod email_account_recovery { &self, recovered_account: ::ethers::core::types::Address, account_salt: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 .method_hash([58, 142, 171, 20], (recovered_account, account_salt)) .expect("method not found (this should never happen)") @@ -542,7 +658,10 @@ pub mod email_account_recovery { ///Calls the contract's `dkim` (0x400ad5ce) function pub fn dkim( &self, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 .method_hash([64, 10, 213, 206], ()) .expect("method not found (this should never happen)") @@ -550,7 +669,10 @@ pub mod email_account_recovery { ///Calls the contract's `dkimAddr` (0x73357f85) function pub fn dkim_addr( &self, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 .method_hash([115, 53, 127, 133], ()) .expect("method not found (this should never happen)") @@ -558,7 +680,10 @@ pub mod email_account_recovery { ///Calls the contract's `emailAuthImplementation` (0xb6201692) function pub fn email_auth_implementation( &self, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 .method_hash([182, 32, 22, 146], ()) .expect("method not found (this should never happen)") @@ -566,7 +691,10 @@ pub mod email_account_recovery { ///Calls the contract's `emailAuthImplementationAddr` (0x1098e02e) function pub fn email_auth_implementation_addr( &self, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 .method_hash([16, 152, 224, 46], ()) .expect("method not found (this should never happen)") @@ -576,7 +704,10 @@ pub mod email_account_recovery { &self, subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, template_idx: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 .method_hash([232, 29, 202, 242], (subject_params, template_idx)) .expect("method not found (this should never happen)") @@ -586,7 +717,10 @@ pub mod email_account_recovery { &self, subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, template_idx: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 .method_hash([48, 230, 165, 171], (subject_params, template_idx)) .expect("method not found (this should never happen)") @@ -634,7 +768,10 @@ pub mod email_account_recovery { ///Calls the contract's `verifier` (0x2b7ac3f3) function pub fn verifier( &self, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 .method_hash([43, 122, 195, 243], ()) .expect("method not found (this should never happen)") @@ -642,15 +779,17 @@ pub mod email_account_recovery { ///Calls the contract's `verifierAddr` (0x663ea2e2) function pub fn verifier_addr( &self, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 .method_hash([102, 62, 162, 226], ()) .expect("method not found (this should never happen)") } } impl From<::ethers::contract::Contract> - for EmailAccountRecovery - { + for EmailAccountRecovery { fn from(contract: ::ethers::contract::Contract) -> Self { Self::new(contract.address(), contract.client()) } @@ -664,12 +803,9 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, - )] - #[ethcall( - name = "acceptanceSubjectTemplates", - abi = "acceptanceSubjectTemplates()" + Hash )] + #[ethcall(name = "acceptanceSubjectTemplates", abi = "acceptanceSubjectTemplates()")] pub struct AcceptanceSubjectTemplatesCall; ///Container type for all input parameters for the `completeRecovery` function with signature `completeRecovery(address,bytes)` and selector `0xc18d09cf` #[derive( @@ -680,7 +816,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall(name = "completeRecovery", abi = "completeRecovery(address,bytes)")] pub struct CompleteRecoveryCall { @@ -696,7 +832,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall( name = "computeAcceptanceTemplateId", @@ -714,7 +850,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall( name = "computeEmailAuthAddress", @@ -733,7 +869,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall( name = "computeRecoveryTemplateId", @@ -751,7 +887,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall(name = "dkim", abi = "dkim()")] pub struct DkimCall; @@ -764,7 +900,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall(name = "dkimAddr", abi = "dkimAddr()")] pub struct DkimAddrCall; @@ -777,7 +913,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall(name = "emailAuthImplementation", abi = "emailAuthImplementation()")] pub struct EmailAuthImplementationCall; @@ -790,7 +926,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall( name = "emailAuthImplementationAddr", @@ -806,7 +942,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall( name = "extractRecoveredAccountFromAcceptanceSubject", @@ -825,7 +961,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall( name = "extractRecoveredAccountFromRecoverySubject", @@ -844,7 +980,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall( name = "handleAcceptance", @@ -863,7 +999,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall( name = "handleRecovery", @@ -882,7 +1018,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall(name = "isActivated", abi = "isActivated(address)")] pub struct IsActivatedCall { @@ -897,7 +1033,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall(name = "recoverySubjectTemplates", abi = "recoverySubjectTemplates()")] pub struct RecoverySubjectTemplatesCall; @@ -910,7 +1046,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall(name = "verifier", abi = "verifier()")] pub struct VerifierCall; @@ -923,7 +1059,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] #[ethcall(name = "verifierAddr", abi = "verifierAddr()")] pub struct VerifierAddrCall; @@ -942,7 +1078,9 @@ pub mod email_account_recovery { ExtractRecoveredAccountFromAcceptanceSubject( ExtractRecoveredAccountFromAcceptanceSubjectCall, ), - ExtractRecoveredAccountFromRecoverySubject(ExtractRecoveredAccountFromRecoverySubjectCall), + ExtractRecoveredAccountFromRecoverySubject( + ExtractRecoveredAccountFromRecoverySubjectCall, + ), HandleAcceptance(HandleAcceptanceCall), HandleRecovery(HandleRecoveryCall), IsActivated(IsActivatedCall), @@ -955,45 +1093,49 @@ pub mod email_account_recovery { data: impl AsRef<[u8]>, ) -> ::core::result::Result { let data = data.as_ref(); - if let Ok(decoded) = - ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::AcceptanceSubjectTemplates(decoded)); } - if let Ok(decoded) = - ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::CompleteRecovery(decoded)); } - if let Ok(decoded) = - ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::ComputeAcceptanceTemplateId(decoded)); } - if let Ok(decoded) = - ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::ComputeEmailAuthAddress(decoded)); } - if let Ok(decoded) = - ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::ComputeRecoveryTemplateId(decoded)); } - if let Ok(decoded) = ::decode(data) { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::Dkim(decoded)); } - if let Ok(decoded) = ::decode(data) { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::DkimAddr(decoded)); } - if let Ok(decoded) = - ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::EmailAuthImplementation(decoded)); } - if let Ok(decoded) = - ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::EmailAuthImplementationAddr(decoded)); } if let Ok(decoded) = ::decode( @@ -1006,29 +1148,34 @@ pub mod email_account_recovery { ) { return Ok(Self::ExtractRecoveredAccountFromRecoverySubject(decoded)); } - if let Ok(decoded) = - ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::HandleAcceptance(decoded)); } - if let Ok(decoded) = - ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::HandleRecovery(decoded)); } - if let Ok(decoded) = ::decode(data) { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::IsActivated(decoded)); } - if let Ok(decoded) = - ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::RecoverySubjectTemplates(decoded)); } - if let Ok(decoded) = ::decode(data) { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::Verifier(decoded)); } - if let Ok(decoded) = ::decode(data) - { + if let Ok(decoded) = ::decode( + data, + ) { return Ok(Self::VerifierAddr(decoded)); } Err(::ethers::core::abi::Error::InvalidData.into()) @@ -1040,7 +1187,9 @@ pub mod email_account_recovery { Self::AcceptanceSubjectTemplates(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::CompleteRecovery(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::CompleteRecovery(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::ComputeAcceptanceTemplateId(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -1051,7 +1200,9 @@ pub mod email_account_recovery { ::ethers::core::abi::AbiEncode::encode(element) } Self::Dkim(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::DkimAddr(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::DkimAddr(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::EmailAuthImplementation(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -1064,29 +1215,51 @@ pub mod email_account_recovery { Self::ExtractRecoveredAccountFromRecoverySubject(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::HandleAcceptance(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::HandleRecovery(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::IsActivated(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::HandleAcceptance(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::HandleRecovery(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::IsActivated(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::RecoverySubjectTemplates(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::Verifier(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::VerifierAddr(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::Verifier(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::VerifierAddr(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } } } } impl ::core::fmt::Display for EmailAccountRecoveryCalls { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { - Self::AcceptanceSubjectTemplates(element) => ::core::fmt::Display::fmt(element, f), + Self::AcceptanceSubjectTemplates(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::CompleteRecovery(element) => ::core::fmt::Display::fmt(element, f), - Self::ComputeAcceptanceTemplateId(element) => ::core::fmt::Display::fmt(element, f), - Self::ComputeEmailAuthAddress(element) => ::core::fmt::Display::fmt(element, f), - Self::ComputeRecoveryTemplateId(element) => ::core::fmt::Display::fmt(element, f), + Self::ComputeAcceptanceTemplateId(element) => { + ::core::fmt::Display::fmt(element, f) + } + Self::ComputeEmailAuthAddress(element) => { + ::core::fmt::Display::fmt(element, f) + } + Self::ComputeRecoveryTemplateId(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::Dkim(element) => ::core::fmt::Display::fmt(element, f), Self::DkimAddr(element) => ::core::fmt::Display::fmt(element, f), - Self::EmailAuthImplementation(element) => ::core::fmt::Display::fmt(element, f), - Self::EmailAuthImplementationAddr(element) => ::core::fmt::Display::fmt(element, f), + Self::EmailAuthImplementation(element) => { + ::core::fmt::Display::fmt(element, f) + } + Self::EmailAuthImplementationAddr(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::ExtractRecoveredAccountFromAcceptanceSubject(element) => { ::core::fmt::Display::fmt(element, f) } @@ -1096,13 +1269,16 @@ pub mod email_account_recovery { Self::HandleAcceptance(element) => ::core::fmt::Display::fmt(element, f), Self::HandleRecovery(element) => ::core::fmt::Display::fmt(element, f), Self::IsActivated(element) => ::core::fmt::Display::fmt(element, f), - Self::RecoverySubjectTemplates(element) => ::core::fmt::Display::fmt(element, f), + Self::RecoverySubjectTemplates(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::Verifier(element) => ::core::fmt::Display::fmt(element, f), Self::VerifierAddr(element) => ::core::fmt::Display::fmt(element, f), } } } - impl ::core::convert::From for EmailAccountRecoveryCalls { + impl ::core::convert::From + for EmailAccountRecoveryCalls { fn from(value: AcceptanceSubjectTemplatesCall) -> Self { Self::AcceptanceSubjectTemplates(value) } @@ -1112,17 +1288,20 @@ pub mod email_account_recovery { Self::CompleteRecovery(value) } } - impl ::core::convert::From for EmailAccountRecoveryCalls { + impl ::core::convert::From + for EmailAccountRecoveryCalls { fn from(value: ComputeAcceptanceTemplateIdCall) -> Self { Self::ComputeAcceptanceTemplateId(value) } } - impl ::core::convert::From for EmailAccountRecoveryCalls { + impl ::core::convert::From + for EmailAccountRecoveryCalls { fn from(value: ComputeEmailAuthAddressCall) -> Self { Self::ComputeEmailAuthAddress(value) } } - impl ::core::convert::From for EmailAccountRecoveryCalls { + impl ::core::convert::From + for EmailAccountRecoveryCalls { fn from(value: ComputeRecoveryTemplateIdCall) -> Self { Self::ComputeRecoveryTemplateId(value) } @@ -1137,26 +1316,26 @@ pub mod email_account_recovery { Self::DkimAddr(value) } } - impl ::core::convert::From for EmailAccountRecoveryCalls { + impl ::core::convert::From + for EmailAccountRecoveryCalls { fn from(value: EmailAuthImplementationCall) -> Self { Self::EmailAuthImplementation(value) } } - impl ::core::convert::From for EmailAccountRecoveryCalls { + impl ::core::convert::From + for EmailAccountRecoveryCalls { fn from(value: EmailAuthImplementationAddrCall) -> Self { Self::EmailAuthImplementationAddr(value) } } impl ::core::convert::From - for EmailAccountRecoveryCalls - { + for EmailAccountRecoveryCalls { fn from(value: ExtractRecoveredAccountFromAcceptanceSubjectCall) -> Self { Self::ExtractRecoveredAccountFromAcceptanceSubject(value) } } impl ::core::convert::From - for EmailAccountRecoveryCalls - { + for EmailAccountRecoveryCalls { fn from(value: ExtractRecoveredAccountFromRecoverySubjectCall) -> Self { Self::ExtractRecoveredAccountFromRecoverySubject(value) } @@ -1176,7 +1355,8 @@ pub mod email_account_recovery { Self::IsActivated(value) } } - impl ::core::convert::From for EmailAccountRecoveryCalls { + impl ::core::convert::From + for EmailAccountRecoveryCalls { fn from(value: RecoverySubjectTemplatesCall) -> Self { Self::RecoverySubjectTemplates(value) } @@ -1200,7 +1380,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct AcceptanceSubjectTemplatesReturn( pub ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, @@ -1214,7 +1394,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct ComputeAcceptanceTemplateIdReturn(pub ::ethers::core::types::U256); ///Container type for all return fields from the `computeEmailAuthAddress` function with signature `computeEmailAuthAddress(address,bytes32)` and selector `0x3a8eab14` @@ -1226,7 +1406,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct ComputeEmailAuthAddressReturn(pub ::ethers::core::types::Address); ///Container type for all return fields from the `computeRecoveryTemplateId` function with signature `computeRecoveryTemplateId(uint256)` and selector `0x6da99515` @@ -1238,7 +1418,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct ComputeRecoveryTemplateIdReturn(pub ::ethers::core::types::U256); ///Container type for all return fields from the `dkim` function with signature `dkim()` and selector `0x400ad5ce` @@ -1250,7 +1430,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct DkimReturn(pub ::ethers::core::types::Address); ///Container type for all return fields from the `dkimAddr` function with signature `dkimAddr()` and selector `0x73357f85` @@ -1262,7 +1442,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct DkimAddrReturn(pub ::ethers::core::types::Address); ///Container type for all return fields from the `emailAuthImplementation` function with signature `emailAuthImplementation()` and selector `0xb6201692` @@ -1274,7 +1454,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct EmailAuthImplementationReturn(pub ::ethers::core::types::Address); ///Container type for all return fields from the `emailAuthImplementationAddr` function with signature `emailAuthImplementationAddr()` and selector `0x1098e02e` @@ -1286,7 +1466,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct EmailAuthImplementationAddrReturn(pub ::ethers::core::types::Address); ///Container type for all return fields from the `extractRecoveredAccountFromAcceptanceSubject` function with signature `extractRecoveredAccountFromAcceptanceSubject(bytes[],uint256)` and selector `0xe81dcaf2` @@ -1298,7 +1478,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct ExtractRecoveredAccountFromAcceptanceSubjectReturn( pub ::ethers::core::types::Address, @@ -1312,9 +1492,11 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] - pub struct ExtractRecoveredAccountFromRecoverySubjectReturn(pub ::ethers::core::types::Address); + pub struct ExtractRecoveredAccountFromRecoverySubjectReturn( + pub ::ethers::core::types::Address, + ); ///Container type for all return fields from the `isActivated` function with signature `isActivated(address)` and selector `0xc9faa7c5` #[derive( Clone, @@ -1324,7 +1506,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct IsActivatedReturn(pub bool); ///Container type for all return fields from the `recoverySubjectTemplates` function with signature `recoverySubjectTemplates()` and selector `0x3e91cdcd` @@ -1336,7 +1518,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct RecoverySubjectTemplatesReturn( pub ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, @@ -1350,7 +1532,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct VerifierReturn(pub ::ethers::core::types::Address); ///Container type for all return fields from the `verifierAddr` function with signature `verifierAddr()` and selector `0x663ea2e2` @@ -1362,7 +1544,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct VerifierAddrReturn(pub ::ethers::core::types::Address); ///`EmailAuthMsg(uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` @@ -1374,7 +1556,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct EmailAuthMsg { pub template_id: ::ethers::core::types::U256, @@ -1391,7 +1573,7 @@ pub mod email_account_recovery { Debug, PartialEq, Eq, - Hash, + Hash )] pub struct EmailProof { pub domain_name: ::std::string::String, diff --git a/packages/relayer/src/abis/mod.rs b/packages/relayer/src/abis/mod.rs index c9a06ccb..5fb44ddb 100644 --- a/packages/relayer/src/abis/mod.rs +++ b/packages/relayer/src/abis/mod.rs @@ -2,6 +2,6 @@ pub mod ecdsa_owned_dkim_registry; pub mod email_account_recovery; pub mod email_auth; -pub use ecdsa_owned_dkim_registry::*; -pub use email_account_recovery::*; +pub use ecdsa_owned_dkim_registry::ECDSAOwnedDKIMRegistry; +pub use email_account_recovery::EmailAccountRecovery; pub use email_auth::*; diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 758f9cfc..2ebf23e3 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -8,19 +8,18 @@ use ethers::{ abi::{encode, Token}, utils::keccak256, }; -use relayer_utils::{extract_substr_idxes, generate_email_auth_input, LOG}; +use relayer_utils::{extract_substr_idxes, generate_email_circuit_input, LOG}; const DOMAIN_FIELDS: usize = 9; const SUBJECT_FIELDS: usize = 20; const EMAIL_ADDR_FIELDS: usize = 9; -#[named] pub async fn handle_email(email: String) -> Result { let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; - trace!(LOG, "email: {}", email; "func" => function_name!()); + trace!(LOG, "email: {}", email); let guardian_email_addr = parsed_email.get_from_addr()?; let padded_from_addr = PaddedEmailAddr::from_email_addr(&guardian_email_addr); - trace!(LOG, "From address: {}", guardian_email_addr; "func" => function_name!()); + trace!(LOG, "From address: {}", guardian_email_addr); let email_body = parsed_email.get_body()?; let request_decomposed_def = @@ -29,7 +28,7 @@ pub async fn handle_email(email: String) -> Result { if request_idxes.is_empty() { bail!(WRONG_SUBJECT_FORMAT); } - info!(LOG, "Request idxes: {:?}", request_idxes; "func" => function_name!()); + info!(LOG, "Request idxes: {:?}", request_idxes); let request_id = &email[request_idxes[0].0..request_idxes[0].1]; let request_id_u32 = request_id .parse::() @@ -66,8 +65,8 @@ pub async fn handle_email(email: String) -> Result { ) .await?; - if let Ok(invitation_code) = parsed_email.get_invitation_code() { - trace!(LOG, "Email with account code"; "func" => function_name!()); + if let Ok(invitation_code) = parsed_email.get_invitation_code(false) { + trace!(LOG, "Email with account code"); if account_code_str != invitation_code { return Err(anyhow!( @@ -112,9 +111,10 @@ pub async fn handle_email(email: String) -> Result { let template_id = keccak256(encode(&tokens)); - let circuit_input = generate_email_auth_input( + let circuit_input = generate_email_circuit_input( &email, - &AccountCode::from(hex2field(&format!("0x{}", &account_code_str))?), + &AccountCode::from(hex_to_field(&format!("0x{}", &account_code_str))?), + None, ) .await?; @@ -143,8 +143,8 @@ pub async fn handle_email(email: String) -> Result { proof: email_proof.clone(), }; - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg; "func" => function_name!()); - info!(LOG, "Request: {:?}", request; "func" => function_name!()); + info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); + info!(LOG, "Request: {:?}", request); match CLIENT .handle_acceptance( @@ -173,7 +173,7 @@ pub async fn handle_email(email: String) -> Result { is_processed: true, request_id: request.request_id, is_success: Some(true), - email_nullifier: Some(field2hex( + email_nullifier: Some(field_to_hex( &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), )), account_salt: Some(bytes32_to_hex(&account_salt)), @@ -197,7 +197,7 @@ pub async fn handle_email(email: String) -> Result { is_processed: true, request_id: request.request_id, is_success: Some(false), - email_nullifier: Some(field2hex( + email_nullifier: Some(field_to_hex( &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), )), account_salt: Some(bytes32_to_hex(&account_salt)), @@ -244,9 +244,10 @@ pub async fn handle_email(email: String) -> Result { let template_id = keccak256(encode(&tokens)); - let circuit_input = generate_email_auth_input( + let circuit_input = generate_email_circuit_input( &email, - &AccountCode::from(hex2field(&format!("0x{}", &account_code_str))?), + &AccountCode::from(hex_to_field(&format!("0x{}", &account_code_str))?), + None, ) .await?; @@ -275,8 +276,8 @@ pub async fn handle_email(email: String) -> Result { proof: email_proof.clone(), }; - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg; "func" => function_name!()); - info!(LOG, "Request: {:?}", request; "func" => function_name!()); + info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); + info!(LOG, "Request: {:?}", request); match CLIENT .handle_recovery( @@ -296,7 +297,7 @@ pub async fn handle_email(email: String) -> Result { is_processed: true, request_id: request.request_id, is_success: Some(true), - email_nullifier: Some(field2hex( + email_nullifier: Some(field_to_hex( &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), )), account_salt: Some(bytes32_to_hex(&account_salt)), @@ -320,7 +321,7 @@ pub async fn handle_email(email: String) -> Result { is_processed: true, request_id: request.request_id, is_success: Some(false), - email_nullifier: Some(field2hex( + email_nullifier: Some(field_to_hex( &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), )), account_salt: Some(bytes32_to_hex(&account_salt)), @@ -369,9 +370,10 @@ pub async fn handle_email(email: String) -> Result { let template_id = keccak256(encode(&tokens)); - let circuit_input = generate_email_auth_input( + let circuit_input = generate_email_circuit_input( &email, - &AccountCode::from(hex2field(&format!("0x{}", &account_code_str))?), + &AccountCode::from(hex_to_field(&format!("0x{}", &account_code_str))?), + None, ) .await?; @@ -400,8 +402,8 @@ pub async fn handle_email(email: String) -> Result { proof: email_proof.clone(), }; - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg; "func" => function_name!()); - info!(LOG, "Request: {:?}", request; "func" => function_name!()); + info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); + info!(LOG, "Request: {:?}", request); match CLIENT .handle_recovery( @@ -421,7 +423,7 @@ pub async fn handle_email(email: String) -> Result { is_processed: true, request_id: request.request_id, is_success: Some(true), - email_nullifier: Some(field2hex( + email_nullifier: Some(field_to_hex( &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), )), account_salt: Some(bytes32_to_hex(&account_salt)), @@ -445,7 +447,7 @@ pub async fn handle_email(email: String) -> Result { is_processed: true, request_id: request.request_id, is_success: Some(false), - email_nullifier: Some(field2hex( + email_nullifier: Some(field_to_hex( &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), )), account_salt: Some(bytes32_to_hex(&account_salt)), diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs index 51f13499..acd74822 100644 --- a/packages/relayer/src/database.rs +++ b/packages/relayer/src/database.rs @@ -73,7 +73,6 @@ impl Database { Ok(()) } - #[named] pub(crate) async fn get_credentials(&self, account_code: &str) -> Result> { let row = sqlx::query("SELECT * FROM credentials WHERE account_code = $1") .bind(account_code) @@ -92,7 +91,7 @@ impl Database { guardian_email_addr, is_set, }; - info!(LOG, "row {:?}", codes_row; "func" => function_name!()); + info!(LOG, "row {:?}", codes_row); Ok(Some(codes_row)) } None => Ok(None), @@ -159,9 +158,8 @@ impl Database { Ok(()) } - #[named] pub(crate) async fn insert_credentials(&self, row: &Credentials) -> Result<()> { - info!(LOG, "insert row {:?}", row; "func" => function_name!()); + info!(LOG, "insert row {:?}", row); let row = sqlx::query( "INSERT INTO credentials (account_code, account_eth_addr, guardian_email_addr, is_set) VALUES ($1, $2, $3, $4) RETURNING *", ) @@ -171,11 +169,7 @@ impl Database { .bind(row.is_set) .fetch_one(&self.db) .await?; - info!( - LOG, - "{} row inserted", - row.len(); "func" => function_name!() - ); + info!(LOG, "{} row inserted", row.len()); Ok(()) } @@ -193,7 +187,6 @@ impl Database { } } - #[named] pub(crate) async fn get_request(&self, request_id: u32) -> Result> { let row = sqlx::query("SELECT * FROM requests WHERE request_id = $1") .bind(request_id as i64) @@ -224,7 +217,7 @@ impl Database { email_nullifier, account_salt, }; - info!(LOG, "row {:?}", requests_row; "func" => function_name!()); + info!(LOG, "row {:?}", requests_row); Ok(Some(requests_row)) } None => Ok(None), @@ -270,7 +263,6 @@ impl Database { } } - #[named] pub(crate) async fn get_credentials_from_wallet_and_email( &self, account_eth_addr: &str, @@ -296,16 +288,15 @@ impl Database { guardian_email_addr, is_set, }; - info!(LOG, "row {:?}", codes_row; "func" => function_name!()); + info!(LOG, "row {:?}", codes_row); Ok(Some(codes_row)) } None => Ok(None), } } - #[named] pub(crate) async fn insert_request(&self, row: &Request) -> Result<()> { - info!(LOG, "insert row {:?}", row; "func" => function_name!()); + info!(LOG, "insert row {:?}", row); let row = sqlx::query( "INSERT INTO requests (request_id, account_eth_addr, controller_eth_addr, guardian_email_addr, is_for_recovery, template_idx, is_processed, is_success, email_nullifier, account_salt) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *", ) @@ -321,11 +312,7 @@ impl Database { .bind(&row.account_salt) .fetch_one(&self.db) .await?; - info!( - LOG, - "{} row inserted", - row.len(); "func" => function_name!() - ); + info!(LOG, "{} row inserted", row.len()); Ok(()) } } diff --git a/packages/relayer/src/lib.rs b/packages/relayer/src/lib.rs index 8245264d..5f31b8f9 100644 --- a/packages/relayer/src/lib.rs +++ b/packages/relayer/src/lib.rs @@ -19,7 +19,6 @@ pub use modules::*; use relayer_utils::LOG; pub use utils::*; -use ::function_name::named; use tokio::sync::Mutex; use anyhow::{anyhow, bail, Result}; @@ -69,9 +68,8 @@ lazy_static! { pub static ref SHARED_MUTEX: Arc> = Arc::new(Mutex::new(0)); } -#[named] pub async fn run(config: RelayerConfig) -> Result<()> { - info!(LOG, "Starting relayer"; "func" => function_name!()); + info!(LOG, "Starting relayer"); CIRCUITS_DIR_PATH.set(config.circuits_dir_path).unwrap(); WEB_SERVER_ADDRESS.set(config.web_server_address).unwrap(); @@ -93,11 +91,11 @@ pub async fn run(config: RelayerConfig) -> Result<()> { loop { match run_server().await { Ok(_) => { - info!(LOG, "run_server exited normally"; "func" => function_name!()); + info!(LOG, "run_server exited normally"); break; // Exit loop if run_server exits normally } Err(err) => { - error!(LOG, "Error api server: {}", err; "func" => function_name!()); + error!(LOG, "Error api server: {}", err); // Optionally, add a delay before restarting tokio::time::sleep(Duration::from_secs(5)).await; } diff --git a/packages/relayer/src/modules/dkim.rs b/packages/relayer/src/modules/dkim.rs index 31019f74..82e9f912 100644 --- a/packages/relayer/src/modules/dkim.rs +++ b/packages/relayer/src/modules/dkim.rs @@ -3,6 +3,7 @@ use relayer_utils::extract_substr_idxes; use relayer_utils::LOG; use crate::*; +use candid::CandidType; use ethers::types::Bytes; use ethers::utils::hex::FromHex; use ic_agent::agent::http_transport::ReqwestTransport; @@ -17,7 +18,7 @@ pub struct DkimOracleClient<'a> { pub canister: Canister<'a>, } -#[derive(Default, Deserialize, Debug, Clone)] +#[derive(Default, CandidType, Deserialize, Debug, Clone)] pub struct SignedDkimPublicKey { pub selector: String, pub domain: String, @@ -64,7 +65,6 @@ impl<'a> DkimOracleClient<'a> { } } -#[named] pub async fn check_and_update_dkim( email: &str, parsed_email: &ParsedEmail, @@ -75,11 +75,11 @@ pub async fn check_and_update_dkim( let mut public_key_n = parsed_email.public_key.clone(); public_key_n.reverse(); let public_key_hash = public_key_hash(&public_key_n)?; - info!(LOG, "public_key_hash {:?}", public_key_hash; "func" => function_name!()); + info!(LOG, "public_key_hash {:?}", public_key_hash); let domain = parsed_email.get_email_domain()?; - info!(LOG, "domain {:?}", domain; "func" => function_name!()); + info!(LOG, "domain {:?}", domain); if CLIENT.get_bytecode(&wallet_addr.to_string()).await? == Bytes::from(vec![0u8; 20]) { - info!(LOG, "wallet not deployed"; "func" => function_name!()); + info!(LOG, "wallet not deployed"); return Ok(()); } let email_auth_addr = CLIENT @@ -96,7 +96,7 @@ pub async fn check_and_update_dkim( if CLIENT.get_bytecode(&email_auth_addr).await? != Bytes::from(vec![]) { dkim = CLIENT.get_dkim_from_email_auth(&email_auth_addr).await?; } - info!(LOG, "dkim {:?}", dkim; "func" => function_name!()); + info!(LOG, "dkim {:?}", dkim); if CLIENT .check_if_dkim_public_key_hash_valid( domain.clone(), @@ -105,7 +105,7 @@ pub async fn check_and_update_dkim( ) .await? { - info!(LOG, "public key registered"; "func" => function_name!()); + info!(LOG, "public key registered"); return Ok(()); } let selector_decomposed_def = @@ -116,18 +116,18 @@ pub async fn check_and_update_dkim( let str = parsed_email.canonicalized_header[idxes.0..idxes.1].to_string(); str }; - info!(LOG, "selector {}", selector; "func" => function_name!()); + info!(LOG, "selector {}", selector); let ic_agent = DkimOracleClient::gen_agent( &env::var(PEM_PATH_KEY).unwrap(), &env::var(IC_REPLICA_URL_KEY).unwrap(), )?; let oracle_client = DkimOracleClient::new(&env::var(CANISTER_ID_KEY).unwrap(), &ic_agent)?; let oracle_result = oracle_client.request_signature(&selector, &domain).await?; - info!(LOG, "DKIM oracle result {:?}", oracle_result; "func" => function_name!()); + info!(LOG, "DKIM oracle result {:?}", oracle_result); let public_key_hash = hex::decode(&oracle_result.public_key_hash[2..])?; - info!(LOG, "public_key_hash from oracle {:?}", public_key_hash; "func" => function_name!()); + info!(LOG, "public_key_hash from oracle {:?}", public_key_hash); let signature = Bytes::from_hex(&oracle_result.signature[2..])?; - info!(LOG, "signature {:?}", signature; "func" => function_name!()); + info!(LOG, "signature {:?}", signature); let tx_hash = CLIENT .set_dkim_public_key_hash( selector, @@ -137,6 +137,6 @@ pub async fn check_and_update_dkim( dkim, ) .await?; - info!(LOG, "DKIM registry updated {:?}", tx_hash; "func" => function_name!()); + info!(LOG, "DKIM registry updated {:?}", tx_hash); Ok(()) } diff --git a/packages/relayer/src/modules/web_server/server.rs b/packages/relayer/src/modules/web_server/server.rs index da6c5a59..195d651c 100644 --- a/packages/relayer/src/modules/web_server/server.rs +++ b/packages/relayer/src/modules/web_server/server.rs @@ -3,7 +3,6 @@ use axum::Router; use relayer_utils::LOG; use tower_http::cors::{AllowHeaders, AllowMethods, Any, CorsLayer}; -#[named] pub async fn run_server() -> Result<()> { let addr = WEB_SERVER_ADDRESS.get().unwrap(); @@ -186,7 +185,7 @@ pub async fn run_server() -> Result<()> { .allow_origin(Any), ); - trace!(LOG, "Listening API at {}", addr; "func" => function_name!()); + trace!(LOG, "Listening API at {}", addr); axum::Server::bind(&addr.parse()?) .serve(app.into_make_service()) .await?; diff --git a/packages/relayer/src/utils/utils.rs b/packages/relayer/src/utils/utils.rs index f2dffca8..49c021c1 100644 --- a/packages/relayer/src/utils/utils.rs +++ b/packages/relayer/src/utils/utils.rs @@ -52,14 +52,13 @@ impl ProofJson { } } -#[named] pub async fn generate_proof( input: &str, request: &str, address: &str, ) -> Result<(Bytes, Vec)> { let client = reqwest::Client::new(); - info!(LOG, "prover input {}", input; "func" => function_name!()); + info!(LOG, "prover input {}", input); let res = client .post(format!("{}/prove/{}", address, request)) .json(&serde_json::json!({ "input": input })) @@ -67,7 +66,7 @@ pub async fn generate_proof( .await? .error_for_status()?; let res_json = res.json::().await?; - info!(LOG, "prover response {:?}", res_json; "func" => function_name!()); + info!(LOG, "prover response {:?}", res_json); let proof = res_json.proof.to_eth_bytes()?; let pub_signals = res_json .pub_signals @@ -88,12 +87,12 @@ pub fn calculate_default_hash(input: &str) -> String { pub fn calculate_account_salt(email_addr: &str, account_code: &str) -> String { let padded_email_addr = PaddedEmailAddr::from_email_addr(&email_addr); let account_code = if account_code.starts_with("0x") { - hex2field(&account_code).unwrap() + hex_to_field(&account_code).unwrap() } else { - hex2field(&format!("0x{}", account_code)).unwrap() + hex_to_field(&format!("0x{}", account_code)).unwrap() }; let account_code = AccountCode::from(account_code); let account_salt = AccountSalt::new(&padded_email_addr, account_code).unwrap(); - field2hex(&account_salt.0) + field_to_hex(&account_salt.0) } diff --git a/rust-toolchain b/rust-toolchain index 837f16a7..4fa580ba 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.73.0 \ No newline at end of file +1.80.1 \ No newline at end of file From 9ccd3b99de1399e38074e29d29e5ce28f2d02322 Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Tue, 3 Sep 2024 09:10:01 +0530 Subject: [PATCH 016/121] fix: updated command regex --- packages/circuits/src/regexes/command.json | 2 +- .../circuits/src/regexes/command_regex.circom | 562 +++++++++--------- .../email_auth_with_body_parsing_test1.eml | 104 ++-- .../email_auth_with_body_parsing_test2.eml | 104 ++-- .../email_auth_with_body_parsing_test3.eml | 104 ++-- .../email_auth_with_body_parsing_test4.eml | 106 ++-- .../email_auth_with_body_parsing_test5.eml | 108 ++-- .../email_auth_with_body_parsing_test6.eml | 104 ++-- 8 files changed, 593 insertions(+), 601 deletions(-) diff --git a/packages/circuits/src/regexes/command.json b/packages/circuits/src/regexes/command.json index 837fdb59..a59f8518 100644 --- a/packages/circuits/src/regexes/command.json +++ b/packages/circuits/src/regexes/command.json @@ -2,7 +2,7 @@ "parts": [ { "is_public": false, - "regex_def": "
" + "regex_def": "
" }, { "is_public": true, diff --git a/packages/circuits/src/regexes/command_regex.circom b/packages/circuits/src/regexes/command_regex.circom index 29ce4489..a6f7f567 100644 --- a/packages/circuits/src/regexes/command_regex.circom +++ b/packages/circuits/src/regexes/command_regex.circom @@ -2,7 +2,7 @@ pragma circom 2.1.5; include "@zk-email/zk-regex-circom/circuits/regex_helpers.circom"; -// regex:
[^<>/]+
+// regex:
[^<>/]+
template CommandRegex(msg_bytes) { signal input msg[msg_bytes]; signal output out; @@ -14,22 +14,22 @@ template CommandRegex(msg_bytes) { in[i+1] <== msg[i]; } - component eq[66][num_bytes]; + component eq[65][num_bytes]; component lt[14][num_bytes]; - component and[57][num_bytes]; + component and[56][num_bytes]; component multi_or[12][num_bytes]; - signal states[num_bytes+1][36]; - signal states_tmp[num_bytes+1][36]; + signal states[num_bytes+1][35]; + signal states_tmp[num_bytes+1][35]; signal from_zero_enabled[num_bytes+1]; from_zero_enabled[num_bytes] <== 0; component state_changed[num_bytes]; - for (var i = 1; i < 36; i++) { + for (var i = 1; i < 35; i++) { states[0][i] <== 0; } for (var i = 0; i < num_bytes; i++) { - state_changed[i] = MultiOR(35); + state_changed[i] = MultiOR(34); states[i][0] <== 1; eq[0][i] = IsEqual(); eq[0][i].in[0] <== in[i]; @@ -68,499 +68,492 @@ template CommandRegex(msg_bytes) { states[i+1][5] <== and[4][i].out; and[5][i] = AND(); and[5][i].a <== states[i][5]; - and[5][i].b <== eq[1][i].out; + and[5][i].b <== eq[2][i].out; states[i+1][6] <== and[5][i].out; and[6][i] = AND(); and[6][i].a <== states[i][6]; - and[6][i].b <== eq[2][i].out; + and[6][i].b <== eq[1][i].out; states[i+1][7] <== and[6][i].out; eq[5][i] = IsEqual(); eq[5][i].in[0] <== in[i]; - eq[5][i].in[1] <== 114; + eq[5][i].in[1] <== 61; and[7][i] = AND(); and[7][i].a <== states[i][7]; and[7][i].b <== eq[5][i].out; states[i+1][8] <== and[7][i].out; eq[6][i] = IsEqual(); eq[6][i].in[0] <== in[i]; - eq[6][i].in[1] <== 61; + eq[6][i].in[1] <== 51; and[8][i] = AND(); and[8][i].a <== states[i][8]; and[8][i].b <== eq[6][i].out; states[i+1][9] <== and[8][i].out; eq[7][i] = IsEqual(); eq[7][i].in[0] <== in[i]; - eq[7][i].in[1] <== 51; + eq[7][i].in[1] <== 68; and[9][i] = AND(); and[9][i].a <== states[i][9]; and[9][i].b <== eq[7][i].out; states[i+1][10] <== and[9][i].out; eq[8][i] = IsEqual(); eq[8][i].in[0] <== in[i]; - eq[8][i].in[1] <== 68; + eq[8][i].in[1] <== 34; and[10][i] = AND(); and[10][i].a <== states[i][10]; and[10][i].b <== eq[8][i].out; states[i+1][11] <== and[10][i].out; eq[9][i] = IsEqual(); eq[9][i].in[0] <== in[i]; - eq[9][i].in[1] <== 34; + eq[9][i].in[1] <== 122; and[11][i] = AND(); and[11][i].a <== states[i][11]; and[11][i].b <== eq[9][i].out; states[i+1][12] <== and[11][i].out; eq[10][i] = IsEqual(); eq[10][i].in[0] <== in[i]; - eq[10][i].in[1] <== 122; + eq[10][i].in[1] <== 107; and[12][i] = AND(); and[12][i].a <== states[i][12]; and[12][i].b <== eq[10][i].out; states[i+1][13] <== and[12][i].out; eq[11][i] = IsEqual(); eq[11][i].in[0] <== in[i]; - eq[11][i].in[1] <== 107; + eq[11][i].in[1] <== 101; and[13][i] = AND(); and[13][i].a <== states[i][13]; and[13][i].b <== eq[11][i].out; states[i+1][14] <== and[13][i].out; eq[12][i] = IsEqual(); eq[12][i].in[0] <== in[i]; - eq[12][i].in[1] <== 101; + eq[12][i].in[1] <== 109; and[14][i] = AND(); and[14][i].a <== states[i][14]; and[14][i].b <== eq[12][i].out; states[i+1][15] <== and[14][i].out; eq[13][i] = IsEqual(); eq[13][i].in[0] <== in[i]; - eq[13][i].in[1] <== 109; + eq[13][i].in[1] <== 97; and[15][i] = AND(); and[15][i].a <== states[i][15]; and[15][i].b <== eq[13][i].out; states[i+1][16] <== and[15][i].out; - eq[14][i] = IsEqual(); - eq[14][i].in[0] <== in[i]; - eq[14][i].in[1] <== 97; and[16][i] = AND(); and[16][i].a <== states[i][16]; - and[16][i].b <== eq[14][i].out; + and[16][i].b <== eq[2][i].out; states[i+1][17] <== and[16][i].out; + eq[14][i] = IsEqual(); + eq[14][i].in[0] <== in[i]; + eq[14][i].in[1] <== 108; and[17][i] = AND(); and[17][i].a <== states[i][17]; - and[17][i].b <== eq[2][i].out; + and[17][i].b <== eq[14][i].out; states[i+1][18] <== and[17][i].out; - eq[15][i] = IsEqual(); - eq[15][i].in[0] <== in[i]; - eq[15][i].in[1] <== 108; and[18][i] = AND(); and[18][i].a <== states[i][18]; - and[18][i].b <== eq[15][i].out; + and[18][i].b <== eq[8][i].out; states[i+1][19] <== and[18][i].out; + eq[15][i] = IsEqual(); + eq[15][i].in[0] <== in[i]; + eq[15][i].in[1] <== 62; and[19][i] = AND(); and[19][i].a <== states[i][19]; - and[19][i].b <== eq[9][i].out; + and[19][i].b <== eq[15][i].out; states[i+1][20] <== and[19][i].out; - eq[16][i] = IsEqual(); - eq[16][i].in[0] <== in[i]; - eq[16][i].in[1] <== 62; - and[20][i] = AND(); - and[20][i].a <== states[i][20]; - and[20][i].b <== eq[16][i].out; - states[i+1][21] <== and[20][i].out; lt[0][i] = LessEqThan(8); lt[0][i].in[0] <== 1; lt[0][i].in[1] <== in[i]; lt[1][i] = LessEqThan(8); lt[1][i].in[0] <== in[i]; lt[1][i].in[1] <== 46; - and[21][i] = AND(); - and[21][i].a <== lt[0][i].out; - and[21][i].b <== lt[1][i].out; + and[20][i] = AND(); + and[20][i].a <== lt[0][i].out; + and[20][i].b <== lt[1][i].out; lt[2][i] = LessEqThan(8); lt[2][i].in[0] <== 63; lt[2][i].in[1] <== in[i]; lt[3][i] = LessEqThan(8); lt[3][i].in[0] <== in[i]; lt[3][i].in[1] <== 127; - and[22][i] = AND(); - and[22][i].a <== lt[2][i].out; - and[22][i].b <== lt[3][i].out; + and[21][i] = AND(); + and[21][i].a <== lt[2][i].out; + and[21][i].b <== lt[3][i].out; + eq[16][i] = IsEqual(); + eq[16][i].in[0] <== in[i]; + eq[16][i].in[1] <== 48; eq[17][i] = IsEqual(); eq[17][i].in[0] <== in[i]; - eq[17][i].in[1] <== 48; + eq[17][i].in[1] <== 49; eq[18][i] = IsEqual(); eq[18][i].in[0] <== in[i]; - eq[18][i].in[1] <== 49; + eq[18][i].in[1] <== 50; eq[19][i] = IsEqual(); eq[19][i].in[0] <== in[i]; - eq[19][i].in[1] <== 50; + eq[19][i].in[1] <== 52; eq[20][i] = IsEqual(); eq[20][i].in[0] <== in[i]; - eq[20][i].in[1] <== 52; + eq[20][i].in[1] <== 53; eq[21][i] = IsEqual(); eq[21][i].in[0] <== in[i]; - eq[21][i].in[1] <== 53; + eq[21][i].in[1] <== 54; eq[22][i] = IsEqual(); eq[22][i].in[0] <== in[i]; - eq[22][i].in[1] <== 54; + eq[22][i].in[1] <== 55; eq[23][i] = IsEqual(); eq[23][i].in[0] <== in[i]; - eq[23][i].in[1] <== 55; + eq[23][i].in[1] <== 56; eq[24][i] = IsEqual(); eq[24][i].in[0] <== in[i]; - eq[24][i].in[1] <== 56; + eq[24][i].in[1] <== 57; eq[25][i] = IsEqual(); eq[25][i].in[0] <== in[i]; - eq[25][i].in[1] <== 57; + eq[25][i].in[1] <== 58; eq[26][i] = IsEqual(); eq[26][i].in[0] <== in[i]; - eq[26][i].in[1] <== 58; - eq[27][i] = IsEqual(); - eq[27][i].in[0] <== in[i]; - eq[27][i].in[1] <== 59; + eq[26][i].in[1] <== 59; + and[22][i] = AND(); + and[22][i].a <== states[i][20]; + multi_or[0][i] = MultiOR(15); + multi_or[0][i].in[0] <== and[20][i].out; + multi_or[0][i].in[1] <== and[21][i].out; + multi_or[0][i].in[2] <== eq[16][i].out; + multi_or[0][i].in[3] <== eq[17][i].out; + multi_or[0][i].in[4] <== eq[18][i].out; + multi_or[0][i].in[5] <== eq[6][i].out; + multi_or[0][i].in[6] <== eq[19][i].out; + multi_or[0][i].in[7] <== eq[20][i].out; + multi_or[0][i].in[8] <== eq[21][i].out; + multi_or[0][i].in[9] <== eq[22][i].out; + multi_or[0][i].in[10] <== eq[23][i].out; + multi_or[0][i].in[11] <== eq[24][i].out; + multi_or[0][i].in[12] <== eq[25][i].out; + multi_or[0][i].in[13] <== eq[26][i].out; + multi_or[0][i].in[14] <== eq[5][i].out; + and[22][i].b <== multi_or[0][i].out; and[23][i] = AND(); and[23][i].a <== states[i][21]; - multi_or[0][i] = MultiOR(15); - multi_or[0][i].in[0] <== and[21][i].out; - multi_or[0][i].in[1] <== and[22][i].out; - multi_or[0][i].in[2] <== eq[17][i].out; - multi_or[0][i].in[3] <== eq[18][i].out; - multi_or[0][i].in[4] <== eq[19][i].out; - multi_or[0][i].in[5] <== eq[7][i].out; - multi_or[0][i].in[6] <== eq[20][i].out; - multi_or[0][i].in[7] <== eq[21][i].out; - multi_or[0][i].in[8] <== eq[22][i].out; - multi_or[0][i].in[9] <== eq[23][i].out; - multi_or[0][i].in[10] <== eq[24][i].out; - multi_or[0][i].in[11] <== eq[25][i].out; - multi_or[0][i].in[12] <== eq[26][i].out; - multi_or[0][i].in[13] <== eq[27][i].out; - multi_or[0][i].in[14] <== eq[6][i].out; and[23][i].b <== multi_or[0][i].out; - and[24][i] = AND(); - and[24][i].a <== states[i][22]; - and[24][i].b <== multi_or[0][i].out; lt[4][i] = LessEqThan(8); lt[4][i].in[0] <== 128; lt[4][i].in[1] <== in[i]; lt[5][i] = LessEqThan(8); lt[5][i].in[0] <== in[i]; lt[5][i].in[1] <== 191; + and[24][i] = AND(); + and[24][i].a <== lt[4][i].out; + and[24][i].b <== lt[5][i].out; and[25][i] = AND(); - and[25][i].a <== lt[4][i].out; - and[25][i].b <== lt[5][i].out; - and[26][i] = AND(); - and[26][i].a <== states[i][23]; - and[26][i].b <== and[25][i].out; + and[25][i].a <== states[i][22]; + and[25][i].b <== and[24][i].out; multi_or[1][i] = MultiOR(3); - multi_or[1][i].in[0] <== and[23][i].out; - multi_or[1][i].in[1] <== and[24][i].out; - multi_or[1][i].in[2] <== and[26][i].out; - states[i+1][22] <== multi_or[1][i].out; + multi_or[1][i].in[0] <== and[22][i].out; + multi_or[1][i].in[1] <== and[23][i].out; + multi_or[1][i].in[2] <== and[25][i].out; + states[i+1][21] <== multi_or[1][i].out; lt[6][i] = LessEqThan(8); lt[6][i].in[0] <== 194; lt[6][i].in[1] <== in[i]; lt[7][i] = LessEqThan(8); lt[7][i].in[0] <== in[i]; lt[7][i].in[1] <== 223; + and[26][i] = AND(); + and[26][i].a <== lt[6][i].out; + and[26][i].b <== lt[7][i].out; and[27][i] = AND(); - and[27][i].a <== lt[6][i].out; - and[27][i].b <== lt[7][i].out; + and[27][i].a <== states[i][20]; + and[27][i].b <== and[26][i].out; and[28][i] = AND(); and[28][i].a <== states[i][21]; - and[28][i].b <== and[27][i].out; - and[29][i] = AND(); - and[29][i].a <== states[i][22]; - and[29][i].b <== and[27][i].out; + and[28][i].b <== and[26][i].out; lt[8][i] = LessEqThan(8); lt[8][i].in[0] <== 160; lt[8][i].in[1] <== in[i]; lt[9][i] = LessEqThan(8); lt[9][i].in[0] <== in[i]; lt[9][i].in[1] <== 191; + and[29][i] = AND(); + and[29][i].a <== lt[8][i].out; + and[29][i].b <== lt[9][i].out; and[30][i] = AND(); - and[30][i].a <== lt[8][i].out; - and[30][i].b <== lt[9][i].out; + and[30][i].a <== states[i][23]; + and[30][i].b <== and[29][i].out; and[31][i] = AND(); and[31][i].a <== states[i][24]; - and[31][i].b <== and[30][i].out; - and[32][i] = AND(); - and[32][i].a <== states[i][25]; - and[32][i].b <== and[25][i].out; + and[31][i].b <== and[24][i].out; lt[10][i] = LessEqThan(8); lt[10][i].in[0] <== 128; lt[10][i].in[1] <== in[i]; lt[11][i] = LessEqThan(8); lt[11][i].in[0] <== in[i]; lt[11][i].in[1] <== 159; + and[32][i] = AND(); + and[32][i].a <== lt[10][i].out; + and[32][i].b <== lt[11][i].out; and[33][i] = AND(); - and[33][i].a <== lt[10][i].out; - and[33][i].b <== lt[11][i].out; - and[34][i] = AND(); - and[34][i].a <== states[i][26]; - and[34][i].b <== and[33][i].out; + and[33][i].a <== states[i][25]; + and[33][i].b <== and[32][i].out; multi_or[2][i] = MultiOR(5); - multi_or[2][i].in[0] <== and[28][i].out; - multi_or[2][i].in[1] <== and[29][i].out; - multi_or[2][i].in[2] <== and[31][i].out; - multi_or[2][i].in[3] <== and[32][i].out; - multi_or[2][i].in[4] <== and[34][i].out; - states[i+1][23] <== multi_or[2][i].out; - eq[28][i] = IsEqual(); - eq[28][i].in[0] <== in[i]; - eq[28][i].in[1] <== 224; + multi_or[2][i].in[0] <== and[27][i].out; + multi_or[2][i].in[1] <== and[28][i].out; + multi_or[2][i].in[2] <== and[30][i].out; + multi_or[2][i].in[3] <== and[31][i].out; + multi_or[2][i].in[4] <== and[33][i].out; + states[i+1][22] <== multi_or[2][i].out; + eq[27][i] = IsEqual(); + eq[27][i].in[0] <== in[i]; + eq[27][i].in[1] <== 224; + and[34][i] = AND(); + and[34][i].a <== states[i][20]; + and[34][i].b <== eq[27][i].out; and[35][i] = AND(); and[35][i].a <== states[i][21]; - and[35][i].b <== eq[28][i].out; - and[36][i] = AND(); - and[36][i].a <== states[i][22]; - and[36][i].b <== eq[28][i].out; + and[35][i].b <== eq[27][i].out; multi_or[3][i] = MultiOR(2); - multi_or[3][i].in[0] <== and[35][i].out; - multi_or[3][i].in[1] <== and[36][i].out; - states[i+1][24] <== multi_or[3][i].out; + multi_or[3][i].in[0] <== and[34][i].out; + multi_or[3][i].in[1] <== and[35][i].out; + states[i+1][23] <== multi_or[3][i].out; + eq[28][i] = IsEqual(); + eq[28][i].in[0] <== in[i]; + eq[28][i].in[1] <== 225; eq[29][i] = IsEqual(); eq[29][i].in[0] <== in[i]; - eq[29][i].in[1] <== 225; + eq[29][i].in[1] <== 226; eq[30][i] = IsEqual(); eq[30][i].in[0] <== in[i]; - eq[30][i].in[1] <== 226; + eq[30][i].in[1] <== 227; eq[31][i] = IsEqual(); eq[31][i].in[0] <== in[i]; - eq[31][i].in[1] <== 227; + eq[31][i].in[1] <== 228; eq[32][i] = IsEqual(); eq[32][i].in[0] <== in[i]; - eq[32][i].in[1] <== 228; + eq[32][i].in[1] <== 229; eq[33][i] = IsEqual(); eq[33][i].in[0] <== in[i]; - eq[33][i].in[1] <== 229; + eq[33][i].in[1] <== 230; eq[34][i] = IsEqual(); eq[34][i].in[0] <== in[i]; - eq[34][i].in[1] <== 230; + eq[34][i].in[1] <== 231; eq[35][i] = IsEqual(); eq[35][i].in[0] <== in[i]; - eq[35][i].in[1] <== 231; + eq[35][i].in[1] <== 232; eq[36][i] = IsEqual(); eq[36][i].in[0] <== in[i]; - eq[36][i].in[1] <== 232; + eq[36][i].in[1] <== 233; eq[37][i] = IsEqual(); eq[37][i].in[0] <== in[i]; - eq[37][i].in[1] <== 233; + eq[37][i].in[1] <== 234; eq[38][i] = IsEqual(); eq[38][i].in[0] <== in[i]; - eq[38][i].in[1] <== 234; + eq[38][i].in[1] <== 235; eq[39][i] = IsEqual(); eq[39][i].in[0] <== in[i]; - eq[39][i].in[1] <== 235; + eq[39][i].in[1] <== 236; eq[40][i] = IsEqual(); eq[40][i].in[0] <== in[i]; - eq[40][i].in[1] <== 236; + eq[40][i].in[1] <== 238; eq[41][i] = IsEqual(); eq[41][i].in[0] <== in[i]; - eq[41][i].in[1] <== 238; - eq[42][i] = IsEqual(); - eq[42][i].in[0] <== in[i]; - eq[42][i].in[1] <== 239; + eq[41][i].in[1] <== 239; + and[36][i] = AND(); + and[36][i].a <== states[i][20]; + multi_or[4][i] = MultiOR(14); + multi_or[4][i].in[0] <== eq[28][i].out; + multi_or[4][i].in[1] <== eq[29][i].out; + multi_or[4][i].in[2] <== eq[30][i].out; + multi_or[4][i].in[3] <== eq[31][i].out; + multi_or[4][i].in[4] <== eq[32][i].out; + multi_or[4][i].in[5] <== eq[33][i].out; + multi_or[4][i].in[6] <== eq[34][i].out; + multi_or[4][i].in[7] <== eq[35][i].out; + multi_or[4][i].in[8] <== eq[36][i].out; + multi_or[4][i].in[9] <== eq[37][i].out; + multi_or[4][i].in[10] <== eq[38][i].out; + multi_or[4][i].in[11] <== eq[39][i].out; + multi_or[4][i].in[12] <== eq[40][i].out; + multi_or[4][i].in[13] <== eq[41][i].out; + and[36][i].b <== multi_or[4][i].out; and[37][i] = AND(); and[37][i].a <== states[i][21]; - multi_or[4][i] = MultiOR(14); - multi_or[4][i].in[0] <== eq[29][i].out; - multi_or[4][i].in[1] <== eq[30][i].out; - multi_or[4][i].in[2] <== eq[31][i].out; - multi_or[4][i].in[3] <== eq[32][i].out; - multi_or[4][i].in[4] <== eq[33][i].out; - multi_or[4][i].in[5] <== eq[34][i].out; - multi_or[4][i].in[6] <== eq[35][i].out; - multi_or[4][i].in[7] <== eq[36][i].out; - multi_or[4][i].in[8] <== eq[37][i].out; - multi_or[4][i].in[9] <== eq[38][i].out; - multi_or[4][i].in[10] <== eq[39][i].out; - multi_or[4][i].in[11] <== eq[40][i].out; - multi_or[4][i].in[12] <== eq[41][i].out; - multi_or[4][i].in[13] <== eq[42][i].out; and[37][i].b <== multi_or[4][i].out; - and[38][i] = AND(); - and[38][i].a <== states[i][22]; - and[38][i].b <== multi_or[4][i].out; lt[12][i] = LessEqThan(8); lt[12][i].in[0] <== 144; lt[12][i].in[1] <== in[i]; lt[13][i] = LessEqThan(8); lt[13][i].in[0] <== in[i]; lt[13][i].in[1] <== 191; + and[38][i] = AND(); + and[38][i].a <== lt[12][i].out; + and[38][i].b <== lt[13][i].out; and[39][i] = AND(); - and[39][i].a <== lt[12][i].out; - and[39][i].b <== lt[13][i].out; + and[39][i].a <== states[i][26]; + and[39][i].b <== and[38][i].out; and[40][i] = AND(); and[40][i].a <== states[i][27]; - and[40][i].b <== and[39][i].out; - and[41][i] = AND(); - and[41][i].a <== states[i][28]; - and[41][i].b <== and[25][i].out; + and[40][i].b <== and[24][i].out; + eq[42][i] = IsEqual(); + eq[42][i].in[0] <== in[i]; + eq[42][i].in[1] <== 128; eq[43][i] = IsEqual(); eq[43][i].in[0] <== in[i]; - eq[43][i].in[1] <== 128; + eq[43][i].in[1] <== 129; eq[44][i] = IsEqual(); eq[44][i].in[0] <== in[i]; - eq[44][i].in[1] <== 129; + eq[44][i].in[1] <== 130; eq[45][i] = IsEqual(); eq[45][i].in[0] <== in[i]; - eq[45][i].in[1] <== 130; + eq[45][i].in[1] <== 131; eq[46][i] = IsEqual(); eq[46][i].in[0] <== in[i]; - eq[46][i].in[1] <== 131; + eq[46][i].in[1] <== 132; eq[47][i] = IsEqual(); eq[47][i].in[0] <== in[i]; - eq[47][i].in[1] <== 132; + eq[47][i].in[1] <== 133; eq[48][i] = IsEqual(); eq[48][i].in[0] <== in[i]; - eq[48][i].in[1] <== 133; + eq[48][i].in[1] <== 134; eq[49][i] = IsEqual(); eq[49][i].in[0] <== in[i]; - eq[49][i].in[1] <== 134; + eq[49][i].in[1] <== 135; eq[50][i] = IsEqual(); eq[50][i].in[0] <== in[i]; - eq[50][i].in[1] <== 135; + eq[50][i].in[1] <== 136; eq[51][i] = IsEqual(); eq[51][i].in[0] <== in[i]; - eq[51][i].in[1] <== 136; + eq[51][i].in[1] <== 137; eq[52][i] = IsEqual(); eq[52][i].in[0] <== in[i]; - eq[52][i].in[1] <== 137; + eq[52][i].in[1] <== 138; eq[53][i] = IsEqual(); eq[53][i].in[0] <== in[i]; - eq[53][i].in[1] <== 138; + eq[53][i].in[1] <== 139; eq[54][i] = IsEqual(); eq[54][i].in[0] <== in[i]; - eq[54][i].in[1] <== 139; + eq[54][i].in[1] <== 140; eq[55][i] = IsEqual(); eq[55][i].in[0] <== in[i]; - eq[55][i].in[1] <== 140; + eq[55][i].in[1] <== 141; eq[56][i] = IsEqual(); eq[56][i].in[0] <== in[i]; - eq[56][i].in[1] <== 141; + eq[56][i].in[1] <== 142; eq[57][i] = IsEqual(); eq[57][i].in[0] <== in[i]; - eq[57][i].in[1] <== 142; + eq[57][i].in[1] <== 143; + and[41][i] = AND(); + and[41][i].a <== states[i][28]; + multi_or[5][i] = MultiOR(16); + multi_or[5][i].in[0] <== eq[42][i].out; + multi_or[5][i].in[1] <== eq[43][i].out; + multi_or[5][i].in[2] <== eq[44][i].out; + multi_or[5][i].in[3] <== eq[45][i].out; + multi_or[5][i].in[4] <== eq[46][i].out; + multi_or[5][i].in[5] <== eq[47][i].out; + multi_or[5][i].in[6] <== eq[48][i].out; + multi_or[5][i].in[7] <== eq[49][i].out; + multi_or[5][i].in[8] <== eq[50][i].out; + multi_or[5][i].in[9] <== eq[51][i].out; + multi_or[5][i].in[10] <== eq[52][i].out; + multi_or[5][i].in[11] <== eq[53][i].out; + multi_or[5][i].in[12] <== eq[54][i].out; + multi_or[5][i].in[13] <== eq[55][i].out; + multi_or[5][i].in[14] <== eq[56][i].out; + multi_or[5][i].in[15] <== eq[57][i].out; + and[41][i].b <== multi_or[5][i].out; + multi_or[6][i] = MultiOR(5); + multi_or[6][i].in[0] <== and[36][i].out; + multi_or[6][i].in[1] <== and[37][i].out; + multi_or[6][i].in[2] <== and[39][i].out; + multi_or[6][i].in[3] <== and[40][i].out; + multi_or[6][i].in[4] <== and[41][i].out; + states[i+1][24] <== multi_or[6][i].out; eq[58][i] = IsEqual(); eq[58][i].in[0] <== in[i]; - eq[58][i].in[1] <== 143; + eq[58][i].in[1] <== 237; and[42][i] = AND(); - and[42][i].a <== states[i][29]; - multi_or[5][i] = MultiOR(16); - multi_or[5][i].in[0] <== eq[43][i].out; - multi_or[5][i].in[1] <== eq[44][i].out; - multi_or[5][i].in[2] <== eq[45][i].out; - multi_or[5][i].in[3] <== eq[46][i].out; - multi_or[5][i].in[4] <== eq[47][i].out; - multi_or[5][i].in[5] <== eq[48][i].out; - multi_or[5][i].in[6] <== eq[49][i].out; - multi_or[5][i].in[7] <== eq[50][i].out; - multi_or[5][i].in[8] <== eq[51][i].out; - multi_or[5][i].in[9] <== eq[52][i].out; - multi_or[5][i].in[10] <== eq[53][i].out; - multi_or[5][i].in[11] <== eq[54][i].out; - multi_or[5][i].in[12] <== eq[55][i].out; - multi_or[5][i].in[13] <== eq[56][i].out; - multi_or[5][i].in[14] <== eq[57][i].out; - multi_or[5][i].in[15] <== eq[58][i].out; - and[42][i].b <== multi_or[5][i].out; - multi_or[6][i] = MultiOR(5); - multi_or[6][i].in[0] <== and[37][i].out; - multi_or[6][i].in[1] <== and[38][i].out; - multi_or[6][i].in[2] <== and[40][i].out; - multi_or[6][i].in[3] <== and[41][i].out; - multi_or[6][i].in[4] <== and[42][i].out; - states[i+1][25] <== multi_or[6][i].out; - eq[59][i] = IsEqual(); - eq[59][i].in[0] <== in[i]; - eq[59][i].in[1] <== 237; + and[42][i].a <== states[i][20]; + and[42][i].b <== eq[58][i].out; and[43][i] = AND(); and[43][i].a <== states[i][21]; - and[43][i].b <== eq[59][i].out; + and[43][i].b <== eq[58][i].out; + multi_or[7][i] = MultiOR(2); + multi_or[7][i].in[0] <== and[42][i].out; + multi_or[7][i].in[1] <== and[43][i].out; + states[i+1][25] <== multi_or[7][i].out; + eq[59][i] = IsEqual(); + eq[59][i].in[0] <== in[i]; + eq[59][i].in[1] <== 240; and[44][i] = AND(); - and[44][i].a <== states[i][22]; + and[44][i].a <== states[i][20]; and[44][i].b <== eq[59][i].out; - multi_or[7][i] = MultiOR(2); - multi_or[7][i].in[0] <== and[43][i].out; - multi_or[7][i].in[1] <== and[44][i].out; - states[i+1][26] <== multi_or[7][i].out; - eq[60][i] = IsEqual(); - eq[60][i].in[0] <== in[i]; - eq[60][i].in[1] <== 240; and[45][i] = AND(); and[45][i].a <== states[i][21]; - and[45][i].b <== eq[60][i].out; - and[46][i] = AND(); - and[46][i].a <== states[i][22]; - and[46][i].b <== eq[60][i].out; + and[45][i].b <== eq[59][i].out; multi_or[8][i] = MultiOR(2); - multi_or[8][i].in[0] <== and[45][i].out; - multi_or[8][i].in[1] <== and[46][i].out; - states[i+1][27] <== multi_or[8][i].out; + multi_or[8][i].in[0] <== and[44][i].out; + multi_or[8][i].in[1] <== and[45][i].out; + states[i+1][26] <== multi_or[8][i].out; + eq[60][i] = IsEqual(); + eq[60][i].in[0] <== in[i]; + eq[60][i].in[1] <== 241; eq[61][i] = IsEqual(); eq[61][i].in[0] <== in[i]; - eq[61][i].in[1] <== 241; + eq[61][i].in[1] <== 242; eq[62][i] = IsEqual(); eq[62][i].in[0] <== in[i]; - eq[62][i].in[1] <== 242; - eq[63][i] = IsEqual(); - eq[63][i].in[0] <== in[i]; - eq[63][i].in[1] <== 243; + eq[62][i].in[1] <== 243; + and[46][i] = AND(); + and[46][i].a <== states[i][20]; + multi_or[9][i] = MultiOR(3); + multi_or[9][i].in[0] <== eq[60][i].out; + multi_or[9][i].in[1] <== eq[61][i].out; + multi_or[9][i].in[2] <== eq[62][i].out; + and[46][i].b <== multi_or[9][i].out; and[47][i] = AND(); and[47][i].a <== states[i][21]; - multi_or[9][i] = MultiOR(3); - multi_or[9][i].in[0] <== eq[61][i].out; - multi_or[9][i].in[1] <== eq[62][i].out; - multi_or[9][i].in[2] <== eq[63][i].out; and[47][i].b <== multi_or[9][i].out; - and[48][i] = AND(); - and[48][i].a <== states[i][22]; - and[48][i].b <== multi_or[9][i].out; multi_or[10][i] = MultiOR(2); - multi_or[10][i].in[0] <== and[47][i].out; - multi_or[10][i].in[1] <== and[48][i].out; - states[i+1][28] <== multi_or[10][i].out; - eq[64][i] = IsEqual(); - eq[64][i].in[0] <== in[i]; - eq[64][i].in[1] <== 244; + multi_or[10][i].in[0] <== and[46][i].out; + multi_or[10][i].in[1] <== and[47][i].out; + states[i+1][27] <== multi_or[10][i].out; + eq[63][i] = IsEqual(); + eq[63][i].in[0] <== in[i]; + eq[63][i].in[1] <== 244; + and[48][i] = AND(); + and[48][i].a <== states[i][20]; + and[48][i].b <== eq[63][i].out; and[49][i] = AND(); and[49][i].a <== states[i][21]; - and[49][i].b <== eq[64][i].out; - and[50][i] = AND(); - and[50][i].a <== states[i][22]; - and[50][i].b <== eq[64][i].out; + and[49][i].b <== eq[63][i].out; multi_or[11][i] = MultiOR(2); - multi_or[11][i].in[0] <== and[49][i].out; - multi_or[11][i].in[1] <== and[50][i].out; - states[i+1][29] <== multi_or[11][i].out; + multi_or[11][i].in[0] <== and[48][i].out; + multi_or[11][i].in[1] <== and[49][i].out; + states[i+1][28] <== multi_or[11][i].out; + and[50][i] = AND(); + and[50][i].a <== states[i][21]; + and[50][i].b <== eq[0][i].out; + states[i+1][29] <== and[50][i].out; + eq[64][i] = IsEqual(); + eq[64][i].in[0] <== in[i]; + eq[64][i].in[1] <== 47; and[51][i] = AND(); - and[51][i].a <== states[i][22]; - and[51][i].b <== eq[0][i].out; + and[51][i].a <== states[i][29]; + and[51][i].b <== eq[64][i].out; states[i+1][30] <== and[51][i].out; - eq[65][i] = IsEqual(); - eq[65][i].in[0] <== in[i]; - eq[65][i].in[1] <== 47; and[52][i] = AND(); and[52][i].a <== states[i][30]; - and[52][i].b <== eq[65][i].out; + and[52][i].b <== eq[1][i].out; states[i+1][31] <== and[52][i].out; and[53][i] = AND(); and[53][i].a <== states[i][31]; - and[53][i].b <== eq[1][i].out; + and[53][i].b <== eq[2][i].out; states[i+1][32] <== and[53][i].out; and[54][i] = AND(); and[54][i].a <== states[i][32]; - and[54][i].b <== eq[2][i].out; + and[54][i].b <== eq[3][i].out; states[i+1][33] <== and[54][i].out; and[55][i] = AND(); and[55][i].a <== states[i][33]; - and[55][i].b <== eq[3][i].out; + and[55][i].b <== eq[15][i].out; states[i+1][34] <== and[55][i].out; - and[56][i] = AND(); - and[56][i].a <== states[i][34]; - and[56][i].b <== eq[16][i].out; - states[i+1][35] <== and[56][i].out; - from_zero_enabled[i] <== MultiNOR(35)([states_tmp[i+1][1], states[i+1][2], states[i+1][3], states[i+1][4], states[i+1][5], states[i+1][6], states[i+1][7], states[i+1][8], states[i+1][9], states[i+1][10], states[i+1][11], states[i+1][12], states[i+1][13], states[i+1][14], states[i+1][15], states[i+1][16], states[i+1][17], states[i+1][18], states[i+1][19], states[i+1][20], states[i+1][21], states[i+1][22], states[i+1][23], states[i+1][24], states[i+1][25], states[i+1][26], states[i+1][27], states[i+1][28], states[i+1][29], states[i+1][30], states[i+1][31], states[i+1][32], states[i+1][33], states[i+1][34], states[i+1][35]]); + from_zero_enabled[i] <== MultiNOR(34)([states_tmp[i+1][1], states[i+1][2], states[i+1][3], states[i+1][4], states[i+1][5], states[i+1][6], states[i+1][7], states[i+1][8], states[i+1][9], states[i+1][10], states[i+1][11], states[i+1][12], states[i+1][13], states[i+1][14], states[i+1][15], states[i+1][16], states[i+1][17], states[i+1][18], states[i+1][19], states[i+1][20], states[i+1][21], states[i+1][22], states[i+1][23], states[i+1][24], states[i+1][25], states[i+1][26], states[i+1][27], states[i+1][28], states[i+1][29], states[i+1][30], states[i+1][31], states[i+1][32], states[i+1][33], states[i+1][34]]); states[i+1][1] <== MultiOR(2)([states_tmp[i+1][1], from_zero_enabled[i] * and[0][i].out]); state_changed[i].in[0] <== states[i+1][1]; state_changed[i].in[1] <== states[i+1][2]; @@ -596,52 +589,51 @@ template CommandRegex(msg_bytes) { state_changed[i].in[31] <== states[i+1][32]; state_changed[i].in[32] <== states[i+1][33]; state_changed[i].in[33] <== states[i+1][34]; - state_changed[i].in[34] <== states[i+1][35]; } component is_accepted = MultiOR(num_bytes+1); for (var i = 0; i <= num_bytes; i++) { - is_accepted.in[i] <== states[i][35]; + is_accepted.in[i] <== states[i][34]; } out <== is_accepted.out; signal is_consecutive[msg_bytes+1][3]; is_consecutive[msg_bytes][2] <== 0; for (var i = 0; i < msg_bytes; i++) { - is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][35] * (1 - is_consecutive[msg_bytes-i][2]) + is_consecutive[msg_bytes-i][2]; + is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][34] * (1 - is_consecutive[msg_bytes-i][2]) + is_consecutive[msg_bytes-i][2]; is_consecutive[msg_bytes-1-i][1] <== state_changed[msg_bytes-i].out * is_consecutive[msg_bytes-1-i][0]; - is_consecutive[msg_bytes-1-i][2] <== ORAnd()([(1 - from_zero_enabled[msg_bytes-i+1]), states[num_bytes-i][35], is_consecutive[msg_bytes-1-i][1]]); + is_consecutive[msg_bytes-1-i][2] <== ORAnd()([(1 - from_zero_enabled[msg_bytes-i+1]), states[num_bytes-i][34], is_consecutive[msg_bytes-1-i][1]]); } - // substrings calculated: [{(21, 22), (21, 23), (21, 24), (21, 25), (21, 26), (21, 27), (21, 28), (21, 29), (22, 22), (22, 23), (22, 24), (22, 25), (22, 26), (22, 27), (22, 28), (22, 29), (23, 22), (24, 23), (25, 23), (26, 23), (27, 25), (28, 25), (29, 25)}] + // substrings calculated: [{(20, 21), (20, 22), (20, 23), (20, 24), (20, 25), (20, 26), (20, 27), (20, 28), (21, 21), (21, 22), (21, 23), (21, 24), (21, 25), (21, 26), (21, 27), (21, 28), (22, 21), (23, 22), (24, 22), (25, 22), (26, 24), (27, 24), (28, 24)}] signal prev_states0[23][msg_bytes]; signal is_substr0[msg_bytes]; signal is_reveal0[msg_bytes]; signal output reveal0[msg_bytes]; for (var i = 0; i < msg_bytes; i++) { - // the 0-th substring transitions: [(21, 22), (21, 23), (21, 24), (21, 25), (21, 26), (21, 27), (21, 28), (21, 29), (22, 22), (22, 23), (22, 24), (22, 25), (22, 26), (22, 27), (22, 28), (22, 29), (23, 22), (24, 23), (25, 23), (26, 23), (27, 25), (28, 25), (29, 25)] - prev_states0[0][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[1][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[2][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[3][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[4][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[5][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[6][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[7][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[8][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; - prev_states0[9][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; - prev_states0[10][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; - prev_states0[11][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; - prev_states0[12][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; - prev_states0[13][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; - prev_states0[14][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; - prev_states0[15][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; - prev_states0[16][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][23]; - prev_states0[17][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][24]; - prev_states0[18][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][25]; - prev_states0[19][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][26]; - prev_states0[20][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][27]; - prev_states0[21][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][28]; - prev_states0[22][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][29]; - is_substr0[i] <== MultiOR(23)([prev_states0[0][i] * states[i+2][22], prev_states0[1][i] * states[i+2][23], prev_states0[2][i] * states[i+2][24], prev_states0[3][i] * states[i+2][25], prev_states0[4][i] * states[i+2][26], prev_states0[5][i] * states[i+2][27], prev_states0[6][i] * states[i+2][28], prev_states0[7][i] * states[i+2][29], prev_states0[8][i] * states[i+2][22], prev_states0[9][i] * states[i+2][23], prev_states0[10][i] * states[i+2][24], prev_states0[11][i] * states[i+2][25], prev_states0[12][i] * states[i+2][26], prev_states0[13][i] * states[i+2][27], prev_states0[14][i] * states[i+2][28], prev_states0[15][i] * states[i+2][29], prev_states0[16][i] * states[i+2][22], prev_states0[17][i] * states[i+2][23], prev_states0[18][i] * states[i+2][23], prev_states0[19][i] * states[i+2][23], prev_states0[20][i] * states[i+2][25], prev_states0[21][i] * states[i+2][25], prev_states0[22][i] * states[i+2][25]]); + // the 0-th substring transitions: [(20, 21), (20, 22), (20, 23), (20, 24), (20, 25), (20, 26), (20, 27), (20, 28), (21, 21), (21, 22), (21, 23), (21, 24), (21, 25), (21, 26), (21, 27), (21, 28), (22, 21), (23, 22), (24, 22), (25, 22), (26, 24), (27, 24), (28, 24)] + prev_states0[0][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; + prev_states0[1][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; + prev_states0[2][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; + prev_states0[3][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; + prev_states0[4][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; + prev_states0[5][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; + prev_states0[6][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; + prev_states0[7][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; + prev_states0[8][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[9][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[10][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[11][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[12][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[13][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[14][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[15][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; + prev_states0[16][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; + prev_states0[17][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][23]; + prev_states0[18][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][24]; + prev_states0[19][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][25]; + prev_states0[20][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][26]; + prev_states0[21][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][27]; + prev_states0[22][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][28]; + is_substr0[i] <== MultiOR(23)([prev_states0[0][i] * states[i+2][21], prev_states0[1][i] * states[i+2][22], prev_states0[2][i] * states[i+2][23], prev_states0[3][i] * states[i+2][24], prev_states0[4][i] * states[i+2][25], prev_states0[5][i] * states[i+2][26], prev_states0[6][i] * states[i+2][27], prev_states0[7][i] * states[i+2][28], prev_states0[8][i] * states[i+2][21], prev_states0[9][i] * states[i+2][22], prev_states0[10][i] * states[i+2][23], prev_states0[11][i] * states[i+2][24], prev_states0[12][i] * states[i+2][25], prev_states0[13][i] * states[i+2][26], prev_states0[14][i] * states[i+2][27], prev_states0[15][i] * states[i+2][28], prev_states0[16][i] * states[i+2][21], prev_states0[17][i] * states[i+2][22], prev_states0[18][i] * states[i+2][22], prev_states0[19][i] * states[i+2][22], prev_states0[20][i] * states[i+2][24], prev_states0[21][i] * states[i+2][24], prev_states0[22][i] * states[i+2][24]]); is_reveal0[i] <== MultiAND(3)([out, is_substr0[i], is_consecutive[i][2]]); reveal0[i] <== in[i+1] * is_reveal0[i]; } diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test1.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test1.eml index 4584b8aa..acc2a526 100644 --- a/packages/circuits/tests/emails/email_auth_with_body_parsing_test1.eml +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test1.eml @@ -1,86 +1,86 @@ Delivered-To: shryas.londhe@gmail.com -Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1026748pzb; - Sat, 31 Aug 2024 08:00:47 -0700 (PDT) -X-Received: by 2002:a17:902:ccce:b0:205:56e8:4a4b with SMTP id d9443c01a7336-20556e84f14mr9184725ad.2.1725116447179; - Sat, 31 Aug 2024 08:00:47 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725116447; cv=none; +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp2292880pzb; + Mon, 2 Sep 2024 20:26:13 -0700 (PDT) +X-Received: by 2002:a05:6808:150b:b0:3d9:dcf8:3450 with SMTP id 5614622812f47-3df1d6c9fd0mr10834263b6e.33.1725333973230; + Mon, 02 Sep 2024 20:26:13 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725333973; cv=none; d=google.com; s=arc-20160816; - b=Qr8YEl00ep0RtfjlYibeBzB6ypthNbTJRONySg+ewxTyyh7vfzT8zu6YSVyyd+ZZQ8 - ASj1pBCH626+hEBQLPRoWZppBuvW1ZRLOGlcfmFE8XtLpKBMUeOvRm9iZqZeeqqNuIOl - KNoJbnefyf6jUVJMjFjGe/vQoiAjNxYQsSz7LHbrEuRdvB9Tpvp0ZRbEfKdk3jmwR4kB - VnPSaQgNyJ5s5UD2J7eoPYBNk7cSBFCMk4/V/xg+Avfix9yugcJVW6N0dHD5qLTyD4yA - w13OE/8ky9j6p2bJSKzvLRjaOoExLzCEry1iSPj9DiaIXlCutgDq/fpIozqwKV2O20Pg - N2bg== + b=Or2c81F0BxQPujZAycIXjnI4Da1ttYJssstQ8U0SoqyoScfAebQ9Y/bsryIAjabd4G + L3aorv/kCT8M1g7iHiw/NpN5ZHsi8QsLOvFEpHwPcP7OSsw+jqk2Wc3xNPxp7HuQ144Y + BNexXMUdyy/a8HqxQEO1VRiFgmioumOmqq36ZLYEE2ca2737uWPK5xeeh7USLcCCBGNN + Lrs6iXTdorWf23DA5fc5CaGGHSRLNU7uWdc9dl3pOJmOKe2Px7e/YjL76swK7bcugUOh + M45oY5IpQTH+ffl3bGPj7ZAl6mRgmxR0IfqcHMs9T1hh+/PCLYlx2NT2L+XBnnvZrkeV + smHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=subject:to:from:mime-version:date:message-id:dkim-signature; - bh=LyAHd2Pk3aeTA8CpoFpw/E0CFFMvOIrbREsfo89LIPs=; + bh=f9Hc/nL83NGWPdJxrViC0AIkkQ4clr94hybomVgejcc=; fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; - b=DBTgZXMxh5Vl7+Fh7xZrxPRTVHtuDhuYNRuCSArQxJ4AAdgQ07PV4S/OjmbGZJs01N - UnFQ/mR023C81Vr03YCHmPCtGGB5DX3/liBLmHeReRDHxDAHnBTw1AIwJLS1zFZmH374 - BqwVEiQuxzKBKrfHc5PZ/1FHQzRNA7EwcwUhSvNP18m+tM7tkEVzKRuH1J16EJZH291L - grdKNyDa3VEibSX3ks6t1sAOwSdE9sHvYeiC5zdkLW4f2wjW39/RguiCJ+Z6VKNvFgSL - EDolORYyRFamBJJzm0ywHn4cQyWVf2gasfb+ytdcds2i0YVa4WX2A9YQgf0C1NOuN02a - hv9A==; + b=M+pAcWxMY0vGS6StP3u3EAIrXI1s5kJLsnVlg04cneoduJJbKJhzmqn54eTBFPAz3P + p+8JPc5oqEIIJNo9z7XXcUJgPN4JxjL1PRJK3HC9/RJiJzxConHmk2pgQR8yPjCBP4vO + 7aYChPCqFp4sg8Igu2944AXu+HrKZ0fjX7jLjKadZP0oDxEuYa9V6xGCksrlv3SEhjBq + 8qlvUBs8dmE6tbn0d++xLtMi9Nf0EguWrpSMlM6jeQypQqP5d3cCAWytkneXGYMVFnuw + 4wdzLx6ES9kGcMmPocPBxMvTSLleVrtfqc4/htq0hvrL3RTJH+/6t8KJa5Q/TyNv/Wfw + vHJQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=nTKZtFU2; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=O6zda08N; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id d9443c01a7336-205154d6b07sor19840805ad.10.2024.08.31.08.00.47 + by mx.google.com with SMTPS id 5614622812f47-3e009055345sor978536b6e.8.2024.09.02.20.26.13 for (Google Transport Security); - Sat, 31 Aug 2024 08:00:47 -0700 (PDT) + Mon, 02 Sep 2024 20:26:13 -0700 (PDT) Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=nTKZtFU2; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=O6zda08N; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725116446; x=1725721246; dara=google.com; + d=gmail.com; s=20230601; t=1725333972; x=1725938772; dara=google.com; h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=LyAHd2Pk3aeTA8CpoFpw/E0CFFMvOIrbREsfo89LIPs=; - b=nTKZtFU2l8aiosN6tzQ+a8RwpzryDTryuR0e38ocX+8EP6FJ8OPwD/w4FS5f1EjE7r - eTPr5PAMZrkKVNiGnJqKxTRaJHx9CD5tx69QgnCAvGrOdTASvL2jMHqewcj57Cal8ipU - CLn/cvnAu/qQ9KdmDocdsjn0Pg0EVTBzaJlrCWpaeRkLcGs1Rlgsh9zbqRd13WmytAa3 - s64n4vTN8easpcN5hod+XdxEOipmv8NnE9yYg1R3elVvclzHQOQS85QRb8M5rHSh+a/m - i9xuoWaX4gbq0x5iRSInPN64zCk/7zLl0eqdwMwfp2Kfg4iwbe9mk+151AGcXxzOykQr - Is+Q== + bh=f9Hc/nL83NGWPdJxrViC0AIkkQ4clr94hybomVgejcc=; + b=O6zda08NR9i+owavm18Nls4qTKfC/Sli2xMUxm/MwOTE08/NnAbVBfb/nW8cjfQvu/ + VUGwolr7JHfQPGfz2cIcmq1thTadajKDvMgdGyHLjBoS7I0IO92DfPnDZ0lnTpxRpJGk + iIEfUbM4Ety4FgWml530KoqxyDcALpjidUntVPDwWTyfpsT32UIFrVsT//a/XT819p1B + j5bTaUuECck34g1Nzrlw0igZbSqcezJxW4zUXdhw0vwRxel+b0MfVIM52kq5/cUO3+ms + 7q9iX6mi6d85vGukaNO1Asg7C4Wg/ZI/MSeJY8I9BaDv+Mnot6V6g/VWPZBuCH5uy7lV + tyRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725116446; x=1725721246; + d=1e100.net; s=20230601; t=1725333972; x=1725938772; h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=LyAHd2Pk3aeTA8CpoFpw/E0CFFMvOIrbREsfo89LIPs=; - b=PD2mNuDIo1OCJuCm7i2hCvDN38Y7XW6MB72ik68hkVg90E6SmzUePucXrEZ0FElxqP - b6kFkVEUMktZHbYs1xfl+ZYjx6wtk8/d47LDVIsRxUl8701SR46QgDa4kAEt5u77QMWo - hTddFBO0sFK4kEiS0vEj3tvqkWZMKDrAMdfnrYe0dW5ZH+S4oIWrPRzUn5VvkFHDdCPA - JXC2rDPJ6iarLdhQetfSV0O921bWmj0wAzOWBhK2D3d5GZ8LHFZqgV5LgiChMtppUqr1 - Gw3C6gffSBEJb/FcHb6DBwMFS4VMi4Q7KgDLNrU8IWY7q9204qzdb3ogmlvM/StPIfl7 - CTrw== -X-Gm-Message-State: AOJu0YwcFpDkgIrszzQOaKbaC6PoUtkgo7TPpCcScAu7gHIJFuW3bEeN - 9ucO0uilIKASUkh+U9KzJ18GEYbLjw1RalJk5XbK8aBhG4GvvAp8Vc3xKw== -X-Google-Smtp-Source: AGHT+IGhsUNaW6XNgFUu7aW5NNrZi1nWOTkUbqwLDTssDaAsR2kuUGh4J6eJnQkEaYqzS9yWdctoeA== -X-Received: by 2002:a17:902:f688:b0:1fb:4194:5b78 with SMTP id d9443c01a7336-2054477bfbamr27368035ad.47.1725116445966; - Sat, 31 Aug 2024 08:00:45 -0700 (PDT) + bh=f9Hc/nL83NGWPdJxrViC0AIkkQ4clr94hybomVgejcc=; + b=cZlwazE7t3fMZVLwHra6V3TYQSiNKSTOGtp2oyGU3JBiwbnvvVfCvaXxtfsea75P1o + 3CcbySf7Iz6wRe7oRK4uZ89QDD3jAaLwYyqy5s60rSzdL6l1Sv5SY2LIm8fsJD6opBgM + 2O//IisXbUpVfnZhXSzNjjhoZrXkdtfAU12XL9+kJ3uMFJmQhm9posQEIIJcl9xVrX/S + 9mt9hkx1M8izBRTp0JjUcKxlYzO9QVaTVa95WJelEqJxkE93TQLz3FKvNkxq/7LWfFu+ + kJN+HSUM25t+dROqyzNrq6LdFqoXPl3lkDkOEk0k0rgYgTt2OErnzzUiLYSNUcyzyzTb + m2nw== +X-Gm-Message-State: AOJu0YzE3TCQJvuA6zpdGWCtczTRnhPDrsVF/AJQsqsSCGd+QIN3YfpQ + x9XdxYhPWH22ysCPIBoC4tRHhTmMUYK/0CEuRS536Fj8le64B6xLuc3OIp+0 +X-Google-Smtp-Source: AGHT+IETvU24uvVDYJP0KXKqGWL/iQrzLB72SRXiSG8CdEVht/WSOe6oGBdVMCKC4+FICgx3qCeX5Q== +X-Received: by 2002:a05:6870:56a1:b0:25e:1f67:b3bb with SMTP id 586e51a60fabf-277d0329191mr9496139fac.10.1725333972467; + Mon, 02 Sep 2024 20:26:12 -0700 (PDT) Return-Path: -Received: from adityas-macbook-air-4.local ([61.2.109.23]) - by smtp.gmail.com with ESMTPSA id d9443c01a7336-205152d02b4sm42029585ad.87.2024.08.31.08.00.44 +Received: from adityas-macbook-air-4.local ([59.184.57.198]) + by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e56d885fsm7524515b3a.155.2024.09.02.20.26.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Sat, 31 Aug 2024 08:00:45 -0700 (PDT) -Message-ID: <66d3301d.170a0220.2fb85.006c@mx.google.com> -Date: Sat, 31 Aug 2024 08:00:45 -0700 (PDT) -Content-Type: multipart/alternative; boundary="===============8351371397052058247==" + Mon, 02 Sep 2024 20:26:11 -0700 (PDT) +Message-ID: <66d681d3.050a0220.391c1d.9adc@mx.google.com> +Date: Mon, 02 Sep 2024 20:26:11 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============2959808677043960680==" MIME-Version: 1.0 From: zkemail.relayer.test@gmail.com To: shryas.londhe@gmail.com Subject: Test Email 1 in Quoted-Printable Encoding ---===============8351371397052058247== +--===============2959808677043960680== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable @@ -91,9 +91,9 @@ Content-Type: text/html; charset=utf-8

Hello!

This is a test email with a basic HTML body.

-
Send 0.1 ETH to alice@gmail.com
=20 +
Send 0.1 ETH to alice@gmail.com
=20

Thank you!

=20 ---===============8351371397052058247==-- +--===============2959808677043960680==-- diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test2.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test2.eml index c7011a32..acbdc814 100644 --- a/packages/circuits/tests/emails/email_auth_with_body_parsing_test2.eml +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test2.eml @@ -1,86 +1,86 @@ Delivered-To: shryas.londhe@gmail.com -Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1026932pzb; - Sat, 31 Aug 2024 08:01:00 -0700 (PDT) -X-Received: by 2002:a17:902:ce82:b0:205:4fb0:e0a3 with SMTP id d9443c01a7336-2054fb0e2d9mr11498635ad.41.1725116459826; - Sat, 31 Aug 2024 08:00:59 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725116459; cv=none; +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp2292972pzb; + Mon, 2 Sep 2024 20:26:30 -0700 (PDT) +X-Received: by 2002:a05:6a21:33aa:b0:1ce:d418:8ee6 with SMTP id adf61e73a8af0-1ced4188f03mr11873583637.41.1725333989839; + Mon, 02 Sep 2024 20:26:29 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725333989; cv=none; d=google.com; s=arc-20160816; - b=PmrIhQKpMWIus67HAfo0q6V/K8SljpvyWOVGY6VTlaazsjySQFOYDK2+/MgRE9WKdi - WzP+Ghu50yHo+j8oGfJhsNkEPfsZO1eIwiRSN9YnSk0PVyv1YkB0/+Zvj7LKSY6RHM8r - IQLVKUD+VdWZdBIBwZ6i3fa62hI9aXJVPxsXqXeh66ks6qw/TCnNfBfSCm2wV9xdIbui - y0l3QCjbOhOpxTSqN05r68VmdlVm943qcmrPQhORNKdEWQ0YeLU7kbHOFnZbQN9yBBQB - dTltxwC38Y/XwQqcgtKK2AXcmfWjPQ3JMwXNP3oVTFEJC778duM+IRldXkBRYkM6cfNf - OVUA== + b=VkgqqX17BqArmHM9zE1Sv38Sy/WhZlJqc8+fTIlevFZmhTSupOGBBP/PJlU7e7GrKD + ANVk+jaZ8iSrDXRrKz9kl7b8PzwgBjLx6zZS7ukjQCFHhjRLgfHx85S9IpbHWmV3s85A + +fAf8mjJSGIQTfcvAr/CsD7C01/s62Z5cB6Ws42ahzrs3a+jG6g//LVEpt4OxI8MlpD3 + NpLh4JISg/+Qj3WtDc+vGH8geo+K3l84sncA+3ssSbl7obf+paM11oRmQ0HZ6Kxjgl42 + DoatwZc92XdNwyLYRrj1GBP5Wjj4B0Nsl2+gPaZfNeJRjSV5vIcrNQFWQAUVPpABJNOs + MvJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=subject:to:from:mime-version:date:message-id:dkim-signature; - bh=hYO9SIor6/ZMSH5Se6VbxdzKfW8mplLpyajlLIUnct4=; + bh=kMJCDTrnZkOSpmyPJBDtHkISRN8g4Yz0r8180BggkYs=; fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; - b=0mjYYGShvMO5Hd/O+d1vcd/LshCmIoHhUHKHoTdvz0NU+oGRdr6X8X5C5XMGDym814 - AUfkFC63M2N6ZxWZCPQ+UFYIsXFVoJRJiAO9qRfc0TLfgLt32F90d2btikBAFpMkmzaE - D3Z0uasHMFA88phJpwONXiUX97ZdQjOtKgCnhkHh5DDYDCVCuuwAq8tHSVYTzitbXk7v - TJvOMHztwqS4Wn+XsbUg3JLaIJE+9jsC0ijVEtnXCPXQFGvuFBisxAwv4ll70yO+EBvv - 7H5AwdE5805dRtu9p1hFJ/kkAcoQK/WwOHuEU5xyAXdQ9ZLNRVCavQRlg0UP1c2lM0dv - dLyQ==; + b=Pe1HohCMTk6Sk+AP6eKP9xNdL1jC7oOuSYn75vUkF4y7U1/aWCFn2qmQnqJGLH3Re3 + vffLCSoyC53egaN3PKUppB/OKplKet5va8JpWpTVktwxn+aWJJi2QZJlruM7pnLQuRNq + iLw9TgrCYsfKE4d9Z4MRH15AfJXgXk2iqjUFDsBlNTQ4GBJ3bP3BG78lGCe44Gg1Zu/c + yBTNFr4sxa/UmcaPxK3jPIdYcWQkNvvellzySbLYZO1jBqKBoLlsSHSSoAoHSJL9jEVu + MLCCZgi4FIq7WYk6kQGCUJOSrbhhrRNNxlUcxp3IjLaVJfBOmC4wePFf+SVPcyiC8xes + R+vw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=deHzDMLm; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=MVtCnZAi; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id d9443c01a7336-20514fd2b0asor32747505ad.0.2024.08.31.08.00.59 + by mx.google.com with SMTPS id d9443c01a7336-2057e0422a7sor20920025ad.10.2024.09.02.20.26.29 for (Google Transport Security); - Sat, 31 Aug 2024 08:00:59 -0700 (PDT) + Mon, 02 Sep 2024 20:26:29 -0700 (PDT) Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=deHzDMLm; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=MVtCnZAi; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725116459; x=1725721259; dara=google.com; + d=gmail.com; s=20230601; t=1725333989; x=1725938789; dara=google.com; h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=hYO9SIor6/ZMSH5Se6VbxdzKfW8mplLpyajlLIUnct4=; - b=deHzDMLmxnSfVSsNI5+hLLr9KIGO9uZYa2aanSXQ/Xpv8ffhxTY1BZzaGsOUpqyb26 - PnoXYuzNImt9PKjDtxQQdijWJ+waOsJ2m8g8yHi6WXkc7iTuLsvofMLv3eySQzKS3Az3 - R9adL7W/3BVGIXX15DFLWhGOavE4hekSdg2FvxXw4XN4z+5xhmMh13nHOMXNKmcE5sqH - lUBL+Y6SimqeRCPY01UkNbkNZbsgtcPOvTs2oQqlDchLo6POzDXP/JI6LAxgEZZyEOot - 3Q7NeXo5AIzD4DtyQxlC5YFxoq5/dPur4G4srMyJdewhn2SMlSqD60TgJMNNHrWo1D8p - w1MQ== + bh=kMJCDTrnZkOSpmyPJBDtHkISRN8g4Yz0r8180BggkYs=; + b=MVtCnZAiJUQcLe90vtckJLx7wZ9v1+/fIznIS8E+MhWrLiTNJnLH6mFO9B9+1MaxvA + Nf/DygEK/RkJdxGVUUKztJbb4dhibFlPosq30puiv8VAz/eQ3byOjs7ttgbg9cTKb0z1 + yOFB0KvGikzizhJ7194FtnB3Gkj6ou+95UhmLwwdhLMjc5l324/3EZkjMtAbQIsJDA+l + uMY1oAQu3STheckLgwfQNX9Nd/RP6dlXDCT+S2RCfhOIGCTtUXCNiWQCqI4W40LhkocT + WNv63OF/yAlVAeujej563hKSS7yez4hXgEUjlaEhuOUk6cIlQZQe8zh0R/24N4DrzhwJ + hzrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725116459; x=1725721259; + d=1e100.net; s=20230601; t=1725333989; x=1725938789; h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=hYO9SIor6/ZMSH5Se6VbxdzKfW8mplLpyajlLIUnct4=; - b=olcA7mL97nyNtorrOnzO0zwjiG3PDG+RxknXQ83lSn2HIThVld7R3vf46xzquA5+XJ - IEXzFTTSOYdziulB9qoxfS+2F+mnbCKuS2+glnuy+pw5PKcdzy7O7Ziesu11eT8lJaFs - ywqKZhMTnmyKwU62tfB0x8cAxcXy0SrcbRVC4ICBx0pWHEg3MsiorVMgojdWAuPbk+ie - yY8kgB8QGRT/Ci6Kts30cTIuU5VF0WXYpcB0DYQPm/wV+UOCUMrVDUhILGpYlufM9m/J - Y/NGWEbzBg1mr/qk805kT+hDPfUQpTbp0qjCWKHB3Pyo/XVoddiQpzX2gCOGJqoPw2Nt - MmmA== -X-Gm-Message-State: AOJu0YwaKDzY17sAdIfLzMuop/B7R65MlYsmLI2u5QTwHuiONn9Fm27B - RkPQeY0Pkt6r6JTtU2dxhw+wn6n/3YVx+GxbNP7rW2pMqXmoz09aIyhGHA== -X-Google-Smtp-Source: AGHT+IGRRWkrZll1vJ6c2VcJ0ooxaiTUdkto9iGoCEEoZUC/9fODLscPYZRkoTVwxV5v9IbYoSbeOg== -X-Received: by 2002:a17:903:22d0:b0:205:5285:9ae7 with SMTP id d9443c01a7336-20552859d03mr13308925ad.63.1725116458685; - Sat, 31 Aug 2024 08:00:58 -0700 (PDT) + bh=kMJCDTrnZkOSpmyPJBDtHkISRN8g4Yz0r8180BggkYs=; + b=vj7fWIRsDdLPRuVSHhuxSKSZ6OAP//6i1E8HCoJvaNgXBkQ1kWWb39B3HSyWqbnMyi + KEVfYVhXWB2gSDjZ0ACgVoXm5XwpCpLrX8owtV1w0szJMt61XnhyScLPnIAHyXjoGJJs + 7O0UjtA7xJ+NKcBCa5+VMoTvsS0aYAkn+MqN7krvr5LMJCLkLcVL70cX3CccUyEclU8Y + nU8zPqK58NJh6TX2m797dfklm6C7PkNqfFGaRbkiz7nDnNRWv2/FDqiqgGtKw9Hm7YGP + e8A1fPHCUaBVOr8wqfDCBtdzSdqw91Qv7SNeOUZDOaUYtMNNeAagjLXhGEyoJEd8bzGM + XLLA== +X-Gm-Message-State: AOJu0YzVx0Rb+UU6K7nLWD86jmPMZ/4D4SC788YtnLiBvnEn5FOs3lnK + 1CYLUW2x1KDPn3iCmxZYRhCSr0+9W4h0bAYlti8fLY9mGWDEj0tOiN1FoWf/ +X-Google-Smtp-Source: AGHT+IET6Mh/8Hf1vpOk9aRB4RCcB68oWyYgqDrlXcWvQPb0/3KXubl7we74mTvi+Wv+cIBhzIlcfQ== +X-Received: by 2002:a17:902:d4c4:b0:203:a150:e5f5 with SMTP id d9443c01a7336-2054584f0cemr125616665ad.0.1725333988901; + Mon, 02 Sep 2024 20:26:28 -0700 (PDT) Return-Path: -Received: from adityas-macbook-air-4.local ([61.2.109.23]) - by smtp.gmail.com with ESMTPSA id d9443c01a7336-205152b1546sm41986405ad.18.2024.08.31.08.00.57 +Received: from adityas-macbook-air-4.local ([59.184.57.198]) + by smtp.gmail.com with ESMTPSA id d9443c01a7336-205152d6a82sm72589255ad.73.2024.09.02.20.26.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Sat, 31 Aug 2024 08:00:58 -0700 (PDT) -Message-ID: <66d3302a.170a0220.37721f.0172@mx.google.com> -Date: Sat, 31 Aug 2024 08:00:58 -0700 (PDT) -Content-Type: multipart/alternative; boundary="===============3364028563347567699==" + Mon, 02 Sep 2024 20:26:28 -0700 (PDT) +Message-ID: <66d681e4.170a0220.3d8a18.8403@mx.google.com> +Date: Mon, 02 Sep 2024 20:26:28 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============0042709324325514954==" MIME-Version: 1.0 From: zkemail.relayer.test@gmail.com To: shryas.londhe@gmail.com Subject: Test Email 2 in Quoted-Printable Encoding ---===============3364028563347567699== +--===============0042709324325514954== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable @@ -91,9 +91,9 @@ Content-Type: text/html; charset=utf-8

Hello!

This is a test email with a basic HTML body.

-
Swap 1 ETH to DAI
=20 +
Swap 1 ETH to DAI
=20

Thank you!

=20 ---===============3364028563347567699==-- +--===============0042709324325514954==-- diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test3.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test3.eml index f4993ebd..73597d3e 100644 --- a/packages/circuits/tests/emails/email_auth_with_body_parsing_test3.eml +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test3.eml @@ -1,86 +1,86 @@ Delivered-To: shryas.londhe@gmail.com -Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1027166pzb; - Sat, 31 Aug 2024 08:01:15 -0700 (PDT) -X-Received: by 2002:a17:902:ce8c:b0:203:a14d:ed0 with SMTP id d9443c01a7336-2054bc9705emr19472065ad.11.1725116474890; - Sat, 31 Aug 2024 08:01:14 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725116474; cv=none; +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp2293050pzb; + Mon, 2 Sep 2024 20:26:43 -0700 (PDT) +X-Received: by 2002:a17:902:d2c2:b0:202:435b:211a with SMTP id d9443c01a7336-20545e4436bmr97493665ad.12.1725334002979; + Mon, 02 Sep 2024 20:26:42 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725334002; cv=none; d=google.com; s=arc-20160816; - b=isV3uAKpSEJfk4nROlocDiKzF/dQTfkYGY0UTuMGr2y/qe6whSqx4vJprMw41ZCCXf - mwylqtY2rdGYhVlNNexYBGrmcpJivbsFExi1FpSp7whZNJtIoCHq5RcFtG1wH3x/Xzee - ipN0A33kJByLYZi10LPoNt+u0DMlaSJg5nPTZBUwRVpl2/WZziYV8GN8d2GNd6uoHi58 - MLb9UoDYRQPXIue/IsZgMEhimu8DOEMirgjoRXmPXIt7NQ/Bt/bASITA+HVZMLDoUJ0g - xf9hI6kIFmKFI7kC69VjoQioWvvS/2DgIeNtrZI9LJpbIl8B6wCI/ugieWkp9Pnb3h4j - GNBA== + b=uEiGeXd1Z2Ju6FYVT8BfHRNXS/toJyw+XUs77ZJ8X+mxFccncK8/nGpZz+CPQ700vH + wjzVe1RiTP80fdf2PlxUkklZaqiJijFcTh3AVQRWHqil83JZXwm48YURmmghJuRPxnw9 + jE3Quc8c3NeqmVvkKkSvQs0oU0Esbk5mIzvVwenXuNIEkzrbf7d2pgi/ApR1p4D9kVZM + mf5mnKFUTvehd2sCESq5k+FjpOkhAk1oHD0IFWHqEjy2xc/3ZBdV0lrhrN20OHrXOrRW + HgxXrwa8Uj7Xtah9u5QEqgNju6mgtyK4CIZX0qUoONXzfwBeYKlN3C8Pq5cRYohyyOr8 + wV7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=subject:to:from:mime-version:date:message-id:dkim-signature; - bh=B4663a3Zik2f5/UC+Z2z5NTP9hsvHxZYsowtimZVV0o=; + bh=f8710STYOn4HlDHwwdcTMiys25mwsCzNla6ZCLV3yMg=; fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; - b=T+B3iD7KsX3Xa7BwtiMCe2O13CNSy1SXP6pHrDo3pBn57D//ajLTjopK1el87q8oFZ - GgraRjSsvYx0GAdLXd4simHDKdvRNkNGkixi31oo3zk22oNGzFjlZb4O0WnqVAZ70u45 - fDU6lEvqvUBGZ7e1UrBfbpUmZ6SpzObNTEszDSHhkHTO2Tm47yVyQ1sPfZFQ03roFQjk - S78HeV24j3L792G1uAgYUsUyYnvS3v945sach2jhPRA6XwJvMr36JoTRvDS69K2KfpkQ - MoBeEIEQy4II/edUXGbfsFORv8MPNg5HP4FSLK3NDVobIqOYA1+8aPbMKECoPS4/qufQ - YzOg==; + b=Yy9NLuG9CzblzXaTHPu2iZ4TJCgKRcm11vdgSTlSn/yzA5CJEoM8WlCrcGCNIO7vkz + OUkz+FE0vqymKmljTvcMJvMVyjGPPKZqvuiZJshsyGI1y/lFGnl/fbc3jwX+T+Y7MTTO + F6C2ljMd5T6JlANdNZihzy9jPr5otzVj1GJpHNr5m/eoY6PGBtWGlIil8NssHtG3fBUH + zdkVPhjoAiXlxBpZGaoqCSPgE+uEe6atcanA+35qhZuMcEkLpJBtTwVdko38JZKDOMpL + RJF1MW18BIhT+d1D99f6dwzwgGtMDeh4S2f6T0NPoLmuhRvfAHkTjOVP4sQdxeIbI1Zo + ys8w==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=GUbVbXvL; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=lMQLdMSV; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id d9443c01a7336-2051553c96bsor35818955ad.16.2024.08.31.08.01.14 + by mx.google.com with SMTPS id d9443c01a7336-2055fc5719dsor28201735ad.15.2024.09.02.20.26.42 for (Google Transport Security); - Sat, 31 Aug 2024 08:01:14 -0700 (PDT) + Mon, 02 Sep 2024 20:26:42 -0700 (PDT) Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=GUbVbXvL; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=lMQLdMSV; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725116474; x=1725721274; dara=google.com; + d=gmail.com; s=20230601; t=1725334002; x=1725938802; dara=google.com; h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=B4663a3Zik2f5/UC+Z2z5NTP9hsvHxZYsowtimZVV0o=; - b=GUbVbXvLVy7y3KPnsyT8GDKjPiEwNt8xJJw81V3rApSg0KpDDLq9pHS71+7/BspSyU - glif1NYvEh71vC4rn7lBZi9Fl+LxLI+ApS8Vp+1y3OF8sLcpYWx2olWzKVF/Ez98HPfg - Gdk3PZTx+pms87aQDB4De4rnTXXnBGYd39evd8oqAYUPX0MOpxWVDkICiaVvSaM4dpYD - kmJSGSCO0jfysgmxFi4w0h63dWPZ6yRldvF+HYk1aSzfE5ZXP48FhOctW38bqYxt0N65 - rfrI8qn+QCK5vW45RwSU/90JPg5vovFpy2Jh+CVN0u3j4tPonie44foEOSbcJ68K5Mdl - pPLg== + bh=f8710STYOn4HlDHwwdcTMiys25mwsCzNla6ZCLV3yMg=; + b=lMQLdMSVp/7wPg1s5m3PAfMIEHK2b0nlHYjH93u5VgO5NWFd7sfkszh6F6apHN6/kb + +Nra6aolsxToj63IhXfa/GwSD+m+/6iYAdBs65qK6jGz+sn+hlRZMxKhP5aWq56t0z9D + sAEqxBOfZxMIvFrUF35lZYc41wn8skCY09/zM5FBZql+N1Yz+pDaOLqEDYxH+NyfTsUd + DK8OYQBOrnn7jVhdIe+Y4fqKIZc10U8lX2Z1kn+xlUsDlJCvv+zetOkV7MvZWHlCztR6 + /LOQ6qudI5P6I5rpNlG2fSyawLbw6gXIYPG9+DYLd0zNi3ryQyTazlEoARqigG7eNjNf + zwuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725116474; x=1725721274; + d=1e100.net; s=20230601; t=1725334002; x=1725938802; h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=B4663a3Zik2f5/UC+Z2z5NTP9hsvHxZYsowtimZVV0o=; - b=SJpSPxyZx20noJ7caD+DwynBoQle/kzsk76rWzNfOrctHXxe2Fzs4RrBoFetVBnUXY - rEVhcqrIPasrxeLNM/1hi7LGn13Vw/UXQutx7zUeZCPcG3Xq29GNy4wvAS1csDuwSlLV - gkDl4E4s/wMW/owOlzscT8VkSssMoyWyvgXRsZcX8VEEGnuHmfibfXZrJobTIEU3x0Ah - 0lNgzg8UmLh/l+zBsTvvXii50TWIMLcIMCKzMuIKleaK/HpBQVJexWec21ytrbH7mths - wAKXllHLJ5QeR2Alz96qKs6/zBuZ/vIMlPSHzoMEq81KFnGNsGjFcA5s6nPJaFR3TyU9 - i7bg== -X-Gm-Message-State: AOJu0Yx7KhYNSQv/lPCCbvgbNFis0yJc4cHuJgZ/YhJWmfg5Zc5c2JdY - bc7w4kHyz0Qs73852fgkEOKkR3VRirowD0QPzrGA7Q5QBtsOVBu541ztvQ== -X-Google-Smtp-Source: AGHT+IG91cPbn/sh7aeKkqSSsCqhJRi7BPh+QU7qjKE/caoQJAoHTDszls0Q4m2Y0y9c0lYH+9VT7Q== -X-Received: by 2002:a17:902:e80c:b0:204:e4c9:ce91 with SMTP id d9443c01a7336-2054bc9701dmr13034825ad.7.1725116473983; - Sat, 31 Aug 2024 08:01:13 -0700 (PDT) + bh=f8710STYOn4HlDHwwdcTMiys25mwsCzNla6ZCLV3yMg=; + b=FJHUIC0Hqj2rtGf588tbo5RYek/zrNwbhkc27sgxDFt+kZb8rqZ3BJi6DujAWfZONP + tzdwy4tZ7gTaUI7IvikEUO09R3OTweswDdRN2L3yv4vr4AjxkRlb/+CtQESBfAmXMkDg + 6LZoKX60J1zf6qVaN4hQfMwz5O1mw4OEU142USp0K6vbIWDkz+w5mq2bJy+KD9Nvdi9E + 3UUKzIkQY/57frXaXOhTedgrG4g7K5sR1mOHs7fxh3q82oSuww35dV+SvptYhDdQ+4TV + vkIEo7Gw+4oUIz8CDuDvUhYb5ZoYG6Fmn3Xnh3WBGC4oLSjd+i9ygXEJYQEgyf++nC5G + b6Fg== +X-Gm-Message-State: AOJu0Yx6bH5Kl5CcKczaWlA6nWsA7f5NVDm5OTE5pztJ42NJsAAI4QSm + 6udxinC7SPOEtXh7U90cllrGZqxPGzLCL3WyWFbxceq2yV5d3VkzKP5s2oB9 +X-Google-Smtp-Source: AGHT+IEA0HPWgX2q3BOHjthN+1yqjDJ/hMtZK7S/BFHVkPNocQjqX+AjemH6nYu4TyFpk0a1kxhy1g== +X-Received: by 2002:a17:903:2a8f:b0:205:79c:56f5 with SMTP id d9443c01a7336-20546600327mr97857255ad.27.1725334002025; + Mon, 02 Sep 2024 20:26:42 -0700 (PDT) Return-Path: -Received: from adityas-macbook-air-4.local ([61.2.109.23]) - by smtp.gmail.com with ESMTPSA id d9443c01a7336-20515555783sm41862675ad.257.2024.08.31.08.01.12 +Received: from adityas-macbook-air-4.local ([59.184.57.198]) + by smtp.gmail.com with ESMTPSA id d9443c01a7336-2051553444fsm72325535ad.148.2024.09.02.20.26.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Sat, 31 Aug 2024 08:01:13 -0700 (PDT) -Message-ID: <66d33039.170a0220.4c767.00d4@mx.google.com> -Date: Sat, 31 Aug 2024 08:01:13 -0700 (PDT) -Content-Type: multipart/alternative; boundary="===============3943930778566079903==" + Mon, 02 Sep 2024 20:26:41 -0700 (PDT) +Message-ID: <66d681f1.170a0220.12d0ca.8356@mx.google.com> +Date: Mon, 02 Sep 2024 20:26:41 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============0987519910738789604==" MIME-Version: 1.0 From: zkemail.relayer.test@gmail.com To: shryas.londhe@gmail.com Subject: Test Email 3 in Quoted-Printable Encoding ---===============3943930778566079903== +--===============0987519910738789604== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable @@ -91,9 +91,9 @@ Content-Type: text/html; charset=utf-8

Hello!

This is a test email with a basic HTML body.

-
Send 1 ETH to bob@example.com
=20 +
Send 1 ETH to bob@example.com
=20

Thank you!

=20 ---===============3943930778566079903==-- +--===============0987519910738789604==-- diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test4.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test4.eml index cc162d4b..a8ce5724 100644 --- a/packages/circuits/tests/emails/email_auth_with_body_parsing_test4.eml +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test4.eml @@ -1,86 +1,86 @@ Delivered-To: shryas.londhe@gmail.com -Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1027523pzb; - Sat, 31 Aug 2024 08:01:37 -0700 (PDT) -X-Received: by 2002:a05:6a00:3e21:b0:714:241d:a323 with SMTP id d2e1a72fcca58-717457cf069mr979778b3a.17.1725116497469; - Sat, 31 Aug 2024 08:01:37 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725116497; cv=none; +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp2293211pzb; + Mon, 2 Sep 2024 20:27:11 -0700 (PDT) +X-Received: by 2002:a17:903:18f:b0:206:8915:1c74 with SMTP id d9443c01a7336-20689151e9bmr33323015ad.21.1725334030783; + Mon, 02 Sep 2024 20:27:10 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725334030; cv=none; d=google.com; s=arc-20160816; - b=FIcZi383UosnmduFlJ1h6WRuV1m17eX2DY6D1NbH+QuL47vKJgzY+X8Y9YcuPsIO/P - Rc+Nf2u1kArY/HweZoT2azC/2e1uO0zDgzbPbRhQ+z8oO6Y6C6PPr7ZS8VDUJlFSUe29 - r3lUNitif3q/nHb+6cNbpxCga490akj+5PNv8/6txPeXSOUDAeyXWlQEwsdk7uC9Ez+T - mUNgq9gce1mOwY2fYBGsr5le0wKYmpbgnd5IzQwewwKNScXMDh8zfEGyq63M1578dk5Y - R2uKHHcgwO770e1HRNUkEmaB2+01CRcGLw1ngtdWDmNOyCf5u1qziKromSIlltx0hjZK - 7AOA== + b=wdNsVOozRFI1hgKVloWZxS53oU61K7xFzzRplY66LZ913+rNgyp5hm7xagL01q7G3f + c5eQzmZJY27rz+/GIcOzCrREyMZ4i3mZO12Na/rDUO0ZOSPvengwE0LUq74Kf8BPHTD8 + W8kYIpcAs2Kj0mVjjOkpNYLTf6CQXVuVXfkO9lbI0tiHChRaMe0HcBDiukLuw1QnSPyw + JHKGL+oraOajrKgQn+9v2Gq1qRgTwtiWPguzzVH8vFiKdnN2EUtsEkYG28ltJ//+tZQZ + zWp8w1QCVgpkgo2oDIRQwSR+vDD/HcLeI6yYggbJFzxH0WfraueH6RKtMo/pJP/2wEWz + eAkw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=subject:to:from:mime-version:date:message-id:dkim-signature; - bh=cx+lPIDfMFbPgh6ma3gwV4O5UiDqmgfLdsVAFWGAjbw=; + bh=LfVYp25jYyoop0tyJg90MQNaEpNP30xYSQbkPrcxeys=; fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; - b=Uhyxl91YQ1DrdApUYvXIEUZ4SIIHUGnnMB58KsYvyaHlp17i6pu/D1ahwYAll9kB9e - q9dvB6bnA9cOzpFhd9bBsRAP649tqGcLN14Zc4Or+vyWGl4GmoPVNBzSMyxkVLLK3+DX - 8Vkr1cMDQtn6OHLUJc+SO29i1mOEmCi57WlRod0Rd/rW0IXQfKRULUMqab+rqJWePEmC - 0xdxDxDXdDUIoBVJEq/Yb9S7tbEFMrR4V6YPjbYvpaBJdiOHG9T/Agr95E3XMWiURui/ - vTQaO/CziqnUydZ5bdddHUcrSr1620YxIFTILJaTSknXkC74xdLwLM7MmRYar2GJJOwb - 4cKw==; + b=jR9YEYcEtB26BsWiy3lo8pWH+cJxY2Th0NhrtW45C/8kTjGM8MnVBH8sx/11pBVynv + Y1VTa6g1uh9Iw0ffRX5mq85uJLr/5YP4KJz50pj3KA00852NQbgQWlOK+fWdGfDmnjXx + b5bFrqrz5K5MGi4aWLvblNx3guKgmxCoTX2gVyZusdVqWKmSkS/iZFOwED8hmhiyAuU+ + 6IbtTS1T0YZfhJf8DSr7Ek+KPUn+obM6o8iFIXfEZ1DmflJ34SLqeEmIP82h2Fp7Fev7 + u28/a7n89aV0LBvxmuFaz6JB24P6anu1bH9yVtUHUTmJPFUMZ5veDSEd+Ujd5AolTJRL + a6zw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=m0vgjaLd; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=mXlcPFDH; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id d2e1a72fcca58-715e5583723sor3589656b3a.3.2024.08.31.08.01.37 + by mx.google.com with SMTPS id d9443c01a7336-20545567fe2sor26776665ad.0.2024.09.02.20.27.10 for (Google Transport Security); - Sat, 31 Aug 2024 08:01:37 -0700 (PDT) + Mon, 02 Sep 2024 20:27:10 -0700 (PDT) Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=m0vgjaLd; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=mXlcPFDH; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725116497; x=1725721297; dara=google.com; + d=gmail.com; s=20230601; t=1725334030; x=1725938830; dara=google.com; h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=cx+lPIDfMFbPgh6ma3gwV4O5UiDqmgfLdsVAFWGAjbw=; - b=m0vgjaLdGuVPmwWeBzfAO97WvFrQzzm/P17WCDVTkXlh8ck+/x4UoFSe049kYyRk3d - qGaPBcWyQoe1YukQMXC1lQytrMN4cdfSN3lJLOMpkcaGCMwHDGmn6g0cfJJuoUja0ruh - uZZu3UyRE6jwgvIqutTNRoEgiSNzGBP2L3qO2f0MccKkOhYr5+6qMREMx1o65qeOttrs - k+B2b7OMgMZxu+yM/WwDoNvKgl5RKcUBpDE4cRakk/dwB6JGCLJ10Sm8c+oNYEkQ8sm0 - VyheU0IX1MhoAbrnS45cbmQdv3XZwgx7zoXl6+bqLZ6eWnZrVtAlXFlTNyWJNYn1Ax9T - 9lMA== + bh=LfVYp25jYyoop0tyJg90MQNaEpNP30xYSQbkPrcxeys=; + b=mXlcPFDHbtf0M1iLCrfdz0EGEXq0vtmRgWXUdg25He3e7bVnd1sKewA94FRBQfgGMi + uKFSoVvwnqkExI42RH2MC+gAJc8Ak0SNc2Ap0xaakYf5H30uCSuojndaO/L36OSBrAGH + T9rUmPsfY5pId/FjVV4TfcJ9TJVs39qmu11K0qxnGDL4ZymsKSZH6muaiEf2IXyhx/Vf + rp4lCci40EAL3pEf9NzAg+rbqN76pgSzH59TQdi8KRpw105ZFRiYDPGz6Rgpi0haOqY3 + KiUdGDlvU2NLWfovy/UsVk7REj3ymTnE2yegxhjL+KV9oDA3YxF6amNg+hGhBoN3sV2U + jr3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725116497; x=1725721297; + d=1e100.net; s=20230601; t=1725334030; x=1725938830; h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=cx+lPIDfMFbPgh6ma3gwV4O5UiDqmgfLdsVAFWGAjbw=; - b=Ed0FLIR36RYdPMZwa+lNHBcWRS1ZiFa1FBvAN8bQTdcMG6eUQqMf+u3HPrPF6XmB3/ - tPk3uscZKp9QeXCRkbkKYFFaWc+IZWe0fEX7cm1rqc/eFh/kwmrB1REqO771CQpxR62i - CEz29YCdDz24sIekWiRDiGgDJH16mVmoidfWewm0xJ2j39mLggbMuumJYPv64mWm3ZG7 - JiQxNe7t1YF0530b3f5BWfIDgd+Sq4OcBBgWwqS86ocQnlzaKU4gk0yIFjHHy0CjqZVy - Ua3CjHlBYTLEsMltirjNEldhJPToPjqvg9M77EOMSceFrN230zTRLYJUTwwFg8Lq4Siz - odRA== -X-Gm-Message-State: AOJu0YxX69por4T412383ihtwEn5StiioDZh9IOQqAolfuAcwfouZYx/ - sBlGwMbXuQiT5g9GcJA6lSrmJtDT4O80eIWwhYnwom2U9KMsY+vSZMst/A== -X-Google-Smtp-Source: AGHT+IEgIoqLr/I88jnrRWmjTHHted5y53epFmRNzvfCMpV9pGmrOJmgKQhhDeHH3FU42AGGzBcUtA== -X-Received: by 2002:a05:6a00:929a:b0:710:7fd2:c91 with SMTP id d2e1a72fcca58-717458a8022mr811606b3a.26.1725116496362; - Sat, 31 Aug 2024 08:01:36 -0700 (PDT) + bh=LfVYp25jYyoop0tyJg90MQNaEpNP30xYSQbkPrcxeys=; + b=PFlVUrl1wZdTNs5Lp5/XDZYCwOk45oguULZRu0o+IvVUNv7JYzFleGkQ6d5XBDPaOl + B7/geCCSUoVQpFpyzUgX5QTziD7PhCrpdEn1O6M6gQeGxF9iH7BZQ64nbkN7yLiw26/v + 4e/zgCdIRggMtHqCsM+Koub7CUP35PFsSA9P5AioicP9HtyIXYEPdmWZWzY4GjwNRKWY + dFfWX+K70AAbD9p6nT3mxVB46zNS7LOroo4zdh1QHwBeEboJ7rCqJJrn/tcjXK7bNn4J + JclOC9rmZdAWYmQpdHHup1yD8Ib6qCnRd+FUIvMq08Gg/IY2R0B2Q+Ry8GtsBEFgApFU + qN0w== +X-Gm-Message-State: AOJu0YzVMISxzhpu7gC683CLUQ4tB51nEbRKj9ezQBl7fdyysl3tLDPV + ATxZ9i0XiWKUpW4lMcsKUic46EGcwxHGSgudFnvbNBGFGiRtgvG1Kd0iLo7a +X-Google-Smtp-Source: AGHT+IEO/B6vXlNM8Cx+vrJRxH+OX4MczcsA5584OXogSaGEd1OrhLesW7HWj3dnRrjhIeZtctGQmQ== +X-Received: by 2002:a17:903:94d:b0:205:3475:63be with SMTP id d9443c01a7336-20534756a0dmr168375605ad.25.1725334029915; + Mon, 02 Sep 2024 20:27:09 -0700 (PDT) Return-Path: -Received: from adityas-macbook-air-4.local ([61.2.109.23]) - by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e56a937csm4334940b3a.108.2024.08.31.08.01.35 +Received: from adityas-macbook-air-4.local ([59.184.57.198]) + by smtp.gmail.com with ESMTPSA id d9443c01a7336-20515545d75sm72218255ad.237.2024.09.02.20.27.08 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Sat, 31 Aug 2024 08:01:35 -0700 (PDT) -Message-ID: <66d3304f.a70a0220.10c1c2.0e45@mx.google.com> -Date: Sat, 31 Aug 2024 08:01:35 -0700 (PDT) -Content-Type: multipart/alternative; boundary="===============2415799932888154602==" + Mon, 02 Sep 2024 20:27:09 -0700 (PDT) +Message-ID: <66d6820d.170a0220.4ad58.8166@mx.google.com> +Date: Mon, 02 Sep 2024 20:27:09 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============8219893973391566718==" MIME-Version: 1.0 From: zkemail.relayer.test@gmail.com To: shryas.londhe@gmail.com Subject: Test Email 4 in Quoted-Printable Encoding ---===============2415799932888154602== +--===============8219893973391566718== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable @@ -91,10 +91,10 @@ Content-Type: text/html; charset=utf-8

Hello!

This is a test email with a basic HTML body.

-
Send 0.12 ETH to alice@gmail.com code 01eb9b20= -4cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76
=20 +
Send 0.12 ETH to alice@gmail.com code 01eb9b204= +cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76
=20

Thank you!

=20 ---===============2415799932888154602==-- +--===============8219893973391566718==-- diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test5.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test5.eml index 9d1eb086..6c690e76 100644 --- a/packages/circuits/tests/emails/email_auth_with_body_parsing_test5.eml +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test5.eml @@ -1,86 +1,86 @@ Delivered-To: shryas.londhe@gmail.com -Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1027867pzb; - Sat, 31 Aug 2024 08:02:01 -0700 (PDT) -X-Received: by 2002:a17:903:238e:b0:201:d659:4c29 with SMTP id d9443c01a7336-2050c237657mr98175825ad.21.1725116521203; - Sat, 31 Aug 2024 08:02:01 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725116521; cv=none; +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp2293347pzb; + Mon, 2 Sep 2024 20:27:37 -0700 (PDT) +X-Received: by 2002:a05:6a00:cd3:b0:70d:34aa:6d51 with SMTP id d2e1a72fcca58-717457407c2mr7170342b3a.6.1725334056856; + Mon, 02 Sep 2024 20:27:36 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725334056; cv=none; d=google.com; s=arc-20160816; - b=NCzofuwsCmnXm9oyYtPrvZhDOKnt4yj2vpjIpzowzLeTpAXDdK1deuH/Bysy6HOqPs - QLvW7HVe0kgYkXqmu1KDD7KzgbyKtxJRDp0G6lqTknA9iL4rBhMe4eDoCbZa0YAtCVxy - IczQ6nRdFv8ouHZXaHlQ/96/eHkjyM6nobVsEHbULOyxt6c8yxyRWnmvx68QNYzVcL6s - Cb/xUA/bDE96FhAxUiXOvxwkSRonDnnV6yr689D2wB1beJFIRWAlKBDtj3EmEWVYck34 - S1Yx3+1LthXJS+TekyGhtcIODcJ590FC7iNC/q0ShE93R/eU/k5Q46leHmJiN0cyaSJL - C5Og== + b=FF4IN2z9s+3xgu/A4NYxIwC8MEnOyT3+2fcyPO96NqZf5WNUje4/5SGy6+ihT0Iy0m + 9sn/WLazma2OV3egdpx0Wm07Mq3oEY9zYF9gTVGhee65YXsDOhc3jMX19Ff4NUuq8euI + x9rSU8CI3sKUjgg9OcnGTsuTwz1dwUn9EDxIFpFp2sk0vrCKU9ACfU4GOLkQPkCpEHOO + fr5fKNWH6gY72yqOiElwE2wzKo5ewWvO5OBLZw+ba295IFhJ9rBIbejvdXiuXdj8NIqa + qJjr/lWfcEnl3eSyhlIUaUuM0OmALKFjU/V+XkMfRm8EMfBqXwuS2QjDKCyZqQRnuK86 + IsIQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=subject:to:from:mime-version:date:message-id:dkim-signature; - bh=An/Et77KDu2to3R2EwS+Di8vntf5/afFG8cgRpOoYHs=; + bh=WgHRFiGakPoqy0EgpGEskuPH5Lowb5jxC1QjM/mOplQ=; fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; - b=C++6GRrT2GUolqrpGq7lPaWTJG3REO22S5TWpjz+H9HSNnOSAUfVpj6bFMhk1+eh9V - x3W2Tn2M2xZU2awcYTArSFGFvrzIP2j1onRkYPm2qn1nsJE8Gbn+/EA7ammcRk6ivKRo - nVWT+zGHhahT41zrMxy3JmkESD42MfVtoC5PKE0fDpW7TbwLSeBe543zL/3c2Pw9bKAq - Rygfj8kDfYxh9o0kQvUAx2N8oNWTWAGsi7AF5/lahE5ICOlLZ9anjhh5XVaHKp3oeR61 - XSuwbbpsB9Q2Uax6AbUhLtpgiWmBOucOx5kOIIL3pkww8+1835t9UMOkNFYSB5l1To0G - 56Yg==; + b=MkLaavfotmEo4N1+appKWr23gEdy8YLU6q7Dtm6wNzr6faMtkqdk32/1jnzZWdZ1/N + 0dTqvSu1XrG8BC02MUDRgIMiiJAWxIsg81m3ep0/+/61lz4eQcqTo5Jus6V1aV3N7Laa + pGbHq3OESQQtU9n9OBD53V2uaa8+sP1rMyp/TEvd3xZK5aXHVqvntyShhTu9BRS0COYr + 2FsBf2PkVAeAp/l/J+VtLk7+wIi18sx7UMFM6TyiF1Z8Vr0DUwrUm8Q8pi4a+0R7kKht + IK7fUJ7sNVp99XeP79DVHKJAFXcD5hwrouoZyGBzLLPegoCPECHrE43rWwMUdRuvGcfG + 0aug==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b="gQOZj+/C"; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=UxRTsGzj; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id d9443c01a7336-205155824casor39474895ad.13.2024.08.31.08.02.01 + by mx.google.com with SMTPS id d2e1a72fcca58-715e57a3b0dsor4931608b3a.12.2024.09.02.20.27.36 for (Google Transport Security); - Sat, 31 Aug 2024 08:02:01 -0700 (PDT) + Mon, 02 Sep 2024 20:27:36 -0700 (PDT) Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b="gQOZj+/C"; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=UxRTsGzj; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725116520; x=1725721320; dara=google.com; + d=gmail.com; s=20230601; t=1725334056; x=1725938856; dara=google.com; h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=An/Et77KDu2to3R2EwS+Di8vntf5/afFG8cgRpOoYHs=; - b=gQOZj+/CCEIREVb1EfB6Tka5ou0yJGjgOU+FKC2PYhFidM60iH7E7oTs8vhAmhYsLN - qkeDmk1agjc7N7ZNZX6Yv5/oxtv2B5Ka7kQEQDSfYAax7D/Cr87fLQ0vF0NGZmSghVyJ - s5Y0oPKV5hW+O9fJ2k3RPW/1aAKvBCJYl+JNTvjerGYh7HAFC+/7XzOLyG/cp8M5wOmB - HSTMaCARx1WiAfoKZtj+Q0BUOX9tznejh9aqixM8OzPs80KaWXZWtLXks7ezsYh83q9T - dHvwgShKeMf5yb7i0b2wwboHyVUiiEXDsEnBrEYFON1ZEf/JIuA5YQj8C2kUkOMw465X - utEw== + bh=WgHRFiGakPoqy0EgpGEskuPH5Lowb5jxC1QjM/mOplQ=; + b=UxRTsGzjDtHkStktw2ZtGu7c10lEGvz7gmyPWVFBtHjg7TTK4+oL11m/8tSHNgmW22 + Ks+aGolMq420DYfhfFDPXoj0Jp6K0/20ffT93MrGTLA2b1a1wdAu0otvphy9gQazHetl + 25Uqk7RSaOaEqqBFBCftXC/cjVOcPz3GdjKhkdcCiXB5VMsBqNIwY+cJkJuiqz7+0tRY + 44jLWDAJnx7maeknXYVBBhhYo7D8MNa6E8d+HcDfGNheCKydVAB4eBpLd5RQSOygZ/RJ + MfdTiBwaqDHiUdF5u7I6c0NPqPRVLQJ7BTEwDWWqZsd8/Gaujd6wV8YROuwUX0/ilUjM + U2rg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725116520; x=1725721320; + d=1e100.net; s=20230601; t=1725334056; x=1725938856; h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=An/Et77KDu2to3R2EwS+Di8vntf5/afFG8cgRpOoYHs=; - b=ch2gg7gz464o7OuMo8B4ffVFWaK+gatg3MmGyxsVlqf4oqGzFj1oof3JK04eAsZgch - vvUp9ddDaO7a4tUVDlNt4WE1q4rYnfjH+QVHZgfH8h6iKIfmMKiG9+WHoZifvd3cztt8 - wgbEX0VtOBRvcgBteteufXmsLStLYWbuaHc1/fTrnHNPLWjLCtS+0asRHg7caPwsB37A - 5WUohNNvCmVeeM3FpcpPjWF3OiVIzpaHl86Y/KQ7aE50i1R0yZA40RXYrEsokt3kXMmz - bH3SNamaa+QlS0dmxhW3V80V5uPt00tMQ/OQDMXqMCPLq0zemmlMYXiUPwhPOILGumOS - EvQA== -X-Gm-Message-State: AOJu0YyrRyyu6hLa9WzV5B3nq9bCIiWJJueLenb2VQvbc/t/PKx7X4md - 97B7AocL28ILGZmfhrRpaWouehWaka0wk14ET+9NCsJy9RuhV+wu0CHduw== -X-Google-Smtp-Source: AGHT+IEeY0b06fIH/H7xLp4xtuYAN1AQ1VggjaGoBtE/UNMdslPmg0nzyWpfyzk+jl8JOv/B5fyzfA== -X-Received: by 2002:a17:902:ccc7:b0:202:11ab:ccf4 with SMTP id d9443c01a7336-2050c215845mr99384835ad.6.1725116520165; - Sat, 31 Aug 2024 08:02:00 -0700 (PDT) + bh=WgHRFiGakPoqy0EgpGEskuPH5Lowb5jxC1QjM/mOplQ=; + b=dWJFooeQ8q+PZZsM5NTndOU7IXeI5McolVtTis3cROJiH/oFW/k1SgToIlTUmNdnhA + YPiZr2ItjzoJsfsCHfVb73AX3BU0mYXT5+Sjt2AAd/JNbyWnfVBB0ZJjd6rlt2S8jmjI + M+/KcwF1Sou4hOHwRjxQDhBs3iKP9viSUVU+9fKPSv+OlMovcHiPNKWfH1RmwcTNDBR1 + RE3d7IU5QlTx+bLikUgLYIryImxLC5lfuHbIko3NlBzxLZrA9Pj6hF76iT9UXFxa+6BK + B3+Y3u0o9enBfJiTsXhjk2RoEG+LcZgnJBQSqwC/YeVaWvh8HxY75F2D2ldxIarM22HN + tJ/g== +X-Gm-Message-State: AOJu0YzKj2b6fLP+w6zuYHVb05MlFmSVhvlQ5FSLE+c3m4KFTG9Ic+pJ + EyS8NK2IxycikeIweP5EWCRqxlBMTbCM4bIfAMDms/Al72Bxr/kotdJ1jDmf +X-Google-Smtp-Source: AGHT+IHD7n5/xZAHlyRK90hV7Q5EOvA71n45FOOpoWYj42EVRljal1jdEFIr5ccEMPl4UR8k+pYOHA== +X-Received: by 2002:a05:6a20:d493:b0:1c2:905c:dc2 with SMTP id adf61e73a8af0-1cce100b43emr14035663637.15.1725334055878; + Mon, 02 Sep 2024 20:27:35 -0700 (PDT) Return-Path: -Received: from adityas-macbook-air-4.local ([61.2.109.23]) - by smtp.gmail.com with ESMTPSA id d9443c01a7336-2055553958fsm5837015ad.99.2024.08.31.08.01.58 +Received: from adityas-macbook-air-4.local ([59.184.57.198]) + by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2d8e9a0002esm2525225a91.14.2024.09.02.20.27.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Sat, 31 Aug 2024 08:01:59 -0700 (PDT) -Message-ID: <66d33067.170a0220.1fb130.1212@mx.google.com> -Date: Sat, 31 Aug 2024 08:01:59 -0700 (PDT) -Content-Type: multipart/alternative; boundary="===============0248742556298637677==" + Mon, 02 Sep 2024 20:27:35 -0700 (PDT) +Message-ID: <66d68227.170a0220.c88d4.721a@mx.google.com> +Date: Mon, 02 Sep 2024 20:27:35 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============2480312449962561214==" MIME-Version: 1.0 From: zkemail.relayer.test@gmail.com To: shryas.londhe@gmail.com Subject: Test Email 5 in Quoted-Printable Encoding ---===============0248742556298637677== +--===============2480312449962561214== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable @@ -91,11 +91,11 @@ Content-Type: text/html; charset=utf-8

Hello!

This is a test email with a basic HTML body.

-
Accept guardian request for 0x04884491560f3834= -2C56E26BDD0fEAbb68E2d2FC code 01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc= -07763475c135d575b76
=20 +
Accept guardian request for 0x04884491560f38342= +C56E26BDD0fEAbb68E2d2FC code 01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc0= +7763475c135d575b76
=20

Thank you!

=20 ---===============0248742556298637677==-- +--===============2480312449962561214==-- diff --git a/packages/circuits/tests/emails/email_auth_with_body_parsing_test6.eml b/packages/circuits/tests/emails/email_auth_with_body_parsing_test6.eml index 8404b7c4..739cea3b 100644 --- a/packages/circuits/tests/emails/email_auth_with_body_parsing_test6.eml +++ b/packages/circuits/tests/emails/email_auth_with_body_parsing_test6.eml @@ -1,86 +1,86 @@ Delivered-To: shryas.londhe@gmail.com -Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp1028184pzb; - Sat, 31 Aug 2024 08:02:24 -0700 (PDT) -X-Received: by 2002:a05:6a00:1905:b0:714:157a:bfc7 with SMTP id d2e1a72fcca58-7173c30b357mr3072592b3a.15.1725116543787; - Sat, 31 Aug 2024 08:02:23 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725116543; cv=none; +Received: by 2002:a05:6a20:de1b:b0:1c3:edfb:6113 with SMTP id kz27csp2293443pzb; + Mon, 2 Sep 2024 20:27:54 -0700 (PDT) +X-Received: by 2002:a05:6a00:13a6:b0:70b:5394:8cae with SMTP id d2e1a72fcca58-715dfc76152mr18975970b3a.28.1725334074235; + Mon, 02 Sep 2024 20:27:54 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725334074; cv=none; d=google.com; s=arc-20160816; - b=qMCQfZBCrlje56JMBZ3rLuog5FSYYR7Kd4wuJ+kkY2hbLRAPX/LyZAfYfg4llqt9fE - GDOJ4iK+NKE40sf01w9EJlc0aZcSLUlJKX0ZZU34B5F9PUpJYWrvWalKjbULtR8lS9FP - ZNPffY1+2u8TrSgO4tmquOLdEYA6tVjxZrD6b1eaMhcxQ2Dpd1k+nlojJlLDi0+M02uS - 40QkRUyc5qx0TktNW/gbHBD+Rp5OIT6oJWJDF4FXFoip14FwKO6uQYuVp/gobYJraZJP - Ed9RSB4HhtlLz8Mc9JDIDCe8U0mSP9XZSxlr9m18PglpGq/A4SicRYasI0QS8o33WB4K - PEEw== + b=un5D2W+ZqEo7Jtp7IWmKsUjcrtaX6AduEjry1n1w1X0fEAa8GhlMid0yDTtijYSet9 + 5CFIhMmNDbo4qgL1nhkUdMYb9hUXIDfucyGGcV5uGXRVgH4zKf4BQsJCX5yejGrUJtyL + kShNK4PNlxg9bwlzFzmFxghdEq6hh4XC5CKMqq7PjhpupTwlNd58m+p9DW9De8agKUul + XXqaPLi944hidp8j4pmilewmO9wvMsPsb4nFJ6Y/kkY89oylCkxCF7PLlJPfPpkrr0E/ + 8JIFzzOCGMi8EzJ1XBt05DhDmYCqemD4u/evzNkHvVV4c1uwKcZ0A6Pr1WNNSYy0EbIr + iAmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=subject:to:from:mime-version:date:message-id:dkim-signature; - bh=xrwyIK39xwGIlfL9sJe2wyzoF2WX94dnDVaqyxAeclY=; + bh=pgWkiyvv1a5DWOqSsp+0OWFkqbooRoO1bv8OEpIkz1c=; fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; - b=YRHQC400XEFnlOsHn4TfFeTf7mok7PRBRZb7SpdzDWmS6zVZGgNYILujz//kGZHoZ5 - a+ogJXc6ba4lYZCKg+OG7weo7a99dRKjH2o4kvQZ7KLaETwhKTCeStoYac1DZLa4FPRj - 60kpEsstdc9JbTac3jNuUw7v3hMLktY+k/QMW8sO2CcrJv6Yu5LtMA5b4UUnn8skWOiu - J3Yj2P/5+GZab1fj8puFFhnuealZtGL31VDOE9JW0iI5v4dWrbEQphUynvuKf65zIBAG - TK4RVKRIeUTmkHoaYWiFXpMJn9r5rmvYMsQFJSxyXJCq27erge+PVlrb+ls5PMERMVw8 - izDw==; + b=DrjGCyEXF+d99x62EfQqgRYgMocvBuyKI619jIwi41axy/jPVfTVdZVLQ4HY91j6hZ + z/pxIsjf24nHbmXSA9LkZYaSHBLpvWdXNXApH23u8s3Z6hbRnvia3Iz+q2KtwGyfxErK + gBQb2ziysfe7ZrJ5FGnrc9Uak3prq9EfRe0s1Qo5xAJgRRUDhKaptJdxNtWQ6Gsy9xtN + X8R6SgvGygR8W5BM6fYMO0ty3qPm55MNbPEdgrJz6pqgDLbgzUeuCKEwcTrQ4EhE6A6O + aYAt8BcNMtLfeHpe/EHswDs9S2rbjMmS1WpUO9UnQKAekn5xfMM3oLhtMCSmP1sDQE8L + wlxw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=ex7EFYZU; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=XRK4dsJz; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id d2e1a72fcca58-715e557b837sor3274925b3a.2.2024.08.31.08.02.23 + by mx.google.com with SMTPS id d2e1a72fcca58-715e56aa50fsor4396307b3a.8.2024.09.02.20.27.54 for (Google Transport Security); - Sat, 31 Aug 2024 08:02:23 -0700 (PDT) + Mon, 02 Sep 2024 20:27:54 -0700 (PDT) Received-SPF: pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=ex7EFYZU; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=XRK4dsJz; spf=pass (google.com: domain of zkemail.relayer.test@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=zkemail.relayer.test@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725116543; x=1725721343; dara=google.com; + d=gmail.com; s=20230601; t=1725334073; x=1725938873; dara=google.com; h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=xrwyIK39xwGIlfL9sJe2wyzoF2WX94dnDVaqyxAeclY=; - b=ex7EFYZU0eLYsFVsMAfZPn9gsCgK9gb52lOnfZGSUxoJ5sZwSBF/8t20rvdlhr5GeW - RE6mcsHYcIpuVwdRirATwxa6feU0fbbACiDT/N5azWxDV0E01o+uVSkfeLJb0Q8/OMuT - o6AcxqqqGwss5fRQ5XDcxYqRlCZspVUkEWIbNiv5LBRWZFZe2LaVOS1UI+5MYAvzio4e - 4jNv3+DOf9trLXzjGBXp0dre+GlPCxaTS7O1q7VlabHMXqfBX/LBzJ6EFLkbIrgDvXbr - 7sCKA+c/bCcPkSJtQK22nF8QQ3f+Th6KPcsYPoGN+Uw6aj65aSjBnJMqiMZvqXGJIjFf - 9Qrw== + bh=pgWkiyvv1a5DWOqSsp+0OWFkqbooRoO1bv8OEpIkz1c=; + b=XRK4dsJz4SAP3hRuQEbzNPmHQRuIwN7gC3Toq/u3YEwIhaR6eFMBUwMcqYqB8UkUiz + KhxCfWVqP3Xoa6L5nKgqcyfF9Kd6lbi1sFD11wCWn/Mz9Hf8k73MmjU9E2KYc2s2zNPw + pWCyzNQONb5cepefmjcatBkoiX7NHVB478Skm2V+HSEze0r8F1nRxmWNZrWkVi6nJDbu + KH+KOhbLL0i1gxCjzUhaAoFvEBk24BIcaSGXfosDiIndYN6YcqkLhFCldEyEwume24VL + cPCF8HujrW7XmeRvCuMCn7wD0LWsLMoSscqp0An2StzAqbogLSMRJxz/epssvQTMTMOG + wjxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725116543; x=1725721343; + d=1e100.net; s=20230601; t=1725334073; x=1725938873; h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=xrwyIK39xwGIlfL9sJe2wyzoF2WX94dnDVaqyxAeclY=; - b=GHGerBY+57YeTjKGJCEvee0/ep14vGs1+F5J8huA13+BbxEJyLbSWMocdaz5Po7d/P - ci1qua76dZzXS15C+n0Uvne2HKxn6eHuevha3wd5Xe9ZUBXfzXeSgusLCbTV85wrofa1 - 3XW2hSLrGrz9+0DqG90GCTvOknBYHin5lWZWFwzr60uvvxiD+wvDtB3+WWysMsy2REaT - +CpE1JY/pozeCRFYTBC+dmsiq07PnhS5kWe5ks4f3rlMpmYfAxIhyy3JcuePqJa1nETM - 4KsrboipkZaMVXXgxGJaT7953aNswKgkkLjS7ZxuOXX5AkqkbtMFp9D2pdBZ76Rxz0+y - YPrw== -X-Gm-Message-State: AOJu0YyGs7a+Pq6exaResD00gS9K+KBfa7V0C8KwaHDcs5CJnUPqqo5a - J0Z0apWMAVGfGffSsBxCh/fnxVbnQiZdNDE3To6EE+gNumVVi/FSPC/Tfg== -X-Google-Smtp-Source: AGHT+IHmQs/JDxreX6HtvZM6tfTLSL0feBCEfBAoun1tjKevSZJz6vb8YAUNoocEW0dq24K7mnxDsg== -X-Received: by 2002:a05:6a00:178d:b0:714:29d7:94c0 with SMTP id d2e1a72fcca58-7173c1f74a8mr2750770b3a.11.1725116542579; - Sat, 31 Aug 2024 08:02:22 -0700 (PDT) + bh=pgWkiyvv1a5DWOqSsp+0OWFkqbooRoO1bv8OEpIkz1c=; + b=VO28pSPISSu6qdDmgTw6HbdIQURR5AkXCDB5/dhyh3YPhJqebY0hkU5nN3zD7ZPlVQ + CxhBbyVXrh4ifk5qepS8+BIr6vBC55lFMxVdmR2gi3aThNPF9KZTYZQTtNUdUwNSYshX + WZfJKzCG0TrQU7Z1jLlFtiRHMRbhrPVchpxmllSc4tFCi4j4/MdxA27vVUZzFjSh4jj8 + UNR2DcNXF85BxLL3zlJ3IBqs677PmguMayXh6HOtl+VuD/JMDnus+fUK346cbWhMDshV + Hj21xUAUPyQYWWMc02/NJsjfgELepRF1dx0B8R+ijITBDHw192iXPb6BYhhp3ioSx6PK + CIVw== +X-Gm-Message-State: AOJu0Yxldlkarwj3YGmKOwL3y3z96btfia/hOxJwkNzLLmi2DUUd1OGh + r7OjvZc0Fj5WxPoq7D5Wr1T6sUpex0wgABDkcz01/ObDYySFXCEKFRzB7cId +X-Google-Smtp-Source: AGHT+IFnf20OpV3I1ih3Ui3X6XFnQvdQOp1AaiGnhvoKcgNNJ3AZUIIv3FUXMtd2f48CH66L39S4IQ== +X-Received: by 2002:a05:6a20:d046:b0:1c4:8da5:219a with SMTP id adf61e73a8af0-1cce0ff26c9mr17830838637.8.1725334073459; + Mon, 02 Sep 2024 20:27:53 -0700 (PDT) Return-Path: -Received: from adityas-macbook-air-4.local ([61.2.109.23]) - by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-715e55a5b93sm4345464b3a.76.2024.08.31.08.02.21 +Received: from adityas-macbook-air-4.local ([59.184.57.198]) + by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2d8445e877bsm12521498a91.19.2024.09.02.20.27.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Sat, 31 Aug 2024 08:02:22 -0700 (PDT) -Message-ID: <66d3307e.050a0220.1f5494.0f92@mx.google.com> -Date: Sat, 31 Aug 2024 08:02:22 -0700 (PDT) -Content-Type: multipart/alternative; boundary="===============2124554468036970868==" + Mon, 02 Sep 2024 20:27:53 -0700 (PDT) +Message-ID: <66d68239.170a0220.15bca8.a4f5@mx.google.com> +Date: Mon, 02 Sep 2024 20:27:53 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============3823408927414188670==" MIME-Version: 1.0 From: zkemail.relayer.test@gmail.com To: shryas.londhe@gmail.com Subject: Test Email 6 in Quoted-Printable Encoding ---===============2124554468036970868== +--===============3823408927414188670== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable @@ -91,9 +91,9 @@ Content-Type: text/html; charset=utf-8

Hello!

This is a test email with a basic HTML body.

-
from:adversary@test.com
=20 +
from:adversary@test.com
=20

Thank you!

=20 ---===============2124554468036970868==-- +--===============3823408927414188670==-- From e2ed105145fedd4b04d9f400f8df00ac6af5158d Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Tue, 3 Sep 2024 09:15:26 +0530 Subject: [PATCH 017/121] chore: changed max_command_bytes to 605 --- .../src/email_auth_with_body_parsing.circom | 2 +- ..._with_body_parsing_with_qp_encoding.circom | 2 +- .../email_auth_with_body_parsing.test.ts | 6 +- ...with_body_parsing_with_qp_encoding.test.ts | 4 +- .../src/abis/email_account_recovery.rs | 70 +++++++++++++++++++ 5 files changed, 77 insertions(+), 7 deletions(-) diff --git a/packages/circuits/src/email_auth_with_body_parsing.circom b/packages/circuits/src/email_auth_with_body_parsing.circom index 5d624040..242166a1 100644 --- a/packages/circuits/src/email_auth_with_body_parsing.circom +++ b/packages/circuits/src/email_auth_with_body_parsing.circom @@ -2,4 +2,4 @@ pragma circom 2.1.6; include "./email_auth_template.circom"; -component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 256, 0, 0); \ No newline at end of file +component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 605, 0, 0); \ No newline at end of file diff --git a/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom b/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom index 4d5c3c04..336eaf10 100644 --- a/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom +++ b/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom @@ -2,4 +2,4 @@ pragma circom 2.1.6; include "./email_auth_template.circom"; -component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 256, 0, 1); \ No newline at end of file +component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 605, 0, 1); \ No newline at end of file diff --git a/packages/circuits/tests/email_auth_with_body_parsing.test.ts b/packages/circuits/tests/email_auth_with_body_parsing.test.ts index 3d6eaf78..907f2eef 100644 --- a/packages/circuits/tests/email_auth_with_body_parsing.test.ts +++ b/packages/circuits/tests/email_auth_with_body_parsing.test.ts @@ -68,7 +68,7 @@ describe("Email Auth With Body Parsing", () => { expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); const maskedCommand = "Send 0.1 ETH to "; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); const maskedCommandFields = relayerUtils.bytes2Fields(paddedMaskedCommand); for (let idx = 0; idx < maskedCommandFields.length; ++idx) { @@ -135,7 +135,7 @@ describe("Email Auth With Body Parsing", () => { expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); const maskedCommand = "Swap 1 ETH to DAI"; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); const maskedCommandFields = relayerUtils.bytes2Fields(paddedMaskedCommand); for (let idx = 0; idx < maskedCommandFields.length; ++idx) { @@ -204,7 +204,7 @@ describe("Email Auth With Body Parsing", () => { expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); const maskedCommand = "Send 1 ETH to "; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); const maskedCommandFields = relayerUtils.bytes2Fields(paddedMaskedCommand); for (let idx = 0; idx < maskedCommandFields.length; ++idx) { diff --git a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts index 75362daa..2cb26bc7 100644 --- a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts +++ b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts @@ -125,7 +125,7 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); const maskedCommand = "Send 0.12 ETH to "; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); const maskedCommandFields = relayerUtils.bytes2Fields(paddedMaskedCommand); for (let idx = 0; idx < maskedCommandFields.length; ++idx) { @@ -193,7 +193,7 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { const maskedCommand = "Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 256); + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); const maskedCommandFields = relayerUtils.bytes2Fields(paddedMaskedCommand); for (let idx = 0; idx < maskedCommandFields.length; ++idx) { diff --git a/packages/relayer/src/abis/email_account_recovery.rs b/packages/relayer/src/abis/email_account_recovery.rs index 86e02813..90b7a195 100644 --- a/packages/relayer/src/abis/email_account_recovery.rs +++ b/packages/relayer/src/abis/email_account_recovery.rs @@ -483,6 +483,28 @@ pub mod email_account_recovery { }, ], ), + ( + ::std::borrow::ToOwned::to_owned("proxyBytecodeHash"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("proxyBytecodeHash"), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( + 32usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], + ), ( ::std::borrow::ToOwned::to_owned("recoverySubjectTemplates"), ::std::vec![ @@ -754,6 +776,14 @@ pub mod email_account_recovery { .method_hash([201, 250, 167, 197], recovered_account) .expect("method not found (this should never happen)") } + ///Calls the contract's `proxyBytecodeHash` (0x85f60f7e) function + pub fn proxy_bytecode_hash( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([133, 246, 15, 126], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `recoverySubjectTemplates` (0x3e91cdcd) function pub fn recovery_subject_templates( &self, @@ -1024,6 +1054,19 @@ pub mod email_account_recovery { pub struct IsActivatedCall { pub recovered_account: ::ethers::core::types::Address, } + ///Container type for all input parameters for the `proxyBytecodeHash` function with signature `proxyBytecodeHash()` and selector `0x85f60f7e` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + #[ethcall(name = "proxyBytecodeHash", abi = "proxyBytecodeHash()")] + pub struct ProxyBytecodeHashCall; ///Container type for all input parameters for the `recoverySubjectTemplates` function with signature `recoverySubjectTemplates()` and selector `0x3e91cdcd` #[derive( Clone, @@ -1084,6 +1127,7 @@ pub mod email_account_recovery { HandleAcceptance(HandleAcceptanceCall), HandleRecovery(HandleRecoveryCall), IsActivated(IsActivatedCall), + ProxyBytecodeHash(ProxyBytecodeHashCall), RecoverySubjectTemplates(RecoverySubjectTemplatesCall), Verifier(VerifierCall), VerifierAddr(VerifierAddrCall), @@ -1163,6 +1207,11 @@ pub mod email_account_recovery { ) { return Ok(Self::IsActivated(decoded)); } + if let Ok(decoded) = ::decode( + data, + ) { + return Ok(Self::ProxyBytecodeHash(decoded)); + } if let Ok(decoded) = ::decode( data, ) { @@ -1224,6 +1273,9 @@ pub mod email_account_recovery { Self::IsActivated(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::ProxyBytecodeHash(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::RecoverySubjectTemplates(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -1269,6 +1321,7 @@ pub mod email_account_recovery { Self::HandleAcceptance(element) => ::core::fmt::Display::fmt(element, f), Self::HandleRecovery(element) => ::core::fmt::Display::fmt(element, f), Self::IsActivated(element) => ::core::fmt::Display::fmt(element, f), + Self::ProxyBytecodeHash(element) => ::core::fmt::Display::fmt(element, f), Self::RecoverySubjectTemplates(element) => { ::core::fmt::Display::fmt(element, f) } @@ -1355,6 +1408,11 @@ pub mod email_account_recovery { Self::IsActivated(value) } } + impl ::core::convert::From for EmailAccountRecoveryCalls { + fn from(value: ProxyBytecodeHashCall) -> Self { + Self::ProxyBytecodeHash(value) + } + } impl ::core::convert::From for EmailAccountRecoveryCalls { fn from(value: RecoverySubjectTemplatesCall) -> Self { @@ -1509,6 +1567,18 @@ pub mod email_account_recovery { Hash )] pub struct IsActivatedReturn(pub bool); + ///Container type for all return fields from the `proxyBytecodeHash` function with signature `proxyBytecodeHash()` and selector `0x85f60f7e` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + pub struct ProxyBytecodeHashReturn(pub [u8; 32]); ///Container type for all return fields from the `recoverySubjectTemplates` function with signature `recoverySubjectTemplates()` and selector `0x3e91cdcd` #[derive( Clone, From a8f2ef03c3f297f325e99dee002ed46f54fb195d Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Tue, 3 Sep 2024 15:02:47 +0900 Subject: [PATCH 018/121] Update verifier --- .../contracts/src/utils/Groth16Verifier.sol | 183 +++++++++++++----- packages/contracts/src/utils/Verifier.sol | 4 +- 2 files changed, 132 insertions(+), 55 deletions(-) diff --git a/packages/contracts/src/utils/Groth16Verifier.sol b/packages/contracts/src/utils/Groth16Verifier.sol index b3b499a2..519cf27e 100644 --- a/packages/contracts/src/utils/Groth16Verifier.sol +++ b/packages/contracts/src/utils/Groth16Verifier.sol @@ -37,83 +37,116 @@ contract Groth16Verifier { uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 7512310166790179922504683523654316114051222191831169356747444038269967648305; - uint256 constant deltax2 = 14358591220354673294638423548838009163329059984271248943224595375523946440844; - uint256 constant deltay1 = 10945165491323316120158090062372436583843822551186653547350912773785745492908; - uint256 constant deltay2 = 12977491133002118873088909332652159965708924468719154246248274593582873461934; + uint256 constant deltax1 = 14137599133423807135782490399584092377749091501298939597920866162944520244436; + uint256 constant deltax2 = 14978007254868208603199787958301705165537192974609940615923845103163843289642; + uint256 constant deltay1 = 20866926135988308729900029756061807139052115776449961128367516123973492874132; + uint256 constant deltay2 = 13313063679389223211741428584465992043666285070547834947574090177964352791211; - uint256 constant IC0x = 13963177540950809295782204463516277073432173625654096650299395551650393709604; - uint256 constant IC0y = 15602945741766824338761981015932856359177200661747787110583509305519171311689; + uint256 constant IC0x = 5195936601868887585212421372510227978271676935057973899956702156349203234222; + uint256 constant IC0y = 7962666133599308700300916998348077443104178691470750683750290264787523050083; - uint256 constant IC1x = 13901364820478321928616223034286870916279818972373410460098510478160011053099; - uint256 constant IC1y = 14236131152778024758629670193607195289980506228078730330692122051313154306570; + uint256 constant IC1x = 3742958340223569504265649722106845322935941488002511232315317901779710961348; + uint256 constant IC1y = 17830086392700490461575614924542539921010019218267138065309167838118767673071; - uint256 constant IC2x = 9230583203032536232829062152692285477328633564550620828795526551927932673258; - uint256 constant IC2y = 12823968485634865433296790678185713696956177429058503916497795155602629992619; + uint256 constant IC2x = 4332752895886212961294524900538769962072739040734849994651204657950683289368; + uint256 constant IC2y = 1377131541785679015417232044137700801378123208892271570382657073684395420024; - uint256 constant IC3x = 17639740392526803545767112437667038900196736383732820044731439393404104455892; - uint256 constant IC3y = 185489738400311207281216872971624070048902329723183825977411360815457155921; + uint256 constant IC3x = 16378292231478499838092155231627156354691178980041169284687330191005695577919; + uint256 constant IC3y = 17984842151588713416158803141980876218634444020891506138402480465525181344342; - uint256 constant IC4x = 12069519432129553376683732542057521791951300837387868001349505113926238600603; - uint256 constant IC4y = 5179805167216122560022161376021253470175122378869865440572964817206688034995; + uint256 constant IC4x = 11965323634630493035329899963690158132995308612106355950740136591993893219420; + uint256 constant IC4y = 9036580198334173839201781041185265082225960680796419311264598509854480156749; - uint256 constant IC5x = 13341741969026085479452747303102949204889069730043799331450553531777313415027; - uint256 constant IC5y = 12622154326191207141879122439134936928996883243183804472561540303328627402611; + uint256 constant IC5x = 8459630029068528580429553108101440945373189351254431332719199991450558544610; + uint256 constant IC5y = 13651627208666641596882636276693872905868719669569331130223221844756480706355; - uint256 constant IC6x = 5524249138004641558839056031282734507960291855160204994698994244702630374695; - uint256 constant IC6y = 2838545179481365224586078663128105413457151412717798861182352117115080523068; + uint256 constant IC6x = 11418680074014215462237476921106744160987769937545607863613880530479435852793; + uint256 constant IC6y = 16741190989512051286515154593161715196784599987136091819768098700099951966060; - uint256 constant IC7x = 19554330184893289081351857198918890940131287920028938901123258851925997091096; - uint256 constant IC7y = 21187120635590833154352478658750104019492268925659795328629826170424237790467; + uint256 constant IC7x = 13831043129703500407338686026967233166168634089065511597932358351098797730621; + uint256 constant IC7y = 19654592342690178826154705309997596268116769282480108200974219537036779371791; - uint256 constant IC8x = 7760862852091446869454661318724098439035438362089550104244769932517916868839; - uint256 constant IC8y = 19254393654613960117332409830738981805954756960359620518017135829429172873772; + uint256 constant IC8x = 12659402812760536946587000061651522239448406097114769091067522676195029124036; + uint256 constant IC8y = 21366009070877925176882055259475055305247055854906963167825248279397450107409; - uint256 constant IC9x = 15564940155024906142999107362340815858137284449493640983339345075622293100658; - uint256 constant IC9y = 1617046506300089432116787730161816212709927386986013437340513810060016149022; + uint256 constant IC9x = 11453150531242067834578895014844696195314287671155062571621601525155787106768; + uint256 constant IC9y = 13537796031408580209437745696367565845966373090615194634642039101343542355153; - uint256 constant IC10x = 8761289037800026614344829900088226723021361306934107788103479929938837644308; - uint256 constant IC10y = 18887041123828916694468022436722879291739062402223689213701674861638998067598; + uint256 constant IC10x = 20093354799903715012012153551878914128034578543732120460093003674569621900678; + uint256 constant IC10y = 661654072208849854990960058973836491179251267828702406201676324115522183987; - uint256 constant IC11x = 15078796297798212555417977593995358910740633024789147595871485081022877594688; - uint256 constant IC11y = 8470804935050612973272335097844258163084303298699216060651895502152836140266; + uint256 constant IC11x = 2199538106454983378702155262750677597934025323095042816965655834581602546305; + uint256 constant IC11y = 938804879776828512825404167032359904154808938369573736543158236082744779065; - uint256 constant IC12x = 13148554463252000159734437740750147355285467799702838626674782427621833651862; - uint256 constant IC12y = 4154912502683952848865244880904626773017467395251182073432201348576612338512; + uint256 constant IC12x = 13649643871438615401325195027458534071402773850754937857802795986898955350643; + uint256 constant IC12y = 17385455189083877001780749863496820018757924419367993355210000166538058509504; - uint256 constant IC13x = 9971258020291304535684934520409197417844738102841933849336209194551684387260; - uint256 constant IC13y = 11597854766455209249051872024659116726914370916348872165676874573511692371038; + uint256 constant IC13x = 3919806397462020476924320698720612586325131068555439014510154499929415231546; + uint256 constant IC13y = 6950962750979275347308936684073542743916967713183550555287096414703303875072; - uint256 constant IC14x = 2930562317584608077941323563288223695503253706485531251156544883634158242043; - uint256 constant IC14y = 9240840788488657599771118100535077289767006523619812853863860241862442262419; + uint256 constant IC14x = 21617074324876578460531149615625632094727390653686583753180981293116313336795; + uint256 constant IC14y = 18288151827607067102645837618524429433655012118476234601055198996044031270225; - uint256 constant IC15x = 16422784168814990015933552338417309538225820837997155930682270086046353015844; - uint256 constant IC15y = 19869469930650174203989020181864562320111438711593759069952187898326610664818; + uint256 constant IC15x = 4000708925527443807227241537033307583003447845797803803332356328626248705382; + uint256 constant IC15y = 1154600183297897257070571574499276007915600103090707700994900568610839463180; - uint256 constant IC16x = 13790631431800806141462691434744099435298278652239216597838090515088257481073; - uint256 constant IC16y = 5970741811988419030089819655471571807951451817787149436342954581604814989654; + uint256 constant IC16x = 11901100788061344866021032645161410354755351952030556105637534598729803434166; + uint256 constant IC16y = 16804802892568449193466174693644238516033464302901967260235961561237161720026; - uint256 constant IC17x = 14976736427051209441599895542115651186815700359766023720088346036777288255538; - uint256 constant IC17y = 12852402101788491586826305692493329786060447274461406286947282250831762004864; + uint256 constant IC17x = 586980697795044138033629480303267286923166292074979442828313193925002353539; + uint256 constant IC17y = 11395515205673918388736502540392075651362432388102325564755713826093996896765; - uint256 constant IC18x = 4280125422602481644778681032156727291998269141310669530728230860253156845126; - uint256 constant IC18y = 16682143429272254699133459970696787349636739657860469986526142128107512434480; + uint256 constant IC18x = 21684800601451717499401579708297162716967255721349906661409841794723254042516; + uint256 constant IC18y = 7331868483392828521170991339808386563984066825046191241635252089006975585746; - uint256 constant IC19x = 10147951062270258918013679058779577570351008390025368069146440787810065746771; - uint256 constant IC19y = 5090148640187367354670039734538337475397977849830533292031088125570710070678; + uint256 constant IC19x = 21071894109390133818432992111016597167186471742446860545799328494730067371036; + uint256 constant IC19y = 2250746924642512539503116477183280832526559754318370335662599738970760735965; - uint256 constant IC20x = 578255745441773075639210078803617950558342577360305877996037440974850723995; - uint256 constant IC20y = 12520655905142699409929405181761549544517927774724036032382536924347165049220; + uint256 constant IC20x = 11699852834269224235393200438108093155076792134835482044354663066791001331547; + uint256 constant IC20y = 7525060483340472166081962270247534971293407558771701860513236466676372605839; - uint256 constant IC21x = 3355415877559605146458275122957543229539987007795496380499840576047274644423; - uint256 constant IC21y = 20476643636313926200244212968226317708756519977425220516640115874928427933331; + uint256 constant IC21x = 13333287753863763025811168578371672801299227240537901308851864510325527226990; + uint256 constant IC21y = 20724330577948787851354022778185584810491007685540005337623531623343955873208; - uint256 constant IC22x = 21449378479565844466348985747983272828741700435723692245161366305682834816693; - uint256 constant IC22y = 506562745742676866252077181735736358296299192584367348641528429905789575988; + uint256 constant IC22x = 13369259828518535278412305903662476453129352590581315212761565315929926869744; + uint256 constant IC22y = 20684227524142403196331960093377205173124833362046724169978464210156587312666; - uint256 constant IC23x = 20726751273737403605532121718064449872454430937365235084763999011467146824138; - uint256 constant IC23y = 2569317581613789680208520789013703218069888753995406910612291831117799394742; + uint256 constant IC23x = 10149427005480696708705641408410624852074762916352315357866716257764403959452; + uint256 constant IC23y = 1832744442234417278002382253284380678688397697648853103439247404860773988913; + + uint256 constant IC24x = 3238148721388181813909444794632491849221750829570437445443493977964140908904; + uint256 constant IC24y = 12233471704075818623166919848035666804013719612676696733435515734260544369112; + + uint256 constant IC25x = 200568091563451069021824567798180732022741817480404781322352122251371029319; + uint256 constant IC25y = 15968861848667517612536228852892590805607891756149176795583414595017493159240; + + uint256 constant IC26x = 7490905222606166621539734222169901612455935470396929579767614624709598347027; + uint256 constant IC26y = 13589782990411027629285738142493427660936202498516751386142336953724617631041; + + uint256 constant IC27x = 10439372252188652023854930400256109919428790553015141301690987392583603819070; + uint256 constant IC27y = 19645803372269710308802977570944089640204889280197417980290219376283875276427; + + uint256 constant IC28x = 4233175821966351360135101547096990171483511734573884288134490380124888438507; + uint256 constant IC28y = 9168539599977681140669648043037625242577522004096295050291178007562663505044; + + uint256 constant IC29x = 17965415543572427008316038629737097163843488210247795863797767551914431062732; + uint256 constant IC29y = 10022518030566331837515422454623442021051179479186636421545476748781258842331; + + uint256 constant IC30x = 16378790344935617687712615346664685876579757390713337666593356471997796161017; + uint256 constant IC30y = 67087458735409640505180328942607635982826830406801168778526050991167929457; + + uint256 constant IC31x = 18787438292886868094803768863007679727944933879676129674529468477986797983883; + uint256 constant IC31y = 9179663164408240683510141538256241224071171501322620226008520057824024561209; + + uint256 constant IC32x = 14050482524564003571938652642078944787042443917427102971495774411991650117059; + uint256 constant IC32y = 10866596210798953641577421873214410091458533938602431334494585211834598482309; + + uint256 constant IC33x = 20241331693940333034832945020019302228846150232143935552741654484387312060214; + uint256 constant IC33y = 10534185341170028606981516372307427513289433068554450644906839468082521965303; + + uint256 constant IC34x = 19479517211831911662095291764442113728434510877930437280064725446574700160265; + uint256 constant IC34y = 3943207262523423297047778027342789058321444964686369874431308251582045263338; // Memory data @@ -122,7 +155,7 @@ contract Groth16Verifier { uint16 constant pLastMem = 896; - function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[23] calldata _pubSignals) public view returns (bool) { + function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[34] calldata _pubSignals) public view returns (bool) { assembly { function checkField(v) { if iszero(lt(v, r)) { @@ -212,6 +245,28 @@ contract Groth16Verifier { g1_mulAccC(_pVk, IC23x, IC23y, calldataload(add(pubSignals, 704))) + g1_mulAccC(_pVk, IC24x, IC24y, calldataload(add(pubSignals, 736))) + + g1_mulAccC(_pVk, IC25x, IC25y, calldataload(add(pubSignals, 768))) + + g1_mulAccC(_pVk, IC26x, IC26y, calldataload(add(pubSignals, 800))) + + g1_mulAccC(_pVk, IC27x, IC27y, calldataload(add(pubSignals, 832))) + + g1_mulAccC(_pVk, IC28x, IC28y, calldataload(add(pubSignals, 864))) + + g1_mulAccC(_pVk, IC29x, IC29y, calldataload(add(pubSignals, 896))) + + g1_mulAccC(_pVk, IC30x, IC30y, calldataload(add(pubSignals, 928))) + + g1_mulAccC(_pVk, IC31x, IC31y, calldataload(add(pubSignals, 960))) + + g1_mulAccC(_pVk, IC32x, IC32y, calldataload(add(pubSignals, 992))) + + g1_mulAccC(_pVk, IC33x, IC33y, calldataload(add(pubSignals, 1024))) + + g1_mulAccC(_pVk, IC34x, IC34y, calldataload(add(pubSignals, 1056))) + // -A mstore(_pPairing, calldataload(pA)) @@ -313,6 +368,28 @@ contract Groth16Verifier { checkField(calldataload(add(_pubSignals, 736))) + checkField(calldataload(add(_pubSignals, 768))) + + checkField(calldataload(add(_pubSignals, 800))) + + checkField(calldataload(add(_pubSignals, 832))) + + checkField(calldataload(add(_pubSignals, 864))) + + checkField(calldataload(add(_pubSignals, 896))) + + checkField(calldataload(add(_pubSignals, 928))) + + checkField(calldataload(add(_pubSignals, 960))) + + checkField(calldataload(add(_pubSignals, 992))) + + checkField(calldataload(add(_pubSignals, 1024))) + + checkField(calldataload(add(_pubSignals, 1056))) + + checkField(calldataload(add(_pubSignals, 1088))) + // Validate all evaluations let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) diff --git a/packages/contracts/src/utils/Verifier.sol b/packages/contracts/src/utils/Verifier.sol index 6ef8a51f..2ccff85d 100644 --- a/packages/contracts/src/utils/Verifier.sol +++ b/packages/contracts/src/utils/Verifier.sol @@ -21,8 +21,8 @@ contract Verifier is OwnableUpgradeable, UUPSUpgradeable { uint256 public constant DOMAIN_FIELDS = 9; uint256 public constant DOMAIN_BYTES = 255; - uint256 public constant SUBJECT_FIELDS = 9; - uint256 public constant SUBJECT_BYTES = 256; + uint256 public constant SUBJECT_FIELDS = 20; + uint256 public constant SUBJECT_BYTES = 605; constructor() {} From 6b84605d85613177c2c47a5efba1ca36e8121299 Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Tue, 3 Sep 2024 19:02:23 +0530 Subject: [PATCH 019/121] feat: sha precompute test --- packages/circuits/package.json | 2 +- .../email_auth_with_body_parsing.test.ts | 8 +- ...with_body_parsing_with_qp_encoding.test.ts | 76 +++- .../tests/invitation_code_regex.test.ts | 328 +++++++++--------- 4 files changed, 247 insertions(+), 167 deletions(-) diff --git a/packages/circuits/package.json b/packages/circuits/package.json index b77f6fea..94a7bad3 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -13,7 +13,7 @@ "dependencies": { "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.3.0", + "@zk-email/relayer-utils": "^0.3.1", "commander": "^11.0.0", "snarkjs": "^0.7.0" }, diff --git a/packages/circuits/tests/email_auth_with_body_parsing.test.ts b/packages/circuits/tests/email_auth_with_body_parsing.test.ts index 907f2eef..f1156b64 100644 --- a/packages/circuits/tests/email_auth_with_body_parsing.test.ts +++ b/packages/circuits/tests/email_auth_with_body_parsing.test.ts @@ -64,7 +64,7 @@ describe("Email Auth With Body Parsing", () => { witness[1 + domainFields.length + 1] ); - const timestamp = 1725116446n; + const timestamp = 1725333972n; expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); const maskedCommand = "Send 0.1 ETH to "; @@ -90,7 +90,7 @@ describe("Email Auth With Body Parsing", () => { ); }); - it("Verify a sent email whose subject does not have an email address", async () => { + it("Verify a sent email whose body does not have an email address", async () => { const emailFilePath = path.join( __dirname, "./emails/email_auth_with_body_parsing_test2.eml" @@ -131,7 +131,7 @@ describe("Email Auth With Body Parsing", () => { witness[1 + domainFields.length + 1] ); - const timestamp = 1725116459n; + const timestamp = 1725333989n; expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); const maskedCommand = "Swap 1 ETH to DAI"; @@ -200,7 +200,7 @@ describe("Email Auth With Body Parsing", () => { witness[1 + domainFields.length + 1] ); - const timestamp = 1725116474n; + const timestamp = 1725334002n; expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); const maskedCommand = "Send 1 ETH to "; diff --git a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts index 2cb26bc7..1686df7e 100644 --- a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts +++ b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts @@ -57,7 +57,7 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { // expect(BigInt(expectedEmailNullifier)).toEqual( // witness[1 + domainFields.length + 1] // ); - // const timestamp = 1696967028n; + // const timestamp = 1725334030n; // expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); // const maskedSubject = "Send 1 ETH to "; // const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); @@ -121,7 +121,7 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { witness[1 + domainFields.length + 1] ); - const timestamp = 1725116497n; + const timestamp = 1725334030n; expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); const maskedCommand = "Send 0.12 ETH to "; @@ -147,7 +147,7 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { ); }); - it("Verify a sent email whose subject has an invitation code", async () => { + it("Verify a sent email whose body has an invitation code", async () => { const emailFilePath = path.join( __dirname, "./emails/email_auth_with_body_parsing_test5.eml" @@ -188,7 +188,75 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { witness[1 + domainFields.length + 1] ); - const timestamp = 1725116520n; + const timestamp = 1725334056n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = + "Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose body has an invitation code with sha precompute string", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test5.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + shaPrecomputeSelector: '
', + }); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725334056n; expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); const maskedCommand = diff --git a/packages/circuits/tests/invitation_code_regex.test.ts b/packages/circuits/tests/invitation_code_regex.test.ts index 9621c444..7cfbc089 100644 --- a/packages/circuits/tests/invitation_code_regex.test.ts +++ b/packages/circuits/tests/invitation_code_regex.test.ts @@ -3,172 +3,184 @@ const wasm_tester = circom_tester.wasm; import * as path from "path"; const relayerUtils = require("@zk-email/relayer-utils"); const option = { - include: path.join(__dirname, "../../../node_modules"), + include: path.join(__dirname, "../../../node_modules"), }; // const grumpkin = require("circom-grumpkin"); jest.setTimeout(120000); describe("Invitation Code Regex", () => { - it("invitation code", async () => { - const codeStr = "Code 123abc"; - const paddedStr = relayerUtils.padString(codeStr, 256); - const circuitInputs = { - msg: paddedStr, - }; - const circuit = await wasm_tester( - path.join(__dirname, "./circuits/test_invitation_code_regex.circom"), - option - ); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - // console.log(witness); - expect(1n).toEqual(witness[1]); - const prefixIdxes = relayerUtils.extractInvitationCodeIdxes(codeStr)[0]; - for (let idx = 0; idx < 256; ++idx) { - if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { - expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); - } else { - expect(0n).toEqual(witness[2 + idx]); - } - } - }); + it("invitation code", async () => { + const codeStr = "Code 123abc"; + const paddedStr = relayerUtils.padString(codeStr, 256); + const circuitInputs = { + msg: paddedStr, + }; + const circuit = await wasm_tester( + path.join( + __dirname, + "./circuits/test_invitation_code_regex.circom" + ), + option + ); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + expect(1n).toEqual(witness[1]); + const prefixIdxes = relayerUtils.extractInvitationCodeIdxes(codeStr)[0]; + for (let idx = 0; idx < 256; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); - it("invitation code in the subject", async () => { - const codeStr = "Swap 0.1 ETH to DAI code 123abc"; - const paddedStr = relayerUtils.padString(codeStr, 256); - const circuitInputs = { - msg: paddedStr, - }; - const circuit = await wasm_tester( - path.join(__dirname, "./circuits/test_invitation_code_regex.circom"), - option - ); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - // console.log(witness); - expect(1n).toEqual(witness[1]); - const prefixIdxes = relayerUtils.extractInvitationCodeIdxes(codeStr)[0]; - // const revealedStartIdx = emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))[0][0]; - // console.log(emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))); - for (let idx = 0; idx < 256; ++idx) { - if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { - expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); - } else { - expect(0n).toEqual(witness[2 + idx]); - } - } - }); + it("invitation code in the subject", async () => { + const codeStr = "Swap 0.1 ETH to DAI code 123abc"; + const paddedStr = relayerUtils.padString(codeStr, 256); + const circuitInputs = { + msg: paddedStr, + }; + const circuit = await wasm_tester( + path.join( + __dirname, + "./circuits/test_invitation_code_regex.circom" + ), + option + ); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + expect(1n).toEqual(witness[1]); + const prefixIdxes = relayerUtils.extractInvitationCodeIdxes(codeStr)[0]; + // const revealedStartIdx = emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))[0][0]; + // console.log(emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))); + for (let idx = 0; idx < 256; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); - it("email address and invitation code in the subject", async () => { - const codeStr = "Send 0.1 ETH to alice@gmail.com code 123abc"; - const paddedStr = relayerUtils.padString(codeStr, 256); - const circuitInputs = { - msg: paddedStr, - }; - const circuit = await wasm_tester( - path.join(__dirname, "./circuits/test_invitation_code_regex.circom"), - option - ); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - // console.log(witness); - expect(1n).toEqual(witness[1]); - const prefixIdxes = relayerUtils.extractInvitationCodeIdxes(codeStr)[0]; - // const revealedStartIdx = emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))[0][0]; - // console.log(emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))); - for (let idx = 0; idx < 256; ++idx) { - if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { - expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); - } else { - expect(0n).toEqual(witness[2 + idx]); - } - } - }); + it("email address and invitation code in the subject", async () => { + const codeStr = "Send 0.1 ETH to alice@gmail.com code 123abc"; + const paddedStr = relayerUtils.padString(codeStr, 256); + const circuitInputs = { + msg: paddedStr, + }; + const circuit = await wasm_tester( + path.join( + __dirname, + "./circuits/test_invitation_code_regex.circom" + ), + option + ); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + expect(1n).toEqual(witness[1]); + const prefixIdxes = relayerUtils.extractInvitationCodeIdxes(codeStr)[0]; + // const revealedStartIdx = emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))[0][0]; + // console.log(emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))); + for (let idx = 0; idx < 256; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); - it("invitation code in the email address", async () => { - const codeStr = "sepolia+code123456@sendeth.org"; - const paddedStr = relayerUtils.padString(codeStr, 256); - const circuitInputs = { - msg: paddedStr, - }; - const circuit = await wasm_tester( - path.join(__dirname, "./circuits/test_invitation_code_regex.circom"), - option - ); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - // console.log(witness); - expect(1n).toEqual(witness[1]); - const prefixIdxes = relayerUtils.extractInvitationCodeIdxes(codeStr)[0]; - // const revealedStartIdx = emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))[0][0]; - // console.log(emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))); - for (let idx = 0; idx < 256; ++idx) { - if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { - expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); - } else { - expect(0n).toEqual(witness[2 + idx]); - } - } - }); + it("invitation code in the email address", async () => { + const codeStr = "sepolia+code123456@sendeth.org"; + const paddedStr = relayerUtils.padString(codeStr, 256); + const circuitInputs = { + msg: paddedStr, + }; + const circuit = await wasm_tester( + path.join( + __dirname, + "./circuits/test_invitation_code_regex.circom" + ), + option + ); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + expect(1n).toEqual(witness[1]); + const prefixIdxes = relayerUtils.extractInvitationCodeIdxes(codeStr)[0]; + // const revealedStartIdx = emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))[0][0]; + // console.log(emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))); + for (let idx = 0; idx < 256; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); - it("prefix + invitation code in the subject", async () => { - const codeStr = "Swap 0.1 ETH to DAI code 123abc"; - const paddedStr = relayerUtils.padString(codeStr, 256); - const circuitInputs = { - msg: paddedStr, - }; - const circuit = await wasm_tester( - path.join( - __dirname, - "./circuits/test_invitation_code_with_prefix_regex.circom" - ), - option - ); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - // console.log(witness); - expect(1n).toEqual(witness[1]); - const prefixIdxes = - relayerUtils.extractInvitationCodeWithPrefixIdxes(codeStr)[0]; - // const revealedStartIdx = emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))[0][0]; - // console.log(emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))); - for (let idx = 0; idx < 256; ++idx) { - if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { - expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); - } else { - expect(0n).toEqual(witness[2 + idx]); - } - } - }); + it("prefix + invitation code in the subject", async () => { + const codeStr = "Swap 0.1 ETH to DAI code 123abc"; + const paddedStr = relayerUtils.padString(codeStr, 256); + const circuitInputs = { + msg: paddedStr, + }; + const circuit = await wasm_tester( + path.join( + __dirname, + "./circuits/test_invitation_code_with_prefix_regex.circom" + ), + option + ); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + expect(1n).toEqual(witness[1]); + const prefixIdxes = + relayerUtils.extractInvitationCodeWithPrefixIdxes(codeStr)[0]; + // const revealedStartIdx = emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))[0][0]; + // console.log(emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))); + for (let idx = 0; idx < 256; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); - it("prefix + invitation code in the subject 2", async () => { - const codeStr = - "Re: Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC Code 01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - const paddedStr = relayerUtils.padString(codeStr, 256); - const circuitInputs = { - msg: paddedStr, - }; - const circuit = await wasm_tester( - path.join( - __dirname, - "./circuits/test_invitation_code_with_prefix_regex.circom" - ), - option - ); - const witness = await circuit.calculateWitness(circuitInputs); - await circuit.checkConstraints(witness); - // console.log(witness); - expect(1n).toEqual(witness[1]); - const prefixIdxes = - relayerUtils.extractInvitationCodeWithPrefixIdxes(codeStr)[0]; - // const revealedStartIdx = emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))[0][0]; - // console.log(emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))); - for (let idx = 0; idx < 256; ++idx) { - if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { - expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); - } else { - expect(0n).toEqual(witness[2 + idx]); - } - } - }); + it("prefix + invitation code in the subject 2", async () => { + const codeStr = + "Re: Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC Code 01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const paddedStr = relayerUtils.padString(codeStr, 256); + const circuitInputs = { + msg: paddedStr, + }; + const circuit = await wasm_tester( + path.join( + __dirname, + "./circuits/test_invitation_code_with_prefix_regex.circom" + ), + option + ); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + // console.log(witness); + expect(1n).toEqual(witness[1]); + const prefixIdxes = + relayerUtils.extractInvitationCodeWithPrefixIdxes(codeStr)[0]; + // const revealedStartIdx = emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))[0][0]; + // console.log(emailWalletUtils.extractSubstrIdxes(codeStr, readFileSync(path.join(__dirname, "../src/regexes/invitation_code.json"), "utf8"))); + for (let idx = 0; idx < 256; ++idx) { + if (idx >= prefixIdxes[0] && idx < prefixIdxes[1]) { + expect(BigInt(paddedStr[idx])).toEqual(witness[2 + idx]); + } else { + expect(0n).toEqual(witness[2 + idx]); + } + } + }); }); From 2587fc82c3d2ca07e3ad039be4a1b5cc6fb1fef8 Mon Sep 17 00:00:00 2001 From: Aditya Bisht <44467788+Bisht13@users.noreply.github.com> Date: Tue, 3 Sep 2024 20:58:34 +0530 Subject: [PATCH 020/121] chore: update relayer utils version --- packages/circuits/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/circuits/package.json b/packages/circuits/package.json index 94a7bad3..df5670be 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -13,7 +13,7 @@ "dependencies": { "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.3.1", + "@zk-email/relayer-utils": "^0.3.2", "commander": "^11.0.0", "snarkjs": "^0.7.0" }, From 54d1526ba7d0116be53cf11f73f34ece4b4800c1 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Wed, 4 Sep 2024 06:00:13 +0530 Subject: [PATCH 021/121] feat: command update + relayer changes --- Cargo.lock | 57 +- kubernetes/cronjob.yml | 51 + kubernetes/relayer.yml | 19 +- packages/circuits/package.json | 4 +- packages/circuits/src/regexes/command.json | 28 +- .../circuits/src/regexes/command_regex.circom | 2982 ++++++++++++++--- packages/relayer/.env.example | 2 +- packages/relayer/Cargo.toml | 2 +- .../eml_templates/acceptance_request.html | 2 +- packages/relayer/src/core.rs | 85 +- packages/relayer/src/database.rs | 1 + .../src/modules/web_server/rest_api.rs | 16 + packages/relayer/src/utils/strings.rs | 3 +- 13 files changed, 2715 insertions(+), 537 deletions(-) create mode 100644 kubernetes/cronjob.yml diff --git a/Cargo.lock b/Cargo.lock index 85a1ce6f..ce5d4f19 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1646,16 +1646,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fancy-regex" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" -dependencies = [ - "bit-set", - "regex", -] - [[package]] name = "fancy-regex" version = "0.13.0" @@ -3897,9 +3887,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quinn" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d2fb862b7ba45e615c1429def928f2e15f815bdf933b27a2d3824e224c1f46" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" dependencies = [ "bytes", "pin-project-lite", @@ -3915,9 +3905,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.7" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea0a9b3a42929fad8a7c3de7f86ce0814cfa893328157672680e9fb1145549c5" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", "rand", @@ -3932,15 +3922,15 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" dependencies = [ "libc", "once_cell", "socket2 0.5.7", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4050,15 +4040,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.3" @@ -4157,14 +4138,12 @@ dependencies = [ [[package]] name = "relayer-utils" -version = "0.3.0" -source = "git+https://github.com/zkemail/relayer-utils?rev=fd6c7bf#fd6c7bfd9508185b21d3ee6545b6b0357c068d99" +version = "0.3.3" dependencies = [ "anyhow", "base64 0.21.7", "cfdkim", "ethers", - "fancy-regex 0.11.0", "file-rotate", "halo2curves", "hex", @@ -4177,10 +4156,10 @@ dependencies = [ "once_cell", "poseidon-rs", "rand_core", + "regex", "rsa", "serde", "serde_json", - "serde_regex", "slog", "slog-async", "slog-json", @@ -4741,16 +4720,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_regex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf" -dependencies = [ - "regex", - "serde", -] - [[package]] name = "serde_repr" version = "0.1.19" @@ -6182,11 +6151,11 @@ dependencies = [ [[package]] name = "whoami" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.4.1", + "redox_syscall 0.5.3", "wasite", ] @@ -6585,7 +6554,7 @@ name = "zk-regex-apis" version = "2.1.1" source = "git+https://github.com/zkemail/zk-regex.git#3b626316b07081378ffdca0d36ed2bec6df5b55a" dependencies = [ - "fancy-regex 0.13.0", + "fancy-regex", "itertools 0.13.0", "js-sys", "serde", diff --git a/kubernetes/cronjob.yml b/kubernetes/cronjob.yml new file mode 100644 index 00000000..94af6abd --- /dev/null +++ b/kubernetes/cronjob.yml @@ -0,0 +1,51 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cronjob-service-account + namespace: ar-base-sepolia +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + namespace: ar-base-sepolia + name: deployment-restart-role +rules: + - apiGroups: ["apps", "extensions"] + resources: ["deployments"] + verbs: ["get", "list", "watch", "update", "patch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: deployment-restart-rolebinding + namespace: ar-base-sepolia +subjects: + - kind: ServiceAccount + name: cronjob-service-account + namespace: ar-base-sepolia +roleRef: + kind: Role + name: deployment-restart-role + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: restart-deployment + namespace: ar-base-sepolia +spec: + schedule: "0 * * * *" + jobTemplate: + spec: + template: + spec: + serviceAccountName: cronjob-service-account + containers: + - name: kubectl + image: bitnami/kubectl:latest + command: + - /bin/sh + - -c + - | + kubectl rollout restart deployment relayer-email-auth --namespace ar-base-sepolia + restartPolicy: OnFailure diff --git a/kubernetes/relayer.yml b/kubernetes/relayer.yml index 4a5b6448..e815f95b 100644 --- a/kubernetes/relayer.yml +++ b/kubernetes/relayer.yml @@ -17,6 +17,7 @@ data: IC_REPLICA_URL: "" JSON_LOGGER: "" PEM_PATH: "" + SMTP_SERVER: "" --- apiVersion: v1 @@ -30,12 +31,6 @@ type: Opaque data: PRIVATE_KEY: DATABASE_URL: - IMAP_DOMAIN_NAME: - IMAP_PORT: - AUTH_TYPE: - SMTP_DOMAIN_NAME: - LOGIN_ID: - LOGIN_PASSWORD: PROVER_ADDRESS: ICPEM: @@ -94,14 +89,14 @@ spec: spec: containers: - name: relayer-container - image: bisht13/relayer-new-0:latest + image: bisht13/ar-relayer-base-1:latest ports: - containerPort: 4500 envFrom: - configMapRef: - name: relayer-config + name: relayer-config-email-auth - secretRef: - name: relayer-secret + name: relayer-secret-email-auth livenessProbe: httpGet: path: /api/echo @@ -131,12 +126,6 @@ spec: - secretRef: name: relayer-imap-secret volumes: - - name: pem-volume - secret: - secretName: relayer-secret - items: - - key: ICPEM - path: ".ic.pem" - name: pem-volume secret: secretName: relayer-secret-email-auth diff --git a/packages/circuits/package.json b/packages/circuits/package.json index df5670be..fbe20f0c 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -13,7 +13,7 @@ "dependencies": { "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.3.2", + "@zk-email/relayer-utils": "^0.3.3", "commander": "^11.0.0", "snarkjs": "^0.7.0" }, @@ -42,4 +42,4 @@ ] ] } -} \ No newline at end of file +} diff --git a/packages/circuits/src/regexes/command.json b/packages/circuits/src/regexes/command.json index a59f8518..c35fc64b 100644 --- a/packages/circuits/src/regexes/command.json +++ b/packages/circuits/src/regexes/command.json @@ -1,16 +1,16 @@ { - "parts": [ - { - "is_public": false, - "regex_def": "
" - }, - { - "is_public": true, - "regex_def": "[^<>/]+" - }, - { - "is_public": false, - "regex_def": "
" - } - ] + "parts": [ + { + "is_public": false, + "regex_def": "(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?\"(=\r\n)?[^\"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^\"]*(=\r\n)?\"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?" + }, + { + "is_public": true, + "regex_def": "[^<>/]+" + }, + { + "is_public": false, + "regex_def": "(<(=\r\n)?/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>)" + } + ] } diff --git a/packages/circuits/src/regexes/command_regex.circom b/packages/circuits/src/regexes/command_regex.circom index a6f7f567..e4c2e2b3 100644 --- a/packages/circuits/src/regexes/command_regex.circom +++ b/packages/circuits/src/regexes/command_regex.circom @@ -2,7 +2,7 @@ pragma circom 2.1.5; include "@zk-email/zk-regex-circom/circuits/regex_helpers.circom"; -// regex:
[^<>/]+
+// regex: (<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?"(=\r\n)?[^"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^"]*(=\r\n)?"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?[^<>/]+(<(=\r\n)?/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>) template CommandRegex(msg_bytes) { signal input msg[msg_bytes]; signal output out; @@ -14,22 +14,22 @@ template CommandRegex(msg_bytes) { in[i+1] <== msg[i]; } - component eq[65][num_bytes]; - component lt[14][num_bytes]; - component and[56][num_bytes]; - component multi_or[12][num_bytes]; - signal states[num_bytes+1][35]; - signal states_tmp[num_bytes+1][35]; + component eq[95][num_bytes]; + component lt[56][num_bytes]; + component and[436][num_bytes]; + component multi_or[61][num_bytes]; + signal states[num_bytes+1][119]; + signal states_tmp[num_bytes+1][119]; signal from_zero_enabled[num_bytes+1]; from_zero_enabled[num_bytes] <== 0; component state_changed[num_bytes]; - for (var i = 1; i < 35; i++) { + for (var i = 1; i < 119; i++) { states[0][i] <== 0; } for (var i = 0; i < num_bytes; i++) { - state_changed[i] = MultiOR(34); + state_changed[i] = MultiOR(118); states[i][0] <== 1; eq[0][i] = IsEqual(); eq[0][i].in[0] <== in[i]; @@ -40,520 +40,2564 @@ template CommandRegex(msg_bytes) { states_tmp[i+1][1] <== 0; eq[1][i] = IsEqual(); eq[1][i].in[0] <== in[i]; - eq[1][i].in[1] <== 100; + eq[1][i].in[1] <== 61; and[1][i] = AND(); and[1][i].a <== states[i][1]; and[1][i].b <== eq[1][i].out; states[i+1][2] <== and[1][i].out; eq[2][i] = IsEqual(); eq[2][i].in[0] <== in[i]; - eq[2][i].in[1] <== 105; + eq[2][i].in[1] <== 100; and[2][i] = AND(); - and[2][i].a <== states[i][2]; + and[2][i].a <== states[i][1]; and[2][i].b <== eq[2][i].out; - states[i+1][3] <== and[2][i].out; + and[3][i] = AND(); + and[3][i].a <== states[i][7]; + and[3][i].b <== eq[2][i].out; + multi_or[0][i] = MultiOR(2); + multi_or[0][i].in[0] <== and[2][i].out; + multi_or[0][i].in[1] <== and[3][i].out; + states[i+1][3] <== multi_or[0][i].out; eq[3][i] = IsEqual(); eq[3][i].in[0] <== in[i]; - eq[3][i].in[1] <== 118; - and[3][i] = AND(); - and[3][i].a <== states[i][3]; - and[3][i].b <== eq[3][i].out; - states[i+1][4] <== and[3][i].out; - eq[4][i] = IsEqual(); - eq[4][i].in[0] <== in[i]; - eq[4][i].in[1] <== 32; + eq[3][i].in[1] <== 13; and[4][i] = AND(); - and[4][i].a <== states[i][4]; - and[4][i].b <== eq[4][i].out; - states[i+1][5] <== and[4][i].out; + and[4][i].a <== states[i][2]; + and[4][i].b <== eq[3][i].out; + states[i+1][4] <== and[4][i].out; and[5][i] = AND(); - and[5][i].a <== states[i][5]; - and[5][i].b <== eq[2][i].out; - states[i+1][6] <== and[5][i].out; + and[5][i].a <== states[i][3]; + and[5][i].b <== eq[1][i].out; + states[i+1][5] <== and[5][i].out; + eq[4][i] = IsEqual(); + eq[4][i].in[0] <== in[i]; + eq[4][i].in[1] <== 105; and[6][i] = AND(); - and[6][i].a <== states[i][6]; - and[6][i].b <== eq[1][i].out; - states[i+1][7] <== and[6][i].out; + and[6][i].a <== states[i][3]; + and[6][i].b <== eq[4][i].out; + and[7][i] = AND(); + and[7][i].a <== states[i][11]; + and[7][i].b <== eq[4][i].out; + multi_or[1][i] = MultiOR(2); + multi_or[1][i].in[0] <== and[6][i].out; + multi_or[1][i].in[1] <== and[7][i].out; + states[i+1][6] <== multi_or[1][i].out; eq[5][i] = IsEqual(); eq[5][i].in[0] <== in[i]; - eq[5][i].in[1] <== 61; - and[7][i] = AND(); - and[7][i].a <== states[i][7]; - and[7][i].b <== eq[5][i].out; - states[i+1][8] <== and[7][i].out; - eq[6][i] = IsEqual(); - eq[6][i].in[0] <== in[i]; - eq[6][i].in[1] <== 51; + eq[5][i].in[1] <== 10; and[8][i] = AND(); - and[8][i].a <== states[i][8]; - and[8][i].b <== eq[6][i].out; - states[i+1][9] <== and[8][i].out; - eq[7][i] = IsEqual(); - eq[7][i].in[0] <== in[i]; - eq[7][i].in[1] <== 68; + and[8][i].a <== states[i][4]; + and[8][i].b <== eq[5][i].out; + states[i+1][7] <== and[8][i].out; and[9][i] = AND(); - and[9][i].a <== states[i][9]; - and[9][i].b <== eq[7][i].out; - states[i+1][10] <== and[9][i].out; - eq[8][i] = IsEqual(); - eq[8][i].in[0] <== in[i]; - eq[8][i].in[1] <== 34; + and[9][i].a <== states[i][5]; + and[9][i].b <== eq[3][i].out; + states[i+1][8] <== and[9][i].out; and[10][i] = AND(); - and[10][i].a <== states[i][10]; - and[10][i].b <== eq[8][i].out; - states[i+1][11] <== and[10][i].out; - eq[9][i] = IsEqual(); - eq[9][i].in[0] <== in[i]; - eq[9][i].in[1] <== 122; + and[10][i].a <== states[i][6]; + and[10][i].b <== eq[1][i].out; + states[i+1][9] <== and[10][i].out; + eq[6][i] = IsEqual(); + eq[6][i].in[0] <== in[i]; + eq[6][i].in[1] <== 118; and[11][i] = AND(); - and[11][i].a <== states[i][11]; - and[11][i].b <== eq[9][i].out; - states[i+1][12] <== and[11][i].out; - eq[10][i] = IsEqual(); - eq[10][i].in[0] <== in[i]; - eq[10][i].in[1] <== 107; + and[11][i].a <== states[i][6]; + and[11][i].b <== eq[6][i].out; and[12][i] = AND(); - and[12][i].a <== states[i][12]; - and[12][i].b <== eq[10][i].out; - states[i+1][13] <== and[12][i].out; - eq[11][i] = IsEqual(); - eq[11][i].in[0] <== in[i]; - eq[11][i].in[1] <== 101; + and[12][i].a <== states[i][15]; + and[12][i].b <== eq[6][i].out; + multi_or[2][i] = MultiOR(2); + multi_or[2][i].in[0] <== and[11][i].out; + multi_or[2][i].in[1] <== and[12][i].out; + states[i+1][10] <== multi_or[2][i].out; and[13][i] = AND(); - and[13][i].a <== states[i][13]; - and[13][i].b <== eq[11][i].out; - states[i+1][14] <== and[13][i].out; - eq[12][i] = IsEqual(); - eq[12][i].in[0] <== in[i]; - eq[12][i].in[1] <== 109; + and[13][i].a <== states[i][8]; + and[13][i].b <== eq[5][i].out; + states[i+1][11] <== and[13][i].out; and[14][i] = AND(); - and[14][i].a <== states[i][14]; - and[14][i].b <== eq[12][i].out; - states[i+1][15] <== and[14][i].out; - eq[13][i] = IsEqual(); - eq[13][i].in[0] <== in[i]; - eq[13][i].in[1] <== 97; + and[14][i].a <== states[i][9]; + and[14][i].b <== eq[3][i].out; + states[i+1][12] <== and[14][i].out; + eq[7][i] = IsEqual(); + eq[7][i].in[0] <== in[i]; + eq[7][i].in[1] <== 32; and[15][i] = AND(); - and[15][i].a <== states[i][15]; - and[15][i].b <== eq[13][i].out; - states[i+1][16] <== and[15][i].out; + and[15][i].a <== states[i][10]; + and[15][i].b <== eq[7][i].out; and[16][i] = AND(); - and[16][i].a <== states[i][16]; - and[16][i].b <== eq[2][i].out; - states[i+1][17] <== and[16][i].out; - eq[14][i] = IsEqual(); - eq[14][i].in[0] <== in[i]; - eq[14][i].in[1] <== 108; + and[16][i].a <== states[i][22]; + and[16][i].b <== eq[7][i].out; + multi_or[3][i] = MultiOR(2); + multi_or[3][i].in[0] <== and[15][i].out; + multi_or[3][i].in[1] <== and[16][i].out; + states[i+1][13] <== multi_or[3][i].out; and[17][i] = AND(); - and[17][i].a <== states[i][17]; - and[17][i].b <== eq[14][i].out; - states[i+1][18] <== and[17][i].out; + and[17][i].a <== states[i][10]; + and[17][i].b <== eq[1][i].out; + states[i+1][14] <== and[17][i].out; and[18][i] = AND(); - and[18][i].a <== states[i][18]; - and[18][i].b <== eq[8][i].out; - states[i+1][19] <== and[18][i].out; - eq[15][i] = IsEqual(); - eq[15][i].in[0] <== in[i]; - eq[15][i].in[1] <== 62; + and[18][i].a <== states[i][12]; + and[18][i].b <== eq[5][i].out; + states[i+1][15] <== and[18][i].out; and[19][i] = AND(); - and[19][i].a <== states[i][19]; - and[19][i].b <== eq[15][i].out; - states[i+1][20] <== and[19][i].out; + and[19][i].a <== states[i][13]; + and[19][i].b <== eq[1][i].out; + states[i+1][16] <== and[19][i].out; + and[20][i] = AND(); + and[20][i].a <== states[i][13]; + and[20][i].b <== eq[4][i].out; + and[21][i] = AND(); + and[21][i].a <== states[i][23]; + and[21][i].b <== eq[4][i].out; + multi_or[4][i] = MultiOR(2); + multi_or[4][i].in[0] <== and[20][i].out; + multi_or[4][i].in[1] <== and[21][i].out; + states[i+1][17] <== multi_or[4][i].out; + and[22][i] = AND(); + and[22][i].a <== states[i][14]; + and[22][i].b <== eq[3][i].out; + states[i+1][18] <== and[22][i].out; + and[23][i] = AND(); + and[23][i].a <== states[i][16]; + and[23][i].b <== eq[3][i].out; + states[i+1][19] <== and[23][i].out; + and[24][i] = AND(); + and[24][i].a <== states[i][17]; + and[24][i].b <== eq[1][i].out; + states[i+1][20] <== and[24][i].out; + and[25][i] = AND(); + and[25][i].a <== states[i][17]; + and[25][i].b <== eq[2][i].out; + and[26][i] = AND(); + and[26][i].a <== states[i][26]; + and[26][i].b <== eq[2][i].out; + multi_or[5][i] = MultiOR(2); + multi_or[5][i].in[0] <== and[25][i].out; + multi_or[5][i].in[1] <== and[26][i].out; + states[i+1][21] <== multi_or[5][i].out; + and[27][i] = AND(); + and[27][i].a <== states[i][18]; + and[27][i].b <== eq[5][i].out; + states[i+1][22] <== and[27][i].out; + and[28][i] = AND(); + and[28][i].a <== states[i][19]; + and[28][i].b <== eq[5][i].out; + states[i+1][23] <== and[28][i].out; + and[29][i] = AND(); + and[29][i].a <== states[i][20]; + and[29][i].b <== eq[3][i].out; + states[i+1][24] <== and[29][i].out; + and[30][i] = AND(); + and[30][i].a <== states[i][21]; + and[30][i].b <== eq[1][i].out; + states[i+1][25] <== and[30][i].out; + and[31][i] = AND(); + and[31][i].a <== states[i][24]; + and[31][i].b <== eq[5][i].out; + states[i+1][26] <== and[31][i].out; + eq[8][i] = IsEqual(); + eq[8][i].in[0] <== in[i]; + eq[8][i].in[1] <== 51; + and[32][i] = AND(); + and[32][i].a <== states[i][25]; + and[32][i].b <== eq[8][i].out; + and[33][i] = AND(); + and[33][i].a <== states[i][33]; + and[33][i].b <== eq[8][i].out; + multi_or[6][i] = MultiOR(2); + multi_or[6][i].in[0] <== and[32][i].out; + multi_or[6][i].in[1] <== and[33][i].out; + states[i+1][27] <== multi_or[6][i].out; + and[34][i] = AND(); + and[34][i].a <== states[i][25]; + and[34][i].b <== eq[3][i].out; + states[i+1][28] <== and[34][i].out; + eq[9][i] = IsEqual(); + eq[9][i].in[0] <== in[i]; + eq[9][i].in[1] <== 68; + and[35][i] = AND(); + and[35][i].a <== states[i][27]; + and[35][i].b <== eq[9][i].out; + states[i+1][29] <== and[35][i].out; + and[36][i] = AND(); + and[36][i].a <== states[i][28]; + and[36][i].b <== eq[5][i].out; + states[i+1][30] <== and[36][i].out; + and[37][i] = AND(); + and[37][i].a <== states[i][29]; + and[37][i].b <== eq[1][i].out; + states[i+1][31] <== and[37][i].out; + eq[10][i] = IsEqual(); + eq[10][i].in[0] <== in[i]; + eq[10][i].in[1] <== 34; + and[38][i] = AND(); + and[38][i].a <== states[i][29]; + and[38][i].b <== eq[10][i].out; lt[0][i] = LessEqThan(8); lt[0][i].in[0] <== 1; lt[0][i].in[1] <== in[i]; lt[1][i] = LessEqThan(8); lt[1][i].in[0] <== in[i]; - lt[1][i].in[1] <== 46; - and[20][i] = AND(); - and[20][i].a <== lt[0][i].out; - and[20][i].b <== lt[1][i].out; + lt[1][i].in[1] <== 33; + and[39][i] = AND(); + and[39][i].a <== lt[0][i].out; + and[39][i].b <== lt[1][i].out; lt[2][i] = LessEqThan(8); - lt[2][i].in[0] <== 63; + lt[2][i].in[0] <== 35; lt[2][i].in[1] <== in[i]; lt[3][i] = LessEqThan(8); lt[3][i].in[0] <== in[i]; - lt[3][i].in[1] <== 127; - and[21][i] = AND(); - and[21][i].a <== lt[2][i].out; - and[21][i].b <== lt[3][i].out; + lt[3][i].in[1] <== 121; + and[40][i] = AND(); + and[40][i].a <== lt[2][i].out; + and[40][i].b <== lt[3][i].out; + eq[11][i] = IsEqual(); + eq[11][i].in[0] <== in[i]; + eq[11][i].in[1] <== 123; + eq[12][i] = IsEqual(); + eq[12][i].in[0] <== in[i]; + eq[12][i].in[1] <== 124; + eq[13][i] = IsEqual(); + eq[13][i].in[0] <== in[i]; + eq[13][i].in[1] <== 125; + eq[14][i] = IsEqual(); + eq[14][i].in[0] <== in[i]; + eq[14][i].in[1] <== 126; + eq[15][i] = IsEqual(); + eq[15][i].in[0] <== in[i]; + eq[15][i].in[1] <== 127; + and[41][i] = AND(); + and[41][i].a <== states[i][32]; + multi_or[7][i] = MultiOR(7); + multi_or[7][i].in[0] <== and[39][i].out; + multi_or[7][i].in[1] <== and[40][i].out; + multi_or[7][i].in[2] <== eq[11][i].out; + multi_or[7][i].in[3] <== eq[12][i].out; + multi_or[7][i].in[4] <== eq[13][i].out; + multi_or[7][i].in[5] <== eq[14][i].out; + multi_or[7][i].in[6] <== eq[15][i].out; + and[41][i].b <== multi_or[7][i].out; + lt[4][i] = LessEqThan(8); + lt[4][i].in[0] <== 128; + lt[4][i].in[1] <== in[i]; + lt[5][i] = LessEqThan(8); + lt[5][i].in[0] <== in[i]; + lt[5][i].in[1] <== 191; + and[42][i] = AND(); + and[42][i].a <== lt[4][i].out; + and[42][i].b <== lt[5][i].out; + and[43][i] = AND(); + and[43][i].a <== states[i][35]; + and[43][i].b <== and[42][i].out; + lt[6][i] = LessEqThan(8); + lt[6][i].in[0] <== 35; + lt[6][i].in[1] <== in[i]; + lt[7][i] = LessEqThan(8); + lt[7][i].in[0] <== in[i]; + lt[7][i].in[1] <== 60; + and[44][i] = AND(); + and[44][i].a <== lt[6][i].out; + and[44][i].b <== lt[7][i].out; + lt[8][i] = LessEqThan(8); + lt[8][i].in[0] <== 62; + lt[8][i].in[1] <== in[i]; + lt[9][i] = LessEqThan(8); + lt[9][i].in[0] <== in[i]; + lt[9][i].in[1] <== 106; + and[45][i] = AND(); + and[45][i].a <== lt[8][i].out; + and[45][i].b <== lt[9][i].out; eq[16][i] = IsEqual(); eq[16][i].in[0] <== in[i]; - eq[16][i].in[1] <== 48; + eq[16][i].in[1] <== 108; eq[17][i] = IsEqual(); eq[17][i].in[0] <== in[i]; - eq[17][i].in[1] <== 49; + eq[17][i].in[1] <== 109; eq[18][i] = IsEqual(); eq[18][i].in[0] <== in[i]; - eq[18][i].in[1] <== 50; + eq[18][i].in[1] <== 110; eq[19][i] = IsEqual(); eq[19][i].in[0] <== in[i]; - eq[19][i].in[1] <== 52; + eq[19][i].in[1] <== 111; eq[20][i] = IsEqual(); eq[20][i].in[0] <== in[i]; - eq[20][i].in[1] <== 53; + eq[20][i].in[1] <== 112; eq[21][i] = IsEqual(); eq[21][i].in[0] <== in[i]; - eq[21][i].in[1] <== 54; + eq[21][i].in[1] <== 113; eq[22][i] = IsEqual(); eq[22][i].in[0] <== in[i]; - eq[22][i].in[1] <== 55; + eq[22][i].in[1] <== 114; eq[23][i] = IsEqual(); eq[23][i].in[0] <== in[i]; - eq[23][i].in[1] <== 56; + eq[23][i].in[1] <== 115; eq[24][i] = IsEqual(); eq[24][i].in[0] <== in[i]; - eq[24][i].in[1] <== 57; + eq[24][i].in[1] <== 116; eq[25][i] = IsEqual(); eq[25][i].in[0] <== in[i]; - eq[25][i].in[1] <== 58; + eq[25][i].in[1] <== 117; eq[26][i] = IsEqual(); eq[26][i].in[0] <== in[i]; - eq[26][i].in[1] <== 59; - and[22][i] = AND(); - and[22][i].a <== states[i][20]; - multi_or[0][i] = MultiOR(15); - multi_or[0][i].in[0] <== and[20][i].out; - multi_or[0][i].in[1] <== and[21][i].out; - multi_or[0][i].in[2] <== eq[16][i].out; - multi_or[0][i].in[3] <== eq[17][i].out; - multi_or[0][i].in[4] <== eq[18][i].out; - multi_or[0][i].in[5] <== eq[6][i].out; - multi_or[0][i].in[6] <== eq[19][i].out; - multi_or[0][i].in[7] <== eq[20][i].out; - multi_or[0][i].in[8] <== eq[21][i].out; - multi_or[0][i].in[9] <== eq[22][i].out; - multi_or[0][i].in[10] <== eq[23][i].out; - multi_or[0][i].in[11] <== eq[24][i].out; - multi_or[0][i].in[12] <== eq[25][i].out; - multi_or[0][i].in[13] <== eq[26][i].out; - multi_or[0][i].in[14] <== eq[5][i].out; - and[22][i].b <== multi_or[0][i].out; - and[23][i] = AND(); - and[23][i].a <== states[i][21]; - and[23][i].b <== multi_or[0][i].out; - lt[4][i] = LessEqThan(8); - lt[4][i].in[0] <== 128; - lt[4][i].in[1] <== in[i]; - lt[5][i] = LessEqThan(8); - lt[5][i].in[0] <== in[i]; - lt[5][i].in[1] <== 191; - and[24][i] = AND(); - and[24][i].a <== lt[4][i].out; - and[24][i].b <== lt[5][i].out; - and[25][i] = AND(); - and[25][i].a <== states[i][22]; - and[25][i].b <== and[24][i].out; - multi_or[1][i] = MultiOR(3); - multi_or[1][i].in[0] <== and[22][i].out; - multi_or[1][i].in[1] <== and[23][i].out; - multi_or[1][i].in[2] <== and[25][i].out; - states[i+1][21] <== multi_or[1][i].out; - lt[6][i] = LessEqThan(8); - lt[6][i].in[0] <== 194; - lt[6][i].in[1] <== in[i]; - lt[7][i] = LessEqThan(8); - lt[7][i].in[0] <== in[i]; - lt[7][i].in[1] <== 223; - and[26][i] = AND(); - and[26][i].a <== lt[6][i].out; - and[26][i].b <== lt[7][i].out; - and[27][i] = AND(); - and[27][i].a <== states[i][20]; - and[27][i].b <== and[26][i].out; - and[28][i] = AND(); - and[28][i].a <== states[i][21]; - and[28][i].b <== and[26][i].out; - lt[8][i] = LessEqThan(8); - lt[8][i].in[0] <== 160; - lt[8][i].in[1] <== in[i]; - lt[9][i] = LessEqThan(8); - lt[9][i].in[0] <== in[i]; - lt[9][i].in[1] <== 191; - and[29][i] = AND(); - and[29][i].a <== lt[8][i].out; - and[29][i].b <== lt[9][i].out; - and[30][i] = AND(); - and[30][i].a <== states[i][23]; - and[30][i].b <== and[29][i].out; - and[31][i] = AND(); - and[31][i].a <== states[i][24]; - and[31][i].b <== and[24][i].out; - lt[10][i] = LessEqThan(8); - lt[10][i].in[0] <== 128; - lt[10][i].in[1] <== in[i]; - lt[11][i] = LessEqThan(8); - lt[11][i].in[0] <== in[i]; - lt[11][i].in[1] <== 159; - and[32][i] = AND(); - and[32][i].a <== lt[10][i].out; - and[32][i].b <== lt[11][i].out; - and[33][i] = AND(); - and[33][i].a <== states[i][25]; - and[33][i].b <== and[32][i].out; - multi_or[2][i] = MultiOR(5); - multi_or[2][i].in[0] <== and[27][i].out; - multi_or[2][i].in[1] <== and[28][i].out; - multi_or[2][i].in[2] <== and[30][i].out; - multi_or[2][i].in[3] <== and[31][i].out; - multi_or[2][i].in[4] <== and[33][i].out; - states[i+1][22] <== multi_or[2][i].out; + eq[26][i].in[1] <== 119; eq[27][i] = IsEqual(); eq[27][i].in[0] <== in[i]; - eq[27][i].in[1] <== 224; - and[34][i] = AND(); - and[34][i].a <== states[i][20]; - and[34][i].b <== eq[27][i].out; - and[35][i] = AND(); - and[35][i].a <== states[i][21]; - and[35][i].b <== eq[27][i].out; - multi_or[3][i] = MultiOR(2); - multi_or[3][i].in[0] <== and[34][i].out; - multi_or[3][i].in[1] <== and[35][i].out; - states[i+1][23] <== multi_or[3][i].out; + eq[27][i].in[1] <== 120; eq[28][i] = IsEqual(); eq[28][i].in[0] <== in[i]; - eq[28][i].in[1] <== 225; + eq[28][i].in[1] <== 121; + and[46][i] = AND(); + and[46][i].a <== states[i][42]; + multi_or[8][i] = MultiOR(22); + multi_or[8][i].in[0] <== and[39][i].out; + multi_or[8][i].in[1] <== and[44][i].out; + multi_or[8][i].in[2] <== and[45][i].out; + multi_or[8][i].in[3] <== eq[16][i].out; + multi_or[8][i].in[4] <== eq[17][i].out; + multi_or[8][i].in[5] <== eq[18][i].out; + multi_or[8][i].in[6] <== eq[19][i].out; + multi_or[8][i].in[7] <== eq[20][i].out; + multi_or[8][i].in[8] <== eq[21][i].out; + multi_or[8][i].in[9] <== eq[22][i].out; + multi_or[8][i].in[10] <== eq[23][i].out; + multi_or[8][i].in[11] <== eq[24][i].out; + multi_or[8][i].in[12] <== eq[25][i].out; + multi_or[8][i].in[13] <== eq[6][i].out; + multi_or[8][i].in[14] <== eq[26][i].out; + multi_or[8][i].in[15] <== eq[27][i].out; + multi_or[8][i].in[16] <== eq[28][i].out; + multi_or[8][i].in[17] <== eq[11][i].out; + multi_or[8][i].in[18] <== eq[12][i].out; + multi_or[8][i].in[19] <== eq[13][i].out; + multi_or[8][i].in[20] <== eq[14][i].out; + multi_or[8][i].in[21] <== eq[15][i].out; + and[46][i].b <== multi_or[8][i].out; + and[47][i] = AND(); + and[47][i].a <== states[i][43]; + and[47][i].b <== eq[10][i].out; + lt[10][i] = LessEqThan(8); + lt[10][i].in[0] <== 14; + lt[10][i].in[1] <== in[i]; + lt[11][i] = LessEqThan(8); + lt[11][i].in[0] <== in[i]; + lt[11][i].in[1] <== 33; + and[48][i] = AND(); + and[48][i].a <== lt[10][i].out; + and[48][i].b <== lt[11][i].out; eq[29][i] = IsEqual(); eq[29][i].in[0] <== in[i]; - eq[29][i].in[1] <== 226; + eq[29][i].in[1] <== 1; eq[30][i] = IsEqual(); eq[30][i].in[0] <== in[i]; - eq[30][i].in[1] <== 227; + eq[30][i].in[1] <== 2; eq[31][i] = IsEqual(); eq[31][i].in[0] <== in[i]; - eq[31][i].in[1] <== 228; + eq[31][i].in[1] <== 3; eq[32][i] = IsEqual(); eq[32][i].in[0] <== in[i]; - eq[32][i].in[1] <== 229; + eq[32][i].in[1] <== 4; eq[33][i] = IsEqual(); eq[33][i].in[0] <== in[i]; - eq[33][i].in[1] <== 230; + eq[33][i].in[1] <== 5; eq[34][i] = IsEqual(); eq[34][i].in[0] <== in[i]; - eq[34][i].in[1] <== 231; + eq[34][i].in[1] <== 6; eq[35][i] = IsEqual(); eq[35][i].in[0] <== in[i]; - eq[35][i].in[1] <== 232; + eq[35][i].in[1] <== 7; eq[36][i] = IsEqual(); eq[36][i].in[0] <== in[i]; - eq[36][i].in[1] <== 233; + eq[36][i].in[1] <== 8; eq[37][i] = IsEqual(); eq[37][i].in[0] <== in[i]; - eq[37][i].in[1] <== 234; + eq[37][i].in[1] <== 9; eq[38][i] = IsEqual(); eq[38][i].in[0] <== in[i]; - eq[38][i].in[1] <== 235; + eq[38][i].in[1] <== 11; eq[39][i] = IsEqual(); eq[39][i].in[0] <== in[i]; - eq[39][i].in[1] <== 236; - eq[40][i] = IsEqual(); - eq[40][i].in[0] <== in[i]; - eq[40][i].in[1] <== 238; - eq[41][i] = IsEqual(); - eq[41][i].in[0] <== in[i]; - eq[41][i].in[1] <== 239; - and[36][i] = AND(); - and[36][i].a <== states[i][20]; - multi_or[4][i] = MultiOR(14); - multi_or[4][i].in[0] <== eq[28][i].out; - multi_or[4][i].in[1] <== eq[29][i].out; - multi_or[4][i].in[2] <== eq[30][i].out; - multi_or[4][i].in[3] <== eq[31][i].out; - multi_or[4][i].in[4] <== eq[32][i].out; - multi_or[4][i].in[5] <== eq[33][i].out; - multi_or[4][i].in[6] <== eq[34][i].out; - multi_or[4][i].in[7] <== eq[35][i].out; - multi_or[4][i].in[8] <== eq[36][i].out; - multi_or[4][i].in[9] <== eq[37][i].out; - multi_or[4][i].in[10] <== eq[38][i].out; - multi_or[4][i].in[11] <== eq[39][i].out; - multi_or[4][i].in[12] <== eq[40][i].out; - multi_or[4][i].in[13] <== eq[41][i].out; - and[36][i].b <== multi_or[4][i].out; - and[37][i] = AND(); - and[37][i].a <== states[i][21]; - and[37][i].b <== multi_or[4][i].out; + eq[39][i].in[1] <== 12; + and[49][i] = AND(); + and[49][i].a <== states[i][44]; + multi_or[9][i] = MultiOR(19); + multi_or[9][i].in[0] <== and[48][i].out; + multi_or[9][i].in[1] <== and[40][i].out; + multi_or[9][i].in[2] <== eq[29][i].out; + multi_or[9][i].in[3] <== eq[30][i].out; + multi_or[9][i].in[4] <== eq[31][i].out; + multi_or[9][i].in[5] <== eq[32][i].out; + multi_or[9][i].in[6] <== eq[33][i].out; + multi_or[9][i].in[7] <== eq[34][i].out; + multi_or[9][i].in[8] <== eq[35][i].out; + multi_or[9][i].in[9] <== eq[36][i].out; + multi_or[9][i].in[10] <== eq[37][i].out; + multi_or[9][i].in[11] <== eq[5][i].out; + multi_or[9][i].in[12] <== eq[38][i].out; + multi_or[9][i].in[13] <== eq[39][i].out; + multi_or[9][i].in[14] <== eq[11][i].out; + multi_or[9][i].in[15] <== eq[12][i].out; + multi_or[9][i].in[16] <== eq[13][i].out; + multi_or[9][i].in[17] <== eq[14][i].out; + multi_or[9][i].in[18] <== eq[15][i].out; + and[49][i].b <== multi_or[9][i].out; lt[12][i] = LessEqThan(8); - lt[12][i].in[0] <== 144; + lt[12][i].in[0] <== 62; lt[12][i].in[1] <== in[i]; lt[13][i] = LessEqThan(8); lt[13][i].in[0] <== in[i]; - lt[13][i].in[1] <== 191; - and[38][i] = AND(); - and[38][i].a <== lt[12][i].out; - and[38][i].b <== lt[13][i].out; - and[39][i] = AND(); - and[39][i].a <== states[i][26]; - and[39][i].b <== and[38][i].out; - and[40][i] = AND(); - and[40][i].a <== states[i][27]; - and[40][i].b <== and[24][i].out; + lt[13][i].in[1] <== 100; + and[50][i] = AND(); + and[50][i].a <== lt[12][i].out; + and[50][i].b <== lt[13][i].out; + lt[14][i] = LessEqThan(8); + lt[14][i].in[0] <== 102; + lt[14][i].in[1] <== in[i]; + lt[15][i] = LessEqThan(8); + lt[15][i].in[0] <== in[i]; + lt[15][i].in[1] <== 121; + and[51][i] = AND(); + and[51][i].a <== lt[14][i].out; + and[51][i].b <== lt[15][i].out; + and[52][i] = AND(); + and[52][i].a <== states[i][45]; + multi_or[10][i] = MultiOR(9); + multi_or[10][i].in[0] <== and[39][i].out; + multi_or[10][i].in[1] <== and[44][i].out; + multi_or[10][i].in[2] <== and[50][i].out; + multi_or[10][i].in[3] <== and[51][i].out; + multi_or[10][i].in[4] <== eq[11][i].out; + multi_or[10][i].in[5] <== eq[12][i].out; + multi_or[10][i].in[6] <== eq[13][i].out; + multi_or[10][i].in[7] <== eq[14][i].out; + multi_or[10][i].in[8] <== eq[15][i].out; + and[52][i].b <== multi_or[10][i].out; + lt[16][i] = LessEqThan(8); + lt[16][i].in[0] <== 11; + lt[16][i].in[1] <== in[i]; + lt[17][i] = LessEqThan(8); + lt[17][i].in[0] <== in[i]; + lt[17][i].in[1] <== 33; + and[53][i] = AND(); + and[53][i].a <== lt[16][i].out; + and[53][i].b <== lt[17][i].out; + and[54][i] = AND(); + and[54][i].a <== states[i][46]; + multi_or[11][i] = MultiOR(16); + multi_or[11][i].in[0] <== and[53][i].out; + multi_or[11][i].in[1] <== and[40][i].out; + multi_or[11][i].in[2] <== eq[29][i].out; + multi_or[11][i].in[3] <== eq[30][i].out; + multi_or[11][i].in[4] <== eq[31][i].out; + multi_or[11][i].in[5] <== eq[32][i].out; + multi_or[11][i].in[6] <== eq[33][i].out; + multi_or[11][i].in[7] <== eq[34][i].out; + multi_or[11][i].in[8] <== eq[35][i].out; + multi_or[11][i].in[9] <== eq[36][i].out; + multi_or[11][i].in[10] <== eq[37][i].out; + multi_or[11][i].in[11] <== eq[11][i].out; + multi_or[11][i].in[12] <== eq[12][i].out; + multi_or[11][i].in[13] <== eq[13][i].out; + multi_or[11][i].in[14] <== eq[14][i].out; + multi_or[11][i].in[15] <== eq[15][i].out; + and[54][i].b <== multi_or[11][i].out; + and[55][i] = AND(); + and[55][i].a <== states[i][47]; + and[55][i].b <== multi_or[9][i].out; + lt[18][i] = LessEqThan(8); + lt[18][i].in[0] <== 62; + lt[18][i].in[1] <== in[i]; + lt[19][i] = LessEqThan(8); + lt[19][i].in[0] <== in[i]; + lt[19][i].in[1] <== 108; + and[56][i] = AND(); + and[56][i].a <== lt[18][i].out; + and[56][i].b <== lt[19][i].out; + and[57][i] = AND(); + and[57][i].a <== states[i][48]; + multi_or[12][i] = MultiOR(20); + multi_or[12][i].in[0] <== and[39][i].out; + multi_or[12][i].in[1] <== and[44][i].out; + multi_or[12][i].in[2] <== and[56][i].out; + multi_or[12][i].in[3] <== eq[18][i].out; + multi_or[12][i].in[4] <== eq[19][i].out; + multi_or[12][i].in[5] <== eq[20][i].out; + multi_or[12][i].in[6] <== eq[21][i].out; + multi_or[12][i].in[7] <== eq[22][i].out; + multi_or[12][i].in[8] <== eq[23][i].out; + multi_or[12][i].in[9] <== eq[24][i].out; + multi_or[12][i].in[10] <== eq[25][i].out; + multi_or[12][i].in[11] <== eq[6][i].out; + multi_or[12][i].in[12] <== eq[26][i].out; + multi_or[12][i].in[13] <== eq[27][i].out; + multi_or[12][i].in[14] <== eq[28][i].out; + multi_or[12][i].in[15] <== eq[11][i].out; + multi_or[12][i].in[16] <== eq[12][i].out; + multi_or[12][i].in[17] <== eq[13][i].out; + multi_or[12][i].in[18] <== eq[14][i].out; + multi_or[12][i].in[19] <== eq[15][i].out; + and[57][i].b <== multi_or[12][i].out; + lt[20][i] = LessEqThan(8); + lt[20][i].in[0] <== 35; + lt[20][i].in[1] <== in[i]; + lt[21][i] = LessEqThan(8); + lt[21][i].in[0] <== in[i]; + lt[21][i].in[1] <== 106; + and[58][i] = AND(); + and[58][i].a <== lt[20][i].out; + and[58][i].b <== lt[21][i].out; + and[59][i] = AND(); + and[59][i].a <== states[i][49]; + multi_or[13][i] = MultiOR(21); + multi_or[13][i].in[0] <== and[39][i].out; + multi_or[13][i].in[1] <== and[58][i].out; + multi_or[13][i].in[2] <== eq[16][i].out; + multi_or[13][i].in[3] <== eq[17][i].out; + multi_or[13][i].in[4] <== eq[18][i].out; + multi_or[13][i].in[5] <== eq[19][i].out; + multi_or[13][i].in[6] <== eq[20][i].out; + multi_or[13][i].in[7] <== eq[21][i].out; + multi_or[13][i].in[8] <== eq[22][i].out; + multi_or[13][i].in[9] <== eq[23][i].out; + multi_or[13][i].in[10] <== eq[24][i].out; + multi_or[13][i].in[11] <== eq[25][i].out; + multi_or[13][i].in[12] <== eq[6][i].out; + multi_or[13][i].in[13] <== eq[26][i].out; + multi_or[13][i].in[14] <== eq[27][i].out; + multi_or[13][i].in[15] <== eq[28][i].out; + multi_or[13][i].in[16] <== eq[11][i].out; + multi_or[13][i].in[17] <== eq[12][i].out; + multi_or[13][i].in[18] <== eq[13][i].out; + multi_or[13][i].in[19] <== eq[14][i].out; + multi_or[13][i].in[20] <== eq[15][i].out; + and[59][i].b <== multi_or[13][i].out; + and[60][i] = AND(); + and[60][i].a <== states[i][50]; + and[60][i].b <== multi_or[11][i].out; + and[61][i] = AND(); + and[61][i].a <== states[i][51]; + and[61][i].b <== multi_or[9][i].out; + lt[22][i] = LessEqThan(8); + lt[22][i].in[0] <== 62; + lt[22][i].in[1] <== in[i]; + lt[23][i] = LessEqThan(8); + lt[23][i].in[0] <== in[i]; + lt[23][i].in[1] <== 96; + and[62][i] = AND(); + and[62][i].a <== lt[22][i].out; + and[62][i].b <== lt[23][i].out; + lt[24][i] = LessEqThan(8); + lt[24][i].in[0] <== 98; + lt[24][i].in[1] <== in[i]; + lt[25][i] = LessEqThan(8); + lt[25][i].in[0] <== in[i]; + lt[25][i].in[1] <== 121; + and[63][i] = AND(); + and[63][i].a <== lt[24][i].out; + and[63][i].b <== lt[25][i].out; + and[64][i] = AND(); + and[64][i].a <== states[i][52]; + multi_or[14][i] = MultiOR(9); + multi_or[14][i].in[0] <== and[39][i].out; + multi_or[14][i].in[1] <== and[44][i].out; + multi_or[14][i].in[2] <== and[62][i].out; + multi_or[14][i].in[3] <== and[63][i].out; + multi_or[14][i].in[4] <== eq[11][i].out; + multi_or[14][i].in[5] <== eq[12][i].out; + multi_or[14][i].in[6] <== eq[13][i].out; + multi_or[14][i].in[7] <== eq[14][i].out; + multi_or[14][i].in[8] <== eq[15][i].out; + and[64][i].b <== multi_or[14][i].out; + lt[26][i] = LessEqThan(8); + lt[26][i].in[0] <== 35; + lt[26][i].in[1] <== in[i]; + lt[27][i] = LessEqThan(8); + lt[27][i].in[0] <== in[i]; + lt[27][i].in[1] <== 100; + and[65][i] = AND(); + and[65][i].a <== lt[26][i].out; + and[65][i].b <== lt[27][i].out; + and[66][i] = AND(); + and[66][i].a <== states[i][53]; + multi_or[15][i] = MultiOR(8); + multi_or[15][i].in[0] <== and[39][i].out; + multi_or[15][i].in[1] <== and[65][i].out; + multi_or[15][i].in[2] <== and[51][i].out; + multi_or[15][i].in[3] <== eq[11][i].out; + multi_or[15][i].in[4] <== eq[12][i].out; + multi_or[15][i].in[5] <== eq[13][i].out; + multi_or[15][i].in[6] <== eq[14][i].out; + multi_or[15][i].in[7] <== eq[15][i].out; + and[66][i].b <== multi_or[15][i].out; + and[67][i] = AND(); + and[67][i].a <== states[i][54]; + and[67][i].b <== multi_or[11][i].out; + and[68][i] = AND(); + and[68][i].a <== states[i][55]; + and[68][i].b <== multi_or[9][i].out; + lt[28][i] = LessEqThan(8); + lt[28][i].in[0] <== 62; + lt[28][i].in[1] <== in[i]; + lt[29][i] = LessEqThan(8); + lt[29][i].in[0] <== in[i]; + lt[29][i].in[1] <== 104; + and[69][i] = AND(); + and[69][i].a <== lt[28][i].out; + and[69][i].b <== lt[29][i].out; + eq[40][i] = IsEqual(); + eq[40][i].in[0] <== in[i]; + eq[40][i].in[1] <== 106; + eq[41][i] = IsEqual(); + eq[41][i].in[0] <== in[i]; + eq[41][i].in[1] <== 107; + and[70][i] = AND(); + and[70][i].a <== states[i][56]; + multi_or[16][i] = MultiOR(24); + multi_or[16][i].in[0] <== and[39][i].out; + multi_or[16][i].in[1] <== and[44][i].out; + multi_or[16][i].in[2] <== and[69][i].out; + multi_or[16][i].in[3] <== eq[40][i].out; + multi_or[16][i].in[4] <== eq[41][i].out; + multi_or[16][i].in[5] <== eq[16][i].out; + multi_or[16][i].in[6] <== eq[17][i].out; + multi_or[16][i].in[7] <== eq[18][i].out; + multi_or[16][i].in[8] <== eq[19][i].out; + multi_or[16][i].in[9] <== eq[20][i].out; + multi_or[16][i].in[10] <== eq[21][i].out; + multi_or[16][i].in[11] <== eq[22][i].out; + multi_or[16][i].in[12] <== eq[23][i].out; + multi_or[16][i].in[13] <== eq[24][i].out; + multi_or[16][i].in[14] <== eq[25][i].out; + multi_or[16][i].in[15] <== eq[6][i].out; + multi_or[16][i].in[16] <== eq[26][i].out; + multi_or[16][i].in[17] <== eq[27][i].out; + multi_or[16][i].in[18] <== eq[28][i].out; + multi_or[16][i].in[19] <== eq[11][i].out; + multi_or[16][i].in[20] <== eq[12][i].out; + multi_or[16][i].in[21] <== eq[13][i].out; + multi_or[16][i].in[22] <== eq[14][i].out; + multi_or[16][i].in[23] <== eq[15][i].out; + and[70][i].b <== multi_or[16][i].out; + lt[30][i] = LessEqThan(8); + lt[30][i].in[0] <== 35; + lt[30][i].in[1] <== in[i]; + lt[31][i] = LessEqThan(8); + lt[31][i].in[0] <== in[i]; + lt[31][i].in[1] <== 108; + and[71][i] = AND(); + and[71][i].a <== lt[30][i].out; + and[71][i].b <== lt[31][i].out; + and[72][i] = AND(); + and[72][i].a <== states[i][57]; + multi_or[17][i] = MultiOR(19); + multi_or[17][i].in[0] <== and[39][i].out; + multi_or[17][i].in[1] <== and[71][i].out; + multi_or[17][i].in[2] <== eq[18][i].out; + multi_or[17][i].in[3] <== eq[19][i].out; + multi_or[17][i].in[4] <== eq[20][i].out; + multi_or[17][i].in[5] <== eq[21][i].out; + multi_or[17][i].in[6] <== eq[22][i].out; + multi_or[17][i].in[7] <== eq[23][i].out; + multi_or[17][i].in[8] <== eq[24][i].out; + multi_or[17][i].in[9] <== eq[25][i].out; + multi_or[17][i].in[10] <== eq[6][i].out; + multi_or[17][i].in[11] <== eq[26][i].out; + multi_or[17][i].in[12] <== eq[27][i].out; + multi_or[17][i].in[13] <== eq[28][i].out; + multi_or[17][i].in[14] <== eq[11][i].out; + multi_or[17][i].in[15] <== eq[12][i].out; + multi_or[17][i].in[16] <== eq[13][i].out; + multi_or[17][i].in[17] <== eq[14][i].out; + multi_or[17][i].in[18] <== eq[15][i].out; + and[72][i].b <== multi_or[17][i].out; + and[73][i] = AND(); + and[73][i].a <== states[i][58]; + and[73][i].b <== multi_or[11][i].out; + and[74][i] = AND(); + and[74][i].a <== states[i][59]; + and[74][i].b <== multi_or[9][i].out; + lt[32][i] = LessEqThan(8); + lt[32][i].in[0] <== 62; + lt[32][i].in[1] <== in[i]; + lt[33][i] = LessEqThan(8); + lt[33][i].in[0] <== in[i]; + lt[33][i].in[1] <== 107; + and[75][i] = AND(); + and[75][i].a <== lt[32][i].out; + and[75][i].b <== lt[33][i].out; + and[76][i] = AND(); + and[76][i].a <== states[i][60]; + multi_or[18][i] = MultiOR(21); + multi_or[18][i].in[0] <== and[39][i].out; + multi_or[18][i].in[1] <== and[44][i].out; + multi_or[18][i].in[2] <== and[75][i].out; + multi_or[18][i].in[3] <== eq[17][i].out; + multi_or[18][i].in[4] <== eq[18][i].out; + multi_or[18][i].in[5] <== eq[19][i].out; + multi_or[18][i].in[6] <== eq[20][i].out; + multi_or[18][i].in[7] <== eq[21][i].out; + multi_or[18][i].in[8] <== eq[22][i].out; + multi_or[18][i].in[9] <== eq[23][i].out; + multi_or[18][i].in[10] <== eq[24][i].out; + multi_or[18][i].in[11] <== eq[25][i].out; + multi_or[18][i].in[12] <== eq[6][i].out; + multi_or[18][i].in[13] <== eq[26][i].out; + multi_or[18][i].in[14] <== eq[27][i].out; + multi_or[18][i].in[15] <== eq[28][i].out; + multi_or[18][i].in[16] <== eq[11][i].out; + multi_or[18][i].in[17] <== eq[12][i].out; + multi_or[18][i].in[18] <== eq[13][i].out; + multi_or[18][i].in[19] <== eq[14][i].out; + multi_or[18][i].in[20] <== eq[15][i].out; + and[76][i].b <== multi_or[18][i].out; + lt[34][i] = LessEqThan(8); + lt[34][i].in[0] <== 35; + lt[34][i].in[1] <== in[i]; + lt[35][i] = LessEqThan(8); + lt[35][i].in[0] <== in[i]; + lt[35][i].in[1] <== 96; + and[77][i] = AND(); + and[77][i].a <== lt[34][i].out; + and[77][i].b <== lt[35][i].out; + and[78][i] = AND(); + and[78][i].a <== states[i][61]; + multi_or[19][i] = MultiOR(8); + multi_or[19][i].in[0] <== and[39][i].out; + multi_or[19][i].in[1] <== and[77][i].out; + multi_or[19][i].in[2] <== and[63][i].out; + multi_or[19][i].in[3] <== eq[11][i].out; + multi_or[19][i].in[4] <== eq[12][i].out; + multi_or[19][i].in[5] <== eq[13][i].out; + multi_or[19][i].in[6] <== eq[14][i].out; + multi_or[19][i].in[7] <== eq[15][i].out; + and[78][i].b <== multi_or[19][i].out; + and[79][i] = AND(); + and[79][i].a <== states[i][62]; + and[79][i].b <== multi_or[11][i].out; + and[80][i] = AND(); + and[80][i].a <== states[i][63]; + and[80][i].b <== multi_or[9][i].out; + lt[36][i] = LessEqThan(8); + lt[36][i].in[0] <== 35; + lt[36][i].in[1] <== in[i]; + lt[37][i] = LessEqThan(8); + lt[37][i].in[0] <== in[i]; + lt[37][i].in[1] <== 104; + and[81][i] = AND(); + and[81][i].a <== lt[36][i].out; + and[81][i].b <== lt[37][i].out; + and[82][i] = AND(); + and[82][i].a <== states[i][65]; + multi_or[20][i] = MultiOR(23); + multi_or[20][i].in[0] <== and[39][i].out; + multi_or[20][i].in[1] <== and[81][i].out; + multi_or[20][i].in[2] <== eq[40][i].out; + multi_or[20][i].in[3] <== eq[41][i].out; + multi_or[20][i].in[4] <== eq[16][i].out; + multi_or[20][i].in[5] <== eq[17][i].out; + multi_or[20][i].in[6] <== eq[18][i].out; + multi_or[20][i].in[7] <== eq[19][i].out; + multi_or[20][i].in[8] <== eq[20][i].out; + multi_or[20][i].in[9] <== eq[21][i].out; + multi_or[20][i].in[10] <== eq[22][i].out; + multi_or[20][i].in[11] <== eq[23][i].out; + multi_or[20][i].in[12] <== eq[24][i].out; + multi_or[20][i].in[13] <== eq[25][i].out; + multi_or[20][i].in[14] <== eq[6][i].out; + multi_or[20][i].in[15] <== eq[26][i].out; + multi_or[20][i].in[16] <== eq[27][i].out; + multi_or[20][i].in[17] <== eq[28][i].out; + multi_or[20][i].in[18] <== eq[11][i].out; + multi_or[20][i].in[19] <== eq[12][i].out; + multi_or[20][i].in[20] <== eq[13][i].out; + multi_or[20][i].in[21] <== eq[14][i].out; + multi_or[20][i].in[22] <== eq[15][i].out; + and[82][i].b <== multi_or[20][i].out; + and[83][i] = AND(); + and[83][i].a <== states[i][66]; + and[83][i].b <== multi_or[11][i].out; + lt[38][i] = LessEqThan(8); + lt[38][i].in[0] <== 35; + lt[38][i].in[1] <== in[i]; + lt[39][i] = LessEqThan(8); + lt[39][i].in[0] <== in[i]; + lt[39][i].in[1] <== 107; + and[84][i] = AND(); + and[84][i].a <== lt[38][i].out; + and[84][i].b <== lt[39][i].out; + and[85][i] = AND(); + and[85][i].a <== states[i][75]; + multi_or[21][i] = MultiOR(20); + multi_or[21][i].in[0] <== and[39][i].out; + multi_or[21][i].in[1] <== and[84][i].out; + multi_or[21][i].in[2] <== eq[17][i].out; + multi_or[21][i].in[3] <== eq[18][i].out; + multi_or[21][i].in[4] <== eq[19][i].out; + multi_or[21][i].in[5] <== eq[20][i].out; + multi_or[21][i].in[6] <== eq[21][i].out; + multi_or[21][i].in[7] <== eq[22][i].out; + multi_or[21][i].in[8] <== eq[23][i].out; + multi_or[21][i].in[9] <== eq[24][i].out; + multi_or[21][i].in[10] <== eq[25][i].out; + multi_or[21][i].in[11] <== eq[6][i].out; + multi_or[21][i].in[12] <== eq[26][i].out; + multi_or[21][i].in[13] <== eq[27][i].out; + multi_or[21][i].in[14] <== eq[28][i].out; + multi_or[21][i].in[15] <== eq[11][i].out; + multi_or[21][i].in[16] <== eq[12][i].out; + multi_or[21][i].in[17] <== eq[13][i].out; + multi_or[21][i].in[18] <== eq[14][i].out; + multi_or[21][i].in[19] <== eq[15][i].out; + and[85][i].b <== multi_or[21][i].out; + multi_or[22][i] = MultiOR(28); + multi_or[22][i].in[0] <== and[38][i].out; + multi_or[22][i].in[1] <== and[41][i].out; + multi_or[22][i].in[2] <== and[43][i].out; + multi_or[22][i].in[3] <== and[46][i].out; + multi_or[22][i].in[4] <== and[47][i].out; + multi_or[22][i].in[5] <== and[49][i].out; + multi_or[22][i].in[6] <== and[52][i].out; + multi_or[22][i].in[7] <== and[54][i].out; + multi_or[22][i].in[8] <== and[55][i].out; + multi_or[22][i].in[9] <== and[57][i].out; + multi_or[22][i].in[10] <== and[59][i].out; + multi_or[22][i].in[11] <== and[60][i].out; + multi_or[22][i].in[12] <== and[61][i].out; + multi_or[22][i].in[13] <== and[64][i].out; + multi_or[22][i].in[14] <== and[66][i].out; + multi_or[22][i].in[15] <== and[67][i].out; + multi_or[22][i].in[16] <== and[68][i].out; + multi_or[22][i].in[17] <== and[70][i].out; + multi_or[22][i].in[18] <== and[72][i].out; + multi_or[22][i].in[19] <== and[73][i].out; + multi_or[22][i].in[20] <== and[74][i].out; + multi_or[22][i].in[21] <== and[76][i].out; + multi_or[22][i].in[22] <== and[78][i].out; + multi_or[22][i].in[23] <== and[79][i].out; + multi_or[22][i].in[24] <== and[80][i].out; + multi_or[22][i].in[25] <== and[82][i].out; + multi_or[22][i].in[26] <== and[83][i].out; + multi_or[22][i].in[27] <== and[85][i].out; + states[i+1][32] <== multi_or[22][i].out; + and[86][i] = AND(); + and[86][i].a <== states[i][30]; + and[86][i].b <== eq[1][i].out; + states[i+1][33] <== and[86][i].out; + and[87][i] = AND(); + and[87][i].a <== states[i][31]; + and[87][i].b <== eq[3][i].out; + states[i+1][34] <== and[87][i].out; + lt[40][i] = LessEqThan(8); + lt[40][i].in[0] <== 194; + lt[40][i].in[1] <== in[i]; + lt[41][i] = LessEqThan(8); + lt[41][i].in[0] <== in[i]; + lt[41][i].in[1] <== 223; + and[88][i] = AND(); + and[88][i].a <== lt[40][i].out; + and[88][i].b <== lt[41][i].out; + and[89][i] = AND(); + and[89][i].a <== states[i][32]; + and[89][i].b <== and[88][i].out; + lt[42][i] = LessEqThan(8); + lt[42][i].in[0] <== 160; + lt[42][i].in[1] <== in[i]; + lt[43][i] = LessEqThan(8); + lt[43][i].in[0] <== in[i]; + lt[43][i].in[1] <== 191; + and[90][i] = AND(); + and[90][i].a <== lt[42][i].out; + and[90][i].b <== lt[43][i].out; + and[91][i] = AND(); + and[91][i].a <== states[i][36]; + and[91][i].b <== and[90][i].out; + and[92][i] = AND(); + and[92][i].a <== states[i][37]; + and[92][i].b <== and[42][i].out; + lt[44][i] = LessEqThan(8); + lt[44][i].in[0] <== 128; + lt[44][i].in[1] <== in[i]; + lt[45][i] = LessEqThan(8); + lt[45][i].in[0] <== in[i]; + lt[45][i].in[1] <== 159; + and[93][i] = AND(); + and[93][i].a <== lt[44][i].out; + and[93][i].b <== lt[45][i].out; + and[94][i] = AND(); + and[94][i].a <== states[i][38]; + and[94][i].b <== and[93][i].out; + and[95][i] = AND(); + and[95][i].a <== states[i][42]; + and[95][i].b <== and[88][i].out; + and[96][i] = AND(); + and[96][i].a <== states[i][44]; + and[96][i].b <== and[88][i].out; + and[97][i] = AND(); + and[97][i].a <== states[i][45]; + and[97][i].b <== and[88][i].out; + and[98][i] = AND(); + and[98][i].a <== states[i][46]; + and[98][i].b <== and[88][i].out; + and[99][i] = AND(); + and[99][i].a <== states[i][47]; + and[99][i].b <== and[88][i].out; + and[100][i] = AND(); + and[100][i].a <== states[i][48]; + and[100][i].b <== and[88][i].out; + and[101][i] = AND(); + and[101][i].a <== states[i][49]; + and[101][i].b <== and[88][i].out; + and[102][i] = AND(); + and[102][i].a <== states[i][50]; + and[102][i].b <== and[88][i].out; + and[103][i] = AND(); + and[103][i].a <== states[i][51]; + and[103][i].b <== and[88][i].out; + and[104][i] = AND(); + and[104][i].a <== states[i][52]; + and[104][i].b <== and[88][i].out; + and[105][i] = AND(); + and[105][i].a <== states[i][53]; + and[105][i].b <== and[88][i].out; + and[106][i] = AND(); + and[106][i].a <== states[i][54]; + and[106][i].b <== and[88][i].out; + and[107][i] = AND(); + and[107][i].a <== states[i][55]; + and[107][i].b <== and[88][i].out; + and[108][i] = AND(); + and[108][i].a <== states[i][56]; + and[108][i].b <== and[88][i].out; + and[109][i] = AND(); + and[109][i].a <== states[i][57]; + and[109][i].b <== and[88][i].out; + and[110][i] = AND(); + and[110][i].a <== states[i][58]; + and[110][i].b <== and[88][i].out; + and[111][i] = AND(); + and[111][i].a <== states[i][59]; + and[111][i].b <== and[88][i].out; + and[112][i] = AND(); + and[112][i].a <== states[i][60]; + and[112][i].b <== and[88][i].out; + and[113][i] = AND(); + and[113][i].a <== states[i][61]; + and[113][i].b <== and[88][i].out; + and[114][i] = AND(); + and[114][i].a <== states[i][62]; + and[114][i].b <== and[88][i].out; + and[115][i] = AND(); + and[115][i].a <== states[i][63]; + and[115][i].b <== and[88][i].out; + and[116][i] = AND(); + and[116][i].a <== states[i][65]; + and[116][i].b <== and[88][i].out; + and[117][i] = AND(); + and[117][i].a <== states[i][66]; + and[117][i].b <== and[88][i].out; + and[118][i] = AND(); + and[118][i].a <== states[i][75]; + and[118][i].b <== and[88][i].out; + multi_or[23][i] = MultiOR(28); + multi_or[23][i].in[0] <== and[89][i].out; + multi_or[23][i].in[1] <== and[91][i].out; + multi_or[23][i].in[2] <== and[92][i].out; + multi_or[23][i].in[3] <== and[94][i].out; + multi_or[23][i].in[4] <== and[95][i].out; + multi_or[23][i].in[5] <== and[96][i].out; + multi_or[23][i].in[6] <== and[97][i].out; + multi_or[23][i].in[7] <== and[98][i].out; + multi_or[23][i].in[8] <== and[99][i].out; + multi_or[23][i].in[9] <== and[100][i].out; + multi_or[23][i].in[10] <== and[101][i].out; + multi_or[23][i].in[11] <== and[102][i].out; + multi_or[23][i].in[12] <== and[103][i].out; + multi_or[23][i].in[13] <== and[104][i].out; + multi_or[23][i].in[14] <== and[105][i].out; + multi_or[23][i].in[15] <== and[106][i].out; + multi_or[23][i].in[16] <== and[107][i].out; + multi_or[23][i].in[17] <== and[108][i].out; + multi_or[23][i].in[18] <== and[109][i].out; + multi_or[23][i].in[19] <== and[110][i].out; + multi_or[23][i].in[20] <== and[111][i].out; + multi_or[23][i].in[21] <== and[112][i].out; + multi_or[23][i].in[22] <== and[113][i].out; + multi_or[23][i].in[23] <== and[114][i].out; + multi_or[23][i].in[24] <== and[115][i].out; + multi_or[23][i].in[25] <== and[116][i].out; + multi_or[23][i].in[26] <== and[117][i].out; + multi_or[23][i].in[27] <== and[118][i].out; + states[i+1][35] <== multi_or[23][i].out; eq[42][i] = IsEqual(); eq[42][i].in[0] <== in[i]; - eq[42][i].in[1] <== 128; + eq[42][i].in[1] <== 224; + and[119][i] = AND(); + and[119][i].a <== states[i][32]; + and[119][i].b <== eq[42][i].out; + and[120][i] = AND(); + and[120][i].a <== states[i][42]; + and[120][i].b <== eq[42][i].out; + and[121][i] = AND(); + and[121][i].a <== states[i][44]; + and[121][i].b <== eq[42][i].out; + and[122][i] = AND(); + and[122][i].a <== states[i][45]; + and[122][i].b <== eq[42][i].out; + and[123][i] = AND(); + and[123][i].a <== states[i][46]; + and[123][i].b <== eq[42][i].out; + and[124][i] = AND(); + and[124][i].a <== states[i][47]; + and[124][i].b <== eq[42][i].out; + and[125][i] = AND(); + and[125][i].a <== states[i][48]; + and[125][i].b <== eq[42][i].out; + and[126][i] = AND(); + and[126][i].a <== states[i][49]; + and[126][i].b <== eq[42][i].out; + and[127][i] = AND(); + and[127][i].a <== states[i][50]; + and[127][i].b <== eq[42][i].out; + and[128][i] = AND(); + and[128][i].a <== states[i][51]; + and[128][i].b <== eq[42][i].out; + and[129][i] = AND(); + and[129][i].a <== states[i][52]; + and[129][i].b <== eq[42][i].out; + and[130][i] = AND(); + and[130][i].a <== states[i][53]; + and[130][i].b <== eq[42][i].out; + and[131][i] = AND(); + and[131][i].a <== states[i][54]; + and[131][i].b <== eq[42][i].out; + and[132][i] = AND(); + and[132][i].a <== states[i][55]; + and[132][i].b <== eq[42][i].out; + and[133][i] = AND(); + and[133][i].a <== states[i][56]; + and[133][i].b <== eq[42][i].out; + and[134][i] = AND(); + and[134][i].a <== states[i][57]; + and[134][i].b <== eq[42][i].out; + and[135][i] = AND(); + and[135][i].a <== states[i][58]; + and[135][i].b <== eq[42][i].out; + and[136][i] = AND(); + and[136][i].a <== states[i][59]; + and[136][i].b <== eq[42][i].out; + and[137][i] = AND(); + and[137][i].a <== states[i][60]; + and[137][i].b <== eq[42][i].out; + and[138][i] = AND(); + and[138][i].a <== states[i][61]; + and[138][i].b <== eq[42][i].out; + and[139][i] = AND(); + and[139][i].a <== states[i][62]; + and[139][i].b <== eq[42][i].out; + and[140][i] = AND(); + and[140][i].a <== states[i][63]; + and[140][i].b <== eq[42][i].out; + and[141][i] = AND(); + and[141][i].a <== states[i][65]; + and[141][i].b <== eq[42][i].out; + and[142][i] = AND(); + and[142][i].a <== states[i][66]; + and[142][i].b <== eq[42][i].out; + and[143][i] = AND(); + and[143][i].a <== states[i][75]; + and[143][i].b <== eq[42][i].out; + multi_or[24][i] = MultiOR(25); + multi_or[24][i].in[0] <== and[119][i].out; + multi_or[24][i].in[1] <== and[120][i].out; + multi_or[24][i].in[2] <== and[121][i].out; + multi_or[24][i].in[3] <== and[122][i].out; + multi_or[24][i].in[4] <== and[123][i].out; + multi_or[24][i].in[5] <== and[124][i].out; + multi_or[24][i].in[6] <== and[125][i].out; + multi_or[24][i].in[7] <== and[126][i].out; + multi_or[24][i].in[8] <== and[127][i].out; + multi_or[24][i].in[9] <== and[128][i].out; + multi_or[24][i].in[10] <== and[129][i].out; + multi_or[24][i].in[11] <== and[130][i].out; + multi_or[24][i].in[12] <== and[131][i].out; + multi_or[24][i].in[13] <== and[132][i].out; + multi_or[24][i].in[14] <== and[133][i].out; + multi_or[24][i].in[15] <== and[134][i].out; + multi_or[24][i].in[16] <== and[135][i].out; + multi_or[24][i].in[17] <== and[136][i].out; + multi_or[24][i].in[18] <== and[137][i].out; + multi_or[24][i].in[19] <== and[138][i].out; + multi_or[24][i].in[20] <== and[139][i].out; + multi_or[24][i].in[21] <== and[140][i].out; + multi_or[24][i].in[22] <== and[141][i].out; + multi_or[24][i].in[23] <== and[142][i].out; + multi_or[24][i].in[24] <== and[143][i].out; + states[i+1][36] <== multi_or[24][i].out; eq[43][i] = IsEqual(); eq[43][i].in[0] <== in[i]; - eq[43][i].in[1] <== 129; + eq[43][i].in[1] <== 225; eq[44][i] = IsEqual(); eq[44][i].in[0] <== in[i]; - eq[44][i].in[1] <== 130; + eq[44][i].in[1] <== 226; eq[45][i] = IsEqual(); eq[45][i].in[0] <== in[i]; - eq[45][i].in[1] <== 131; + eq[45][i].in[1] <== 227; eq[46][i] = IsEqual(); eq[46][i].in[0] <== in[i]; - eq[46][i].in[1] <== 132; + eq[46][i].in[1] <== 228; eq[47][i] = IsEqual(); eq[47][i].in[0] <== in[i]; - eq[47][i].in[1] <== 133; + eq[47][i].in[1] <== 229; eq[48][i] = IsEqual(); eq[48][i].in[0] <== in[i]; - eq[48][i].in[1] <== 134; + eq[48][i].in[1] <== 230; eq[49][i] = IsEqual(); eq[49][i].in[0] <== in[i]; - eq[49][i].in[1] <== 135; + eq[49][i].in[1] <== 231; eq[50][i] = IsEqual(); eq[50][i].in[0] <== in[i]; - eq[50][i].in[1] <== 136; + eq[50][i].in[1] <== 232; eq[51][i] = IsEqual(); eq[51][i].in[0] <== in[i]; - eq[51][i].in[1] <== 137; + eq[51][i].in[1] <== 233; eq[52][i] = IsEqual(); eq[52][i].in[0] <== in[i]; - eq[52][i].in[1] <== 138; + eq[52][i].in[1] <== 234; eq[53][i] = IsEqual(); eq[53][i].in[0] <== in[i]; - eq[53][i].in[1] <== 139; + eq[53][i].in[1] <== 235; eq[54][i] = IsEqual(); eq[54][i].in[0] <== in[i]; - eq[54][i].in[1] <== 140; + eq[54][i].in[1] <== 236; eq[55][i] = IsEqual(); eq[55][i].in[0] <== in[i]; - eq[55][i].in[1] <== 141; + eq[55][i].in[1] <== 238; eq[56][i] = IsEqual(); eq[56][i].in[0] <== in[i]; - eq[56][i].in[1] <== 142; + eq[56][i].in[1] <== 239; + and[144][i] = AND(); + and[144][i].a <== states[i][32]; + multi_or[25][i] = MultiOR(14); + multi_or[25][i].in[0] <== eq[43][i].out; + multi_or[25][i].in[1] <== eq[44][i].out; + multi_or[25][i].in[2] <== eq[45][i].out; + multi_or[25][i].in[3] <== eq[46][i].out; + multi_or[25][i].in[4] <== eq[47][i].out; + multi_or[25][i].in[5] <== eq[48][i].out; + multi_or[25][i].in[6] <== eq[49][i].out; + multi_or[25][i].in[7] <== eq[50][i].out; + multi_or[25][i].in[8] <== eq[51][i].out; + multi_or[25][i].in[9] <== eq[52][i].out; + multi_or[25][i].in[10] <== eq[53][i].out; + multi_or[25][i].in[11] <== eq[54][i].out; + multi_or[25][i].in[12] <== eq[55][i].out; + multi_or[25][i].in[13] <== eq[56][i].out; + and[144][i].b <== multi_or[25][i].out; + lt[46][i] = LessEqThan(8); + lt[46][i].in[0] <== 144; + lt[46][i].in[1] <== in[i]; + lt[47][i] = LessEqThan(8); + lt[47][i].in[0] <== in[i]; + lt[47][i].in[1] <== 191; + and[145][i] = AND(); + and[145][i].a <== lt[46][i].out; + and[145][i].b <== lt[47][i].out; + and[146][i] = AND(); + and[146][i].a <== states[i][39]; + and[146][i].b <== and[145][i].out; + and[147][i] = AND(); + and[147][i].a <== states[i][40]; + and[147][i].b <== and[42][i].out; eq[57][i] = IsEqual(); eq[57][i].in[0] <== in[i]; - eq[57][i].in[1] <== 143; - and[41][i] = AND(); - and[41][i].a <== states[i][28]; - multi_or[5][i] = MultiOR(16); - multi_or[5][i].in[0] <== eq[42][i].out; - multi_or[5][i].in[1] <== eq[43][i].out; - multi_or[5][i].in[2] <== eq[44][i].out; - multi_or[5][i].in[3] <== eq[45][i].out; - multi_or[5][i].in[4] <== eq[46][i].out; - multi_or[5][i].in[5] <== eq[47][i].out; - multi_or[5][i].in[6] <== eq[48][i].out; - multi_or[5][i].in[7] <== eq[49][i].out; - multi_or[5][i].in[8] <== eq[50][i].out; - multi_or[5][i].in[9] <== eq[51][i].out; - multi_or[5][i].in[10] <== eq[52][i].out; - multi_or[5][i].in[11] <== eq[53][i].out; - multi_or[5][i].in[12] <== eq[54][i].out; - multi_or[5][i].in[13] <== eq[55][i].out; - multi_or[5][i].in[14] <== eq[56][i].out; - multi_or[5][i].in[15] <== eq[57][i].out; - and[41][i].b <== multi_or[5][i].out; - multi_or[6][i] = MultiOR(5); - multi_or[6][i].in[0] <== and[36][i].out; - multi_or[6][i].in[1] <== and[37][i].out; - multi_or[6][i].in[2] <== and[39][i].out; - multi_or[6][i].in[3] <== and[40][i].out; - multi_or[6][i].in[4] <== and[41][i].out; - states[i+1][24] <== multi_or[6][i].out; + eq[57][i].in[1] <== 128; eq[58][i] = IsEqual(); eq[58][i].in[0] <== in[i]; - eq[58][i].in[1] <== 237; - and[42][i] = AND(); - and[42][i].a <== states[i][20]; - and[42][i].b <== eq[58][i].out; - and[43][i] = AND(); - and[43][i].a <== states[i][21]; - and[43][i].b <== eq[58][i].out; - multi_or[7][i] = MultiOR(2); - multi_or[7][i].in[0] <== and[42][i].out; - multi_or[7][i].in[1] <== and[43][i].out; - states[i+1][25] <== multi_or[7][i].out; + eq[58][i].in[1] <== 129; eq[59][i] = IsEqual(); eq[59][i].in[0] <== in[i]; - eq[59][i].in[1] <== 240; - and[44][i] = AND(); - and[44][i].a <== states[i][20]; - and[44][i].b <== eq[59][i].out; - and[45][i] = AND(); - and[45][i].a <== states[i][21]; - and[45][i].b <== eq[59][i].out; - multi_or[8][i] = MultiOR(2); - multi_or[8][i].in[0] <== and[44][i].out; - multi_or[8][i].in[1] <== and[45][i].out; - states[i+1][26] <== multi_or[8][i].out; + eq[59][i].in[1] <== 130; eq[60][i] = IsEqual(); eq[60][i].in[0] <== in[i]; - eq[60][i].in[1] <== 241; + eq[60][i].in[1] <== 131; eq[61][i] = IsEqual(); eq[61][i].in[0] <== in[i]; - eq[61][i].in[1] <== 242; + eq[61][i].in[1] <== 132; eq[62][i] = IsEqual(); eq[62][i].in[0] <== in[i]; - eq[62][i].in[1] <== 243; - and[46][i] = AND(); - and[46][i].a <== states[i][20]; - multi_or[9][i] = MultiOR(3); - multi_or[9][i].in[0] <== eq[60][i].out; - multi_or[9][i].in[1] <== eq[61][i].out; - multi_or[9][i].in[2] <== eq[62][i].out; - and[46][i].b <== multi_or[9][i].out; - and[47][i] = AND(); - and[47][i].a <== states[i][21]; - and[47][i].b <== multi_or[9][i].out; - multi_or[10][i] = MultiOR(2); - multi_or[10][i].in[0] <== and[46][i].out; - multi_or[10][i].in[1] <== and[47][i].out; - states[i+1][27] <== multi_or[10][i].out; + eq[62][i].in[1] <== 133; eq[63][i] = IsEqual(); eq[63][i].in[0] <== in[i]; - eq[63][i].in[1] <== 244; - and[48][i] = AND(); - and[48][i].a <== states[i][20]; - and[48][i].b <== eq[63][i].out; - and[49][i] = AND(); - and[49][i].a <== states[i][21]; - and[49][i].b <== eq[63][i].out; - multi_or[11][i] = MultiOR(2); - multi_or[11][i].in[0] <== and[48][i].out; - multi_or[11][i].in[1] <== and[49][i].out; - states[i+1][28] <== multi_or[11][i].out; - and[50][i] = AND(); - and[50][i].a <== states[i][21]; - and[50][i].b <== eq[0][i].out; - states[i+1][29] <== and[50][i].out; + eq[63][i].in[1] <== 134; eq[64][i] = IsEqual(); eq[64][i].in[0] <== in[i]; - eq[64][i].in[1] <== 47; - and[51][i] = AND(); - and[51][i].a <== states[i][29]; - and[51][i].b <== eq[64][i].out; - states[i+1][30] <== and[51][i].out; - and[52][i] = AND(); - and[52][i].a <== states[i][30]; - and[52][i].b <== eq[1][i].out; - states[i+1][31] <== and[52][i].out; - and[53][i] = AND(); - and[53][i].a <== states[i][31]; - and[53][i].b <== eq[2][i].out; - states[i+1][32] <== and[53][i].out; - and[54][i] = AND(); - and[54][i].a <== states[i][32]; - and[54][i].b <== eq[3][i].out; - states[i+1][33] <== and[54][i].out; - and[55][i] = AND(); - and[55][i].a <== states[i][33]; - and[55][i].b <== eq[15][i].out; - states[i+1][34] <== and[55][i].out; - from_zero_enabled[i] <== MultiNOR(34)([states_tmp[i+1][1], states[i+1][2], states[i+1][3], states[i+1][4], states[i+1][5], states[i+1][6], states[i+1][7], states[i+1][8], states[i+1][9], states[i+1][10], states[i+1][11], states[i+1][12], states[i+1][13], states[i+1][14], states[i+1][15], states[i+1][16], states[i+1][17], states[i+1][18], states[i+1][19], states[i+1][20], states[i+1][21], states[i+1][22], states[i+1][23], states[i+1][24], states[i+1][25], states[i+1][26], states[i+1][27], states[i+1][28], states[i+1][29], states[i+1][30], states[i+1][31], states[i+1][32], states[i+1][33], states[i+1][34]]); + eq[64][i].in[1] <== 135; + eq[65][i] = IsEqual(); + eq[65][i].in[0] <== in[i]; + eq[65][i].in[1] <== 136; + eq[66][i] = IsEqual(); + eq[66][i].in[0] <== in[i]; + eq[66][i].in[1] <== 137; + eq[67][i] = IsEqual(); + eq[67][i].in[0] <== in[i]; + eq[67][i].in[1] <== 138; + eq[68][i] = IsEqual(); + eq[68][i].in[0] <== in[i]; + eq[68][i].in[1] <== 139; + eq[69][i] = IsEqual(); + eq[69][i].in[0] <== in[i]; + eq[69][i].in[1] <== 140; + eq[70][i] = IsEqual(); + eq[70][i].in[0] <== in[i]; + eq[70][i].in[1] <== 141; + eq[71][i] = IsEqual(); + eq[71][i].in[0] <== in[i]; + eq[71][i].in[1] <== 142; + eq[72][i] = IsEqual(); + eq[72][i].in[0] <== in[i]; + eq[72][i].in[1] <== 143; + and[148][i] = AND(); + and[148][i].a <== states[i][41]; + multi_or[26][i] = MultiOR(16); + multi_or[26][i].in[0] <== eq[57][i].out; + multi_or[26][i].in[1] <== eq[58][i].out; + multi_or[26][i].in[2] <== eq[59][i].out; + multi_or[26][i].in[3] <== eq[60][i].out; + multi_or[26][i].in[4] <== eq[61][i].out; + multi_or[26][i].in[5] <== eq[62][i].out; + multi_or[26][i].in[6] <== eq[63][i].out; + multi_or[26][i].in[7] <== eq[64][i].out; + multi_or[26][i].in[8] <== eq[65][i].out; + multi_or[26][i].in[9] <== eq[66][i].out; + multi_or[26][i].in[10] <== eq[67][i].out; + multi_or[26][i].in[11] <== eq[68][i].out; + multi_or[26][i].in[12] <== eq[69][i].out; + multi_or[26][i].in[13] <== eq[70][i].out; + multi_or[26][i].in[14] <== eq[71][i].out; + multi_or[26][i].in[15] <== eq[72][i].out; + and[148][i].b <== multi_or[26][i].out; + and[149][i] = AND(); + and[149][i].a <== states[i][42]; + and[149][i].b <== multi_or[25][i].out; + and[150][i] = AND(); + and[150][i].a <== states[i][44]; + and[150][i].b <== multi_or[25][i].out; + and[151][i] = AND(); + and[151][i].a <== states[i][45]; + and[151][i].b <== multi_or[25][i].out; + and[152][i] = AND(); + and[152][i].a <== states[i][46]; + and[152][i].b <== multi_or[25][i].out; + and[153][i] = AND(); + and[153][i].a <== states[i][47]; + and[153][i].b <== multi_or[25][i].out; + and[154][i] = AND(); + and[154][i].a <== states[i][48]; + and[154][i].b <== multi_or[25][i].out; + and[155][i] = AND(); + and[155][i].a <== states[i][49]; + and[155][i].b <== multi_or[25][i].out; + and[156][i] = AND(); + and[156][i].a <== states[i][50]; + and[156][i].b <== multi_or[25][i].out; + and[157][i] = AND(); + and[157][i].a <== states[i][51]; + and[157][i].b <== multi_or[25][i].out; + and[158][i] = AND(); + and[158][i].a <== states[i][52]; + and[158][i].b <== multi_or[25][i].out; + and[159][i] = AND(); + and[159][i].a <== states[i][53]; + and[159][i].b <== multi_or[25][i].out; + and[160][i] = AND(); + and[160][i].a <== states[i][54]; + and[160][i].b <== multi_or[25][i].out; + and[161][i] = AND(); + and[161][i].a <== states[i][55]; + and[161][i].b <== multi_or[25][i].out; + and[162][i] = AND(); + and[162][i].a <== states[i][56]; + and[162][i].b <== multi_or[25][i].out; + and[163][i] = AND(); + and[163][i].a <== states[i][57]; + and[163][i].b <== multi_or[25][i].out; + and[164][i] = AND(); + and[164][i].a <== states[i][58]; + and[164][i].b <== multi_or[25][i].out; + and[165][i] = AND(); + and[165][i].a <== states[i][59]; + and[165][i].b <== multi_or[25][i].out; + and[166][i] = AND(); + and[166][i].a <== states[i][60]; + and[166][i].b <== multi_or[25][i].out; + and[167][i] = AND(); + and[167][i].a <== states[i][61]; + and[167][i].b <== multi_or[25][i].out; + and[168][i] = AND(); + and[168][i].a <== states[i][62]; + and[168][i].b <== multi_or[25][i].out; + and[169][i] = AND(); + and[169][i].a <== states[i][63]; + and[169][i].b <== multi_or[25][i].out; + and[170][i] = AND(); + and[170][i].a <== states[i][65]; + and[170][i].b <== multi_or[25][i].out; + and[171][i] = AND(); + and[171][i].a <== states[i][66]; + and[171][i].b <== multi_or[25][i].out; + and[172][i] = AND(); + and[172][i].a <== states[i][75]; + and[172][i].b <== multi_or[25][i].out; + multi_or[27][i] = MultiOR(28); + multi_or[27][i].in[0] <== and[144][i].out; + multi_or[27][i].in[1] <== and[146][i].out; + multi_or[27][i].in[2] <== and[147][i].out; + multi_or[27][i].in[3] <== and[148][i].out; + multi_or[27][i].in[4] <== and[149][i].out; + multi_or[27][i].in[5] <== and[150][i].out; + multi_or[27][i].in[6] <== and[151][i].out; + multi_or[27][i].in[7] <== and[152][i].out; + multi_or[27][i].in[8] <== and[153][i].out; + multi_or[27][i].in[9] <== and[154][i].out; + multi_or[27][i].in[10] <== and[155][i].out; + multi_or[27][i].in[11] <== and[156][i].out; + multi_or[27][i].in[12] <== and[157][i].out; + multi_or[27][i].in[13] <== and[158][i].out; + multi_or[27][i].in[14] <== and[159][i].out; + multi_or[27][i].in[15] <== and[160][i].out; + multi_or[27][i].in[16] <== and[161][i].out; + multi_or[27][i].in[17] <== and[162][i].out; + multi_or[27][i].in[18] <== and[163][i].out; + multi_or[27][i].in[19] <== and[164][i].out; + multi_or[27][i].in[20] <== and[165][i].out; + multi_or[27][i].in[21] <== and[166][i].out; + multi_or[27][i].in[22] <== and[167][i].out; + multi_or[27][i].in[23] <== and[168][i].out; + multi_or[27][i].in[24] <== and[169][i].out; + multi_or[27][i].in[25] <== and[170][i].out; + multi_or[27][i].in[26] <== and[171][i].out; + multi_or[27][i].in[27] <== and[172][i].out; + states[i+1][37] <== multi_or[27][i].out; + eq[73][i] = IsEqual(); + eq[73][i].in[0] <== in[i]; + eq[73][i].in[1] <== 237; + and[173][i] = AND(); + and[173][i].a <== states[i][32]; + and[173][i].b <== eq[73][i].out; + and[174][i] = AND(); + and[174][i].a <== states[i][42]; + and[174][i].b <== eq[73][i].out; + and[175][i] = AND(); + and[175][i].a <== states[i][44]; + and[175][i].b <== eq[73][i].out; + and[176][i] = AND(); + and[176][i].a <== states[i][45]; + and[176][i].b <== eq[73][i].out; + and[177][i] = AND(); + and[177][i].a <== states[i][46]; + and[177][i].b <== eq[73][i].out; + and[178][i] = AND(); + and[178][i].a <== states[i][47]; + and[178][i].b <== eq[73][i].out; + and[179][i] = AND(); + and[179][i].a <== states[i][48]; + and[179][i].b <== eq[73][i].out; + and[180][i] = AND(); + and[180][i].a <== states[i][49]; + and[180][i].b <== eq[73][i].out; + and[181][i] = AND(); + and[181][i].a <== states[i][50]; + and[181][i].b <== eq[73][i].out; + and[182][i] = AND(); + and[182][i].a <== states[i][51]; + and[182][i].b <== eq[73][i].out; + and[183][i] = AND(); + and[183][i].a <== states[i][52]; + and[183][i].b <== eq[73][i].out; + and[184][i] = AND(); + and[184][i].a <== states[i][53]; + and[184][i].b <== eq[73][i].out; + and[185][i] = AND(); + and[185][i].a <== states[i][54]; + and[185][i].b <== eq[73][i].out; + and[186][i] = AND(); + and[186][i].a <== states[i][55]; + and[186][i].b <== eq[73][i].out; + and[187][i] = AND(); + and[187][i].a <== states[i][56]; + and[187][i].b <== eq[73][i].out; + and[188][i] = AND(); + and[188][i].a <== states[i][57]; + and[188][i].b <== eq[73][i].out; + and[189][i] = AND(); + and[189][i].a <== states[i][58]; + and[189][i].b <== eq[73][i].out; + and[190][i] = AND(); + and[190][i].a <== states[i][59]; + and[190][i].b <== eq[73][i].out; + and[191][i] = AND(); + and[191][i].a <== states[i][60]; + and[191][i].b <== eq[73][i].out; + and[192][i] = AND(); + and[192][i].a <== states[i][61]; + and[192][i].b <== eq[73][i].out; + and[193][i] = AND(); + and[193][i].a <== states[i][62]; + and[193][i].b <== eq[73][i].out; + and[194][i] = AND(); + and[194][i].a <== states[i][63]; + and[194][i].b <== eq[73][i].out; + and[195][i] = AND(); + and[195][i].a <== states[i][65]; + and[195][i].b <== eq[73][i].out; + and[196][i] = AND(); + and[196][i].a <== states[i][66]; + and[196][i].b <== eq[73][i].out; + and[197][i] = AND(); + and[197][i].a <== states[i][75]; + and[197][i].b <== eq[73][i].out; + multi_or[28][i] = MultiOR(25); + multi_or[28][i].in[0] <== and[173][i].out; + multi_or[28][i].in[1] <== and[174][i].out; + multi_or[28][i].in[2] <== and[175][i].out; + multi_or[28][i].in[3] <== and[176][i].out; + multi_or[28][i].in[4] <== and[177][i].out; + multi_or[28][i].in[5] <== and[178][i].out; + multi_or[28][i].in[6] <== and[179][i].out; + multi_or[28][i].in[7] <== and[180][i].out; + multi_or[28][i].in[8] <== and[181][i].out; + multi_or[28][i].in[9] <== and[182][i].out; + multi_or[28][i].in[10] <== and[183][i].out; + multi_or[28][i].in[11] <== and[184][i].out; + multi_or[28][i].in[12] <== and[185][i].out; + multi_or[28][i].in[13] <== and[186][i].out; + multi_or[28][i].in[14] <== and[187][i].out; + multi_or[28][i].in[15] <== and[188][i].out; + multi_or[28][i].in[16] <== and[189][i].out; + multi_or[28][i].in[17] <== and[190][i].out; + multi_or[28][i].in[18] <== and[191][i].out; + multi_or[28][i].in[19] <== and[192][i].out; + multi_or[28][i].in[20] <== and[193][i].out; + multi_or[28][i].in[21] <== and[194][i].out; + multi_or[28][i].in[22] <== and[195][i].out; + multi_or[28][i].in[23] <== and[196][i].out; + multi_or[28][i].in[24] <== and[197][i].out; + states[i+1][38] <== multi_or[28][i].out; + eq[74][i] = IsEqual(); + eq[74][i].in[0] <== in[i]; + eq[74][i].in[1] <== 240; + and[198][i] = AND(); + and[198][i].a <== states[i][32]; + and[198][i].b <== eq[74][i].out; + and[199][i] = AND(); + and[199][i].a <== states[i][42]; + and[199][i].b <== eq[74][i].out; + and[200][i] = AND(); + and[200][i].a <== states[i][44]; + and[200][i].b <== eq[74][i].out; + and[201][i] = AND(); + and[201][i].a <== states[i][45]; + and[201][i].b <== eq[74][i].out; + and[202][i] = AND(); + and[202][i].a <== states[i][46]; + and[202][i].b <== eq[74][i].out; + and[203][i] = AND(); + and[203][i].a <== states[i][47]; + and[203][i].b <== eq[74][i].out; + and[204][i] = AND(); + and[204][i].a <== states[i][48]; + and[204][i].b <== eq[74][i].out; + and[205][i] = AND(); + and[205][i].a <== states[i][49]; + and[205][i].b <== eq[74][i].out; + and[206][i] = AND(); + and[206][i].a <== states[i][50]; + and[206][i].b <== eq[74][i].out; + and[207][i] = AND(); + and[207][i].a <== states[i][51]; + and[207][i].b <== eq[74][i].out; + and[208][i] = AND(); + and[208][i].a <== states[i][52]; + and[208][i].b <== eq[74][i].out; + and[209][i] = AND(); + and[209][i].a <== states[i][53]; + and[209][i].b <== eq[74][i].out; + and[210][i] = AND(); + and[210][i].a <== states[i][54]; + and[210][i].b <== eq[74][i].out; + and[211][i] = AND(); + and[211][i].a <== states[i][55]; + and[211][i].b <== eq[74][i].out; + and[212][i] = AND(); + and[212][i].a <== states[i][56]; + and[212][i].b <== eq[74][i].out; + and[213][i] = AND(); + and[213][i].a <== states[i][57]; + and[213][i].b <== eq[74][i].out; + and[214][i] = AND(); + and[214][i].a <== states[i][58]; + and[214][i].b <== eq[74][i].out; + and[215][i] = AND(); + and[215][i].a <== states[i][59]; + and[215][i].b <== eq[74][i].out; + and[216][i] = AND(); + and[216][i].a <== states[i][60]; + and[216][i].b <== eq[74][i].out; + and[217][i] = AND(); + and[217][i].a <== states[i][61]; + and[217][i].b <== eq[74][i].out; + and[218][i] = AND(); + and[218][i].a <== states[i][62]; + and[218][i].b <== eq[74][i].out; + and[219][i] = AND(); + and[219][i].a <== states[i][63]; + and[219][i].b <== eq[74][i].out; + and[220][i] = AND(); + and[220][i].a <== states[i][65]; + and[220][i].b <== eq[74][i].out; + and[221][i] = AND(); + and[221][i].a <== states[i][66]; + and[221][i].b <== eq[74][i].out; + and[222][i] = AND(); + and[222][i].a <== states[i][75]; + and[222][i].b <== eq[74][i].out; + multi_or[29][i] = MultiOR(25); + multi_or[29][i].in[0] <== and[198][i].out; + multi_or[29][i].in[1] <== and[199][i].out; + multi_or[29][i].in[2] <== and[200][i].out; + multi_or[29][i].in[3] <== and[201][i].out; + multi_or[29][i].in[4] <== and[202][i].out; + multi_or[29][i].in[5] <== and[203][i].out; + multi_or[29][i].in[6] <== and[204][i].out; + multi_or[29][i].in[7] <== and[205][i].out; + multi_or[29][i].in[8] <== and[206][i].out; + multi_or[29][i].in[9] <== and[207][i].out; + multi_or[29][i].in[10] <== and[208][i].out; + multi_or[29][i].in[11] <== and[209][i].out; + multi_or[29][i].in[12] <== and[210][i].out; + multi_or[29][i].in[13] <== and[211][i].out; + multi_or[29][i].in[14] <== and[212][i].out; + multi_or[29][i].in[15] <== and[213][i].out; + multi_or[29][i].in[16] <== and[214][i].out; + multi_or[29][i].in[17] <== and[215][i].out; + multi_or[29][i].in[18] <== and[216][i].out; + multi_or[29][i].in[19] <== and[217][i].out; + multi_or[29][i].in[20] <== and[218][i].out; + multi_or[29][i].in[21] <== and[219][i].out; + multi_or[29][i].in[22] <== and[220][i].out; + multi_or[29][i].in[23] <== and[221][i].out; + multi_or[29][i].in[24] <== and[222][i].out; + states[i+1][39] <== multi_or[29][i].out; + eq[75][i] = IsEqual(); + eq[75][i].in[0] <== in[i]; + eq[75][i].in[1] <== 241; + eq[76][i] = IsEqual(); + eq[76][i].in[0] <== in[i]; + eq[76][i].in[1] <== 242; + eq[77][i] = IsEqual(); + eq[77][i].in[0] <== in[i]; + eq[77][i].in[1] <== 243; + and[223][i] = AND(); + and[223][i].a <== states[i][32]; + multi_or[30][i] = MultiOR(3); + multi_or[30][i].in[0] <== eq[75][i].out; + multi_or[30][i].in[1] <== eq[76][i].out; + multi_or[30][i].in[2] <== eq[77][i].out; + and[223][i].b <== multi_or[30][i].out; + and[224][i] = AND(); + and[224][i].a <== states[i][42]; + and[224][i].b <== multi_or[30][i].out; + and[225][i] = AND(); + and[225][i].a <== states[i][44]; + and[225][i].b <== multi_or[30][i].out; + and[226][i] = AND(); + and[226][i].a <== states[i][45]; + and[226][i].b <== multi_or[30][i].out; + and[227][i] = AND(); + and[227][i].a <== states[i][46]; + and[227][i].b <== multi_or[30][i].out; + and[228][i] = AND(); + and[228][i].a <== states[i][47]; + and[228][i].b <== multi_or[30][i].out; + and[229][i] = AND(); + and[229][i].a <== states[i][48]; + and[229][i].b <== multi_or[30][i].out; + and[230][i] = AND(); + and[230][i].a <== states[i][49]; + and[230][i].b <== multi_or[30][i].out; + and[231][i] = AND(); + and[231][i].a <== states[i][50]; + and[231][i].b <== multi_or[30][i].out; + and[232][i] = AND(); + and[232][i].a <== states[i][51]; + and[232][i].b <== multi_or[30][i].out; + and[233][i] = AND(); + and[233][i].a <== states[i][52]; + and[233][i].b <== multi_or[30][i].out; + and[234][i] = AND(); + and[234][i].a <== states[i][53]; + and[234][i].b <== multi_or[30][i].out; + and[235][i] = AND(); + and[235][i].a <== states[i][54]; + and[235][i].b <== multi_or[30][i].out; + and[236][i] = AND(); + and[236][i].a <== states[i][55]; + and[236][i].b <== multi_or[30][i].out; + and[237][i] = AND(); + and[237][i].a <== states[i][56]; + and[237][i].b <== multi_or[30][i].out; + and[238][i] = AND(); + and[238][i].a <== states[i][57]; + and[238][i].b <== multi_or[30][i].out; + and[239][i] = AND(); + and[239][i].a <== states[i][58]; + and[239][i].b <== multi_or[30][i].out; + and[240][i] = AND(); + and[240][i].a <== states[i][59]; + and[240][i].b <== multi_or[30][i].out; + and[241][i] = AND(); + and[241][i].a <== states[i][60]; + and[241][i].b <== multi_or[30][i].out; + and[242][i] = AND(); + and[242][i].a <== states[i][61]; + and[242][i].b <== multi_or[30][i].out; + and[243][i] = AND(); + and[243][i].a <== states[i][62]; + and[243][i].b <== multi_or[30][i].out; + and[244][i] = AND(); + and[244][i].a <== states[i][63]; + and[244][i].b <== multi_or[30][i].out; + and[245][i] = AND(); + and[245][i].a <== states[i][65]; + and[245][i].b <== multi_or[30][i].out; + and[246][i] = AND(); + and[246][i].a <== states[i][66]; + and[246][i].b <== multi_or[30][i].out; + and[247][i] = AND(); + and[247][i].a <== states[i][75]; + and[247][i].b <== multi_or[30][i].out; + multi_or[31][i] = MultiOR(25); + multi_or[31][i].in[0] <== and[223][i].out; + multi_or[31][i].in[1] <== and[224][i].out; + multi_or[31][i].in[2] <== and[225][i].out; + multi_or[31][i].in[3] <== and[226][i].out; + multi_or[31][i].in[4] <== and[227][i].out; + multi_or[31][i].in[5] <== and[228][i].out; + multi_or[31][i].in[6] <== and[229][i].out; + multi_or[31][i].in[7] <== and[230][i].out; + multi_or[31][i].in[8] <== and[231][i].out; + multi_or[31][i].in[9] <== and[232][i].out; + multi_or[31][i].in[10] <== and[233][i].out; + multi_or[31][i].in[11] <== and[234][i].out; + multi_or[31][i].in[12] <== and[235][i].out; + multi_or[31][i].in[13] <== and[236][i].out; + multi_or[31][i].in[14] <== and[237][i].out; + multi_or[31][i].in[15] <== and[238][i].out; + multi_or[31][i].in[16] <== and[239][i].out; + multi_or[31][i].in[17] <== and[240][i].out; + multi_or[31][i].in[18] <== and[241][i].out; + multi_or[31][i].in[19] <== and[242][i].out; + multi_or[31][i].in[20] <== and[243][i].out; + multi_or[31][i].in[21] <== and[244][i].out; + multi_or[31][i].in[22] <== and[245][i].out; + multi_or[31][i].in[23] <== and[246][i].out; + multi_or[31][i].in[24] <== and[247][i].out; + states[i+1][40] <== multi_or[31][i].out; + eq[78][i] = IsEqual(); + eq[78][i].in[0] <== in[i]; + eq[78][i].in[1] <== 244; + and[248][i] = AND(); + and[248][i].a <== states[i][32]; + and[248][i].b <== eq[78][i].out; + and[249][i] = AND(); + and[249][i].a <== states[i][42]; + and[249][i].b <== eq[78][i].out; + and[250][i] = AND(); + and[250][i].a <== states[i][44]; + and[250][i].b <== eq[78][i].out; + and[251][i] = AND(); + and[251][i].a <== states[i][45]; + and[251][i].b <== eq[78][i].out; + and[252][i] = AND(); + and[252][i].a <== states[i][46]; + and[252][i].b <== eq[78][i].out; + and[253][i] = AND(); + and[253][i].a <== states[i][47]; + and[253][i].b <== eq[78][i].out; + and[254][i] = AND(); + and[254][i].a <== states[i][48]; + and[254][i].b <== eq[78][i].out; + and[255][i] = AND(); + and[255][i].a <== states[i][49]; + and[255][i].b <== eq[78][i].out; + and[256][i] = AND(); + and[256][i].a <== states[i][50]; + and[256][i].b <== eq[78][i].out; + and[257][i] = AND(); + and[257][i].a <== states[i][51]; + and[257][i].b <== eq[78][i].out; + and[258][i] = AND(); + and[258][i].a <== states[i][52]; + and[258][i].b <== eq[78][i].out; + and[259][i] = AND(); + and[259][i].a <== states[i][53]; + and[259][i].b <== eq[78][i].out; + and[260][i] = AND(); + and[260][i].a <== states[i][54]; + and[260][i].b <== eq[78][i].out; + and[261][i] = AND(); + and[261][i].a <== states[i][55]; + and[261][i].b <== eq[78][i].out; + and[262][i] = AND(); + and[262][i].a <== states[i][56]; + and[262][i].b <== eq[78][i].out; + and[263][i] = AND(); + and[263][i].a <== states[i][57]; + and[263][i].b <== eq[78][i].out; + and[264][i] = AND(); + and[264][i].a <== states[i][58]; + and[264][i].b <== eq[78][i].out; + and[265][i] = AND(); + and[265][i].a <== states[i][59]; + and[265][i].b <== eq[78][i].out; + and[266][i] = AND(); + and[266][i].a <== states[i][60]; + and[266][i].b <== eq[78][i].out; + and[267][i] = AND(); + and[267][i].a <== states[i][61]; + and[267][i].b <== eq[78][i].out; + and[268][i] = AND(); + and[268][i].a <== states[i][62]; + and[268][i].b <== eq[78][i].out; + and[269][i] = AND(); + and[269][i].a <== states[i][63]; + and[269][i].b <== eq[78][i].out; + and[270][i] = AND(); + and[270][i].a <== states[i][65]; + and[270][i].b <== eq[78][i].out; + and[271][i] = AND(); + and[271][i].a <== states[i][66]; + and[271][i].b <== eq[78][i].out; + and[272][i] = AND(); + and[272][i].a <== states[i][75]; + and[272][i].b <== eq[78][i].out; + multi_or[32][i] = MultiOR(25); + multi_or[32][i].in[0] <== and[248][i].out; + multi_or[32][i].in[1] <== and[249][i].out; + multi_or[32][i].in[2] <== and[250][i].out; + multi_or[32][i].in[3] <== and[251][i].out; + multi_or[32][i].in[4] <== and[252][i].out; + multi_or[32][i].in[5] <== and[253][i].out; + multi_or[32][i].in[6] <== and[254][i].out; + multi_or[32][i].in[7] <== and[255][i].out; + multi_or[32][i].in[8] <== and[256][i].out; + multi_or[32][i].in[9] <== and[257][i].out; + multi_or[32][i].in[10] <== and[258][i].out; + multi_or[32][i].in[11] <== and[259][i].out; + multi_or[32][i].in[12] <== and[260][i].out; + multi_or[32][i].in[13] <== and[261][i].out; + multi_or[32][i].in[14] <== and[262][i].out; + multi_or[32][i].in[15] <== and[263][i].out; + multi_or[32][i].in[16] <== and[264][i].out; + multi_or[32][i].in[17] <== and[265][i].out; + multi_or[32][i].in[18] <== and[266][i].out; + multi_or[32][i].in[19] <== and[267][i].out; + multi_or[32][i].in[20] <== and[268][i].out; + multi_or[32][i].in[21] <== and[269][i].out; + multi_or[32][i].in[22] <== and[270][i].out; + multi_or[32][i].in[23] <== and[271][i].out; + multi_or[32][i].in[24] <== and[272][i].out; + states[i+1][41] <== multi_or[32][i].out; + eq[79][i] = IsEqual(); + eq[79][i].in[0] <== in[i]; + eq[79][i].in[1] <== 122; + and[273][i] = AND(); + and[273][i].a <== states[i][32]; + and[273][i].b <== eq[79][i].out; + and[274][i] = AND(); + and[274][i].a <== states[i][42]; + and[274][i].b <== eq[79][i].out; + and[275][i] = AND(); + and[275][i].a <== states[i][44]; + and[275][i].b <== eq[79][i].out; + and[276][i] = AND(); + and[276][i].a <== states[i][45]; + and[276][i].b <== eq[79][i].out; + and[277][i] = AND(); + and[277][i].a <== states[i][46]; + and[277][i].b <== eq[79][i].out; + and[278][i] = AND(); + and[278][i].a <== states[i][47]; + and[278][i].b <== eq[79][i].out; + and[279][i] = AND(); + and[279][i].a <== states[i][48]; + and[279][i].b <== eq[79][i].out; + and[280][i] = AND(); + and[280][i].a <== states[i][49]; + and[280][i].b <== eq[79][i].out; + and[281][i] = AND(); + and[281][i].a <== states[i][50]; + and[281][i].b <== eq[79][i].out; + and[282][i] = AND(); + and[282][i].a <== states[i][51]; + and[282][i].b <== eq[79][i].out; + and[283][i] = AND(); + and[283][i].a <== states[i][52]; + and[283][i].b <== eq[79][i].out; + and[284][i] = AND(); + and[284][i].a <== states[i][53]; + and[284][i].b <== eq[79][i].out; + and[285][i] = AND(); + and[285][i].a <== states[i][54]; + and[285][i].b <== eq[79][i].out; + and[286][i] = AND(); + and[286][i].a <== states[i][55]; + and[286][i].b <== eq[79][i].out; + and[287][i] = AND(); + and[287][i].a <== states[i][56]; + and[287][i].b <== eq[79][i].out; + and[288][i] = AND(); + and[288][i].a <== states[i][57]; + and[288][i].b <== eq[79][i].out; + and[289][i] = AND(); + and[289][i].a <== states[i][58]; + and[289][i].b <== eq[79][i].out; + and[290][i] = AND(); + and[290][i].a <== states[i][59]; + and[290][i].b <== eq[79][i].out; + and[291][i] = AND(); + and[291][i].a <== states[i][60]; + and[291][i].b <== eq[79][i].out; + and[292][i] = AND(); + and[292][i].a <== states[i][61]; + and[292][i].b <== eq[79][i].out; + and[293][i] = AND(); + and[293][i].a <== states[i][62]; + and[293][i].b <== eq[79][i].out; + and[294][i] = AND(); + and[294][i].a <== states[i][63]; + and[294][i].b <== eq[79][i].out; + and[295][i] = AND(); + and[295][i].a <== states[i][65]; + and[295][i].b <== eq[79][i].out; + and[296][i] = AND(); + and[296][i].a <== states[i][66]; + and[296][i].b <== eq[79][i].out; + and[297][i] = AND(); + and[297][i].a <== states[i][75]; + and[297][i].b <== eq[79][i].out; + multi_or[33][i] = MultiOR(25); + multi_or[33][i].in[0] <== and[273][i].out; + multi_or[33][i].in[1] <== and[274][i].out; + multi_or[33][i].in[2] <== and[275][i].out; + multi_or[33][i].in[3] <== and[276][i].out; + multi_or[33][i].in[4] <== and[277][i].out; + multi_or[33][i].in[5] <== and[278][i].out; + multi_or[33][i].in[6] <== and[279][i].out; + multi_or[33][i].in[7] <== and[280][i].out; + multi_or[33][i].in[8] <== and[281][i].out; + multi_or[33][i].in[9] <== and[282][i].out; + multi_or[33][i].in[10] <== and[283][i].out; + multi_or[33][i].in[11] <== and[284][i].out; + multi_or[33][i].in[12] <== and[285][i].out; + multi_or[33][i].in[13] <== and[286][i].out; + multi_or[33][i].in[14] <== and[287][i].out; + multi_or[33][i].in[15] <== and[288][i].out; + multi_or[33][i].in[16] <== and[289][i].out; + multi_or[33][i].in[17] <== and[290][i].out; + multi_or[33][i].in[18] <== and[291][i].out; + multi_or[33][i].in[19] <== and[292][i].out; + multi_or[33][i].in[20] <== and[293][i].out; + multi_or[33][i].in[21] <== and[294][i].out; + multi_or[33][i].in[22] <== and[295][i].out; + multi_or[33][i].in[23] <== and[296][i].out; + multi_or[33][i].in[24] <== and[297][i].out; + states[i+1][42] <== multi_or[33][i].out; + and[298][i] = AND(); + and[298][i].a <== states[i][34]; + and[298][i].b <== eq[5][i].out; + states[i+1][43] <== and[298][i].out; + and[299][i] = AND(); + and[299][i].a <== states[i][42]; + and[299][i].b <== eq[1][i].out; + states[i+1][44] <== and[299][i].out; + and[300][i] = AND(); + and[300][i].a <== states[i][42]; + and[300][i].b <== eq[41][i].out; + and[301][i] = AND(); + and[301][i].a <== states[i][49]; + and[301][i].b <== eq[41][i].out; + multi_or[34][i] = MultiOR(2); + multi_or[34][i].in[0] <== and[300][i].out; + multi_or[34][i].in[1] <== and[301][i].out; + states[i+1][45] <== multi_or[34][i].out; + and[302][i] = AND(); + and[302][i].a <== states[i][44]; + and[302][i].b <== eq[3][i].out; + states[i+1][46] <== and[302][i].out; + and[303][i] = AND(); + and[303][i].a <== states[i][45]; + and[303][i].b <== eq[1][i].out; + states[i+1][47] <== and[303][i].out; + eq[80][i] = IsEqual(); + eq[80][i].in[0] <== in[i]; + eq[80][i].in[1] <== 101; + and[304][i] = AND(); + and[304][i].a <== states[i][45]; + and[304][i].b <== eq[80][i].out; + and[305][i] = AND(); + and[305][i].a <== states[i][53]; + and[305][i].b <== eq[80][i].out; + multi_or[35][i] = MultiOR(2); + multi_or[35][i].in[0] <== and[304][i].out; + multi_or[35][i].in[1] <== and[305][i].out; + states[i+1][48] <== multi_or[35][i].out; + and[306][i] = AND(); + and[306][i].a <== states[i][46]; + and[306][i].b <== eq[5][i].out; + states[i+1][49] <== and[306][i].out; + and[307][i] = AND(); + and[307][i].a <== states[i][47]; + and[307][i].b <== eq[3][i].out; + states[i+1][50] <== and[307][i].out; + and[308][i] = AND(); + and[308][i].a <== states[i][48]; + and[308][i].b <== eq[1][i].out; + states[i+1][51] <== and[308][i].out; + and[309][i] = AND(); + and[309][i].a <== states[i][48]; + and[309][i].b <== eq[17][i].out; + and[310][i] = AND(); + and[310][i].a <== states[i][57]; + and[310][i].b <== eq[17][i].out; + multi_or[36][i] = MultiOR(2); + multi_or[36][i].in[0] <== and[309][i].out; + multi_or[36][i].in[1] <== and[310][i].out; + states[i+1][52] <== multi_or[36][i].out; + and[311][i] = AND(); + and[311][i].a <== states[i][50]; + and[311][i].b <== eq[5][i].out; + states[i+1][53] <== and[311][i].out; + and[312][i] = AND(); + and[312][i].a <== states[i][51]; + and[312][i].b <== eq[3][i].out; + states[i+1][54] <== and[312][i].out; + and[313][i] = AND(); + and[313][i].a <== states[i][52]; + and[313][i].b <== eq[1][i].out; + states[i+1][55] <== and[313][i].out; + eq[81][i] = IsEqual(); + eq[81][i].in[0] <== in[i]; + eq[81][i].in[1] <== 97; + and[314][i] = AND(); + and[314][i].a <== states[i][52]; + and[314][i].b <== eq[81][i].out; + and[315][i] = AND(); + and[315][i].a <== states[i][61]; + and[315][i].b <== eq[81][i].out; + multi_or[37][i] = MultiOR(2); + multi_or[37][i].in[0] <== and[314][i].out; + multi_or[37][i].in[1] <== and[315][i].out; + states[i+1][56] <== multi_or[37][i].out; + and[316][i] = AND(); + and[316][i].a <== states[i][54]; + and[316][i].b <== eq[5][i].out; + states[i+1][57] <== and[316][i].out; + and[317][i] = AND(); + and[317][i].a <== states[i][55]; + and[317][i].b <== eq[3][i].out; + states[i+1][58] <== and[317][i].out; + and[318][i] = AND(); + and[318][i].a <== states[i][56]; + and[318][i].b <== eq[1][i].out; + states[i+1][59] <== and[318][i].out; + and[319][i] = AND(); + and[319][i].a <== states[i][56]; + and[319][i].b <== eq[4][i].out; + and[320][i] = AND(); + and[320][i].a <== states[i][65]; + and[320][i].b <== eq[4][i].out; + multi_or[38][i] = MultiOR(2); + multi_or[38][i].in[0] <== and[319][i].out; + multi_or[38][i].in[1] <== and[320][i].out; + states[i+1][60] <== multi_or[38][i].out; + and[321][i] = AND(); + and[321][i].a <== states[i][58]; + and[321][i].b <== eq[5][i].out; + states[i+1][61] <== and[321][i].out; + and[322][i] = AND(); + and[322][i].a <== states[i][59]; + and[322][i].b <== eq[3][i].out; + states[i+1][62] <== and[322][i].out; + and[323][i] = AND(); + and[323][i].a <== states[i][60]; + and[323][i].b <== eq[1][i].out; + states[i+1][63] <== and[323][i].out; + and[324][i] = AND(); + and[324][i].a <== states[i][60]; + and[324][i].b <== eq[16][i].out; + lt[48][i] = LessEqThan(8); + lt[48][i].in[0] <== 35; + lt[48][i].in[1] <== in[i]; + lt[49][i] = LessEqThan(8); + lt[49][i].in[0] <== in[i]; + lt[49][i].in[1] <== 127; + and[325][i] = AND(); + and[325][i].a <== lt[48][i].out; + and[325][i].b <== lt[49][i].out; + and[326][i] = AND(); + and[326][i].a <== states[i][64]; + multi_or[39][i] = MultiOR(2); + multi_or[39][i].in[0] <== and[39][i].out; + multi_or[39][i].in[1] <== and[325][i].out; + and[326][i].b <== multi_or[39][i].out; + and[327][i] = AND(); + and[327][i].a <== states[i][68]; + and[327][i].b <== and[42][i].out; + and[328][i] = AND(); + and[328][i].a <== states[i][75]; + and[328][i].b <== eq[16][i].out; + multi_or[40][i] = MultiOR(4); + multi_or[40][i].in[0] <== and[324][i].out; + multi_or[40][i].in[1] <== and[326][i].out; + multi_or[40][i].in[2] <== and[327][i].out; + multi_or[40][i].in[3] <== and[328][i].out; + states[i+1][64] <== multi_or[40][i].out; + and[329][i] = AND(); + and[329][i].a <== states[i][62]; + and[329][i].b <== eq[5][i].out; + states[i+1][65] <== and[329][i].out; + and[330][i] = AND(); + and[330][i].a <== states[i][63]; + and[330][i].b <== eq[3][i].out; + states[i+1][66] <== and[330][i].out; + and[331][i] = AND(); + and[331][i].a <== states[i][64]; + and[331][i].b <== eq[10][i].out; + lt[50][i] = LessEqThan(8); + lt[50][i].in[0] <== 1; + lt[50][i].in[1] <== in[i]; + lt[51][i] = LessEqThan(8); + lt[51][i].in[0] <== in[i]; + lt[51][i].in[1] <== 61; + and[332][i] = AND(); + and[332][i].a <== lt[50][i].out; + and[332][i].b <== lt[51][i].out; + lt[52][i] = LessEqThan(8); + lt[52][i].in[0] <== 63; + lt[52][i].in[1] <== in[i]; + lt[53][i] = LessEqThan(8); + lt[53][i].in[0] <== in[i]; + lt[53][i].in[1] <== 127; + and[333][i] = AND(); + and[333][i].a <== lt[52][i].out; + and[333][i].b <== lt[53][i].out; + and[334][i] = AND(); + and[334][i].a <== states[i][67]; + multi_or[41][i] = MultiOR(2); + multi_or[41][i].in[0] <== and[332][i].out; + multi_or[41][i].in[1] <== and[333][i].out; + and[334][i].b <== multi_or[41][i].out; + and[335][i] = AND(); + and[335][i].a <== states[i][77]; + and[335][i].b <== and[42][i].out; + multi_or[42][i] = MultiOR(3); + multi_or[42][i].in[0] <== and[331][i].out; + multi_or[42][i].in[1] <== and[334][i].out; + multi_or[42][i].in[2] <== and[335][i].out; + states[i+1][67] <== multi_or[42][i].out; + and[336][i] = AND(); + and[336][i].a <== states[i][64]; + and[336][i].b <== and[88][i].out; + and[337][i] = AND(); + and[337][i].a <== states[i][69]; + and[337][i].b <== and[90][i].out; + and[338][i] = AND(); + and[338][i].a <== states[i][70]; + and[338][i].b <== and[42][i].out; + and[339][i] = AND(); + and[339][i].a <== states[i][71]; + and[339][i].b <== and[93][i].out; + multi_or[43][i] = MultiOR(4); + multi_or[43][i].in[0] <== and[336][i].out; + multi_or[43][i].in[1] <== and[337][i].out; + multi_or[43][i].in[2] <== and[338][i].out; + multi_or[43][i].in[3] <== and[339][i].out; + states[i+1][68] <== multi_or[43][i].out; + and[340][i] = AND(); + and[340][i].a <== states[i][64]; + and[340][i].b <== eq[42][i].out; + states[i+1][69] <== and[340][i].out; + and[341][i] = AND(); + and[341][i].a <== states[i][64]; + and[341][i].b <== multi_or[25][i].out; + and[342][i] = AND(); + and[342][i].a <== states[i][72]; + and[342][i].b <== and[145][i].out; + and[343][i] = AND(); + and[343][i].a <== states[i][73]; + and[343][i].b <== and[42][i].out; + and[344][i] = AND(); + and[344][i].a <== states[i][74]; + and[344][i].b <== multi_or[26][i].out; + multi_or[44][i] = MultiOR(4); + multi_or[44][i].in[0] <== and[341][i].out; + multi_or[44][i].in[1] <== and[342][i].out; + multi_or[44][i].in[2] <== and[343][i].out; + multi_or[44][i].in[3] <== and[344][i].out; + states[i+1][70] <== multi_or[44][i].out; + and[345][i] = AND(); + and[345][i].a <== states[i][64]; + and[345][i].b <== eq[73][i].out; + states[i+1][71] <== and[345][i].out; + and[346][i] = AND(); + and[346][i].a <== states[i][64]; + and[346][i].b <== eq[74][i].out; + states[i+1][72] <== and[346][i].out; + and[347][i] = AND(); + and[347][i].a <== states[i][64]; + and[347][i].b <== multi_or[30][i].out; + states[i+1][73] <== and[347][i].out; + and[348][i] = AND(); + and[348][i].a <== states[i][64]; + and[348][i].b <== eq[78][i].out; + states[i+1][74] <== and[348][i].out; + and[349][i] = AND(); + and[349][i].a <== states[i][66]; + and[349][i].b <== eq[5][i].out; + states[i+1][75] <== and[349][i].out; + eq[82][i] = IsEqual(); + eq[82][i].in[0] <== in[i]; + eq[82][i].in[1] <== 62; + and[350][i] = AND(); + and[350][i].a <== states[i][67]; + and[350][i].b <== eq[82][i].out; + states[i+1][76] <== and[350][i].out; + and[351][i] = AND(); + and[351][i].a <== states[i][67]; + and[351][i].b <== and[88][i].out; + and[352][i] = AND(); + and[352][i].a <== states[i][78]; + and[352][i].b <== and[90][i].out; + and[353][i] = AND(); + and[353][i].a <== states[i][79]; + and[353][i].b <== and[42][i].out; + and[354][i] = AND(); + and[354][i].a <== states[i][80]; + and[354][i].b <== and[93][i].out; + multi_or[45][i] = MultiOR(4); + multi_or[45][i].in[0] <== and[351][i].out; + multi_or[45][i].in[1] <== and[352][i].out; + multi_or[45][i].in[2] <== and[353][i].out; + multi_or[45][i].in[3] <== and[354][i].out; + states[i+1][77] <== multi_or[45][i].out; + and[355][i] = AND(); + and[355][i].a <== states[i][67]; + and[355][i].b <== eq[42][i].out; + states[i+1][78] <== and[355][i].out; + and[356][i] = AND(); + and[356][i].a <== states[i][67]; + and[356][i].b <== multi_or[25][i].out; + and[357][i] = AND(); + and[357][i].a <== states[i][81]; + and[357][i].b <== and[145][i].out; + and[358][i] = AND(); + and[358][i].a <== states[i][82]; + and[358][i].b <== and[42][i].out; + and[359][i] = AND(); + and[359][i].a <== states[i][83]; + and[359][i].b <== multi_or[26][i].out; + multi_or[46][i] = MultiOR(4); + multi_or[46][i].in[0] <== and[356][i].out; + multi_or[46][i].in[1] <== and[357][i].out; + multi_or[46][i].in[2] <== and[358][i].out; + multi_or[46][i].in[3] <== and[359][i].out; + states[i+1][79] <== multi_or[46][i].out; + and[360][i] = AND(); + and[360][i].a <== states[i][67]; + and[360][i].b <== eq[73][i].out; + states[i+1][80] <== and[360][i].out; + and[361][i] = AND(); + and[361][i].a <== states[i][67]; + and[361][i].b <== eq[74][i].out; + states[i+1][81] <== and[361][i].out; + and[362][i] = AND(); + and[362][i].a <== states[i][67]; + and[362][i].b <== multi_or[30][i].out; + states[i+1][82] <== and[362][i].out; + and[363][i] = AND(); + and[363][i].a <== states[i][67]; + and[363][i].b <== eq[78][i].out; + states[i+1][83] <== and[363][i].out; + and[364][i] = AND(); + and[364][i].a <== states[i][76]; + states[i+1][84] <== and[364][i].out; + and[365][i] = AND(); + and[365][i].a <== states[i][84]; + and[365][i].b <== eq[3][i].out; + states[i+1][85] <== and[365][i].out; + and[366][i] = AND(); + and[366][i].a <== states[i][85]; + and[366][i].b <== eq[5][i].out; + states[i+1][86] <== and[366][i].out; + and[367][i] = AND(); + and[367][i].a <== states[i][86]; + states[i+1][87] <== and[367][i].out; + and[368][i] = AND(); + and[368][i].a <== states[i][87]; + and[368][i].b <== eq[3][i].out; + states[i+1][88] <== and[368][i].out; + and[369][i] = AND(); + and[369][i].a <== states[i][88]; + and[369][i].b <== eq[5][i].out; + states[i+1][89] <== and[369][i].out; + lt[54][i] = LessEqThan(8); + lt[54][i].in[0] <== 1; + lt[54][i].in[1] <== in[i]; + lt[55][i] = LessEqThan(8); + lt[55][i].in[0] <== in[i]; + lt[55][i].in[1] <== 46; + and[370][i] = AND(); + and[370][i].a <== lt[54][i].out; + and[370][i].b <== lt[55][i].out; + eq[83][i] = IsEqual(); + eq[83][i].in[0] <== in[i]; + eq[83][i].in[1] <== 48; + eq[84][i] = IsEqual(); + eq[84][i].in[0] <== in[i]; + eq[84][i].in[1] <== 49; + eq[85][i] = IsEqual(); + eq[85][i].in[0] <== in[i]; + eq[85][i].in[1] <== 50; + eq[86][i] = IsEqual(); + eq[86][i].in[0] <== in[i]; + eq[86][i].in[1] <== 52; + eq[87][i] = IsEqual(); + eq[87][i].in[0] <== in[i]; + eq[87][i].in[1] <== 53; + eq[88][i] = IsEqual(); + eq[88][i].in[0] <== in[i]; + eq[88][i].in[1] <== 54; + eq[89][i] = IsEqual(); + eq[89][i].in[0] <== in[i]; + eq[89][i].in[1] <== 55; + eq[90][i] = IsEqual(); + eq[90][i].in[0] <== in[i]; + eq[90][i].in[1] <== 56; + eq[91][i] = IsEqual(); + eq[91][i].in[0] <== in[i]; + eq[91][i].in[1] <== 57; + eq[92][i] = IsEqual(); + eq[92][i].in[0] <== in[i]; + eq[92][i].in[1] <== 58; + eq[93][i] = IsEqual(); + eq[93][i].in[0] <== in[i]; + eq[93][i].in[1] <== 59; + and[371][i] = AND(); + and[371][i].a <== states[i][76]; + multi_or[47][i] = MultiOR(15); + multi_or[47][i].in[0] <== and[370][i].out; + multi_or[47][i].in[1] <== and[333][i].out; + multi_or[47][i].in[2] <== eq[83][i].out; + multi_or[47][i].in[3] <== eq[84][i].out; + multi_or[47][i].in[4] <== eq[85][i].out; + multi_or[47][i].in[5] <== eq[8][i].out; + multi_or[47][i].in[6] <== eq[86][i].out; + multi_or[47][i].in[7] <== eq[87][i].out; + multi_or[47][i].in[8] <== eq[88][i].out; + multi_or[47][i].in[9] <== eq[89][i].out; + multi_or[47][i].in[10] <== eq[90][i].out; + multi_or[47][i].in[11] <== eq[91][i].out; + multi_or[47][i].in[12] <== eq[92][i].out; + multi_or[47][i].in[13] <== eq[93][i].out; + multi_or[47][i].in[14] <== eq[1][i].out; + and[371][i].b <== multi_or[47][i].out; + and[372][i] = AND(); + and[372][i].a <== states[i][86]; + and[372][i].b <== multi_or[47][i].out; + and[373][i] = AND(); + and[373][i].a <== states[i][89]; + and[373][i].b <== multi_or[47][i].out; + and[374][i] = AND(); + and[374][i].a <== states[i][90]; + and[374][i].b <== multi_or[47][i].out; + and[375][i] = AND(); + and[375][i].a <== states[i][91]; + and[375][i].b <== and[42][i].out; + multi_or[48][i] = MultiOR(5); + multi_or[48][i].in[0] <== and[371][i].out; + multi_or[48][i].in[1] <== and[372][i].out; + multi_or[48][i].in[2] <== and[373][i].out; + multi_or[48][i].in[3] <== and[374][i].out; + multi_or[48][i].in[4] <== and[375][i].out; + states[i+1][90] <== multi_or[48][i].out; + and[376][i] = AND(); + and[376][i].a <== states[i][76]; + and[376][i].b <== and[88][i].out; + and[377][i] = AND(); + and[377][i].a <== states[i][86]; + and[377][i].b <== and[88][i].out; + and[378][i] = AND(); + and[378][i].a <== states[i][89]; + and[378][i].b <== and[88][i].out; + and[379][i] = AND(); + and[379][i].a <== states[i][90]; + and[379][i].b <== and[88][i].out; + and[380][i] = AND(); + and[380][i].a <== states[i][92]; + and[380][i].b <== and[90][i].out; + and[381][i] = AND(); + and[381][i].a <== states[i][93]; + and[381][i].b <== and[42][i].out; + and[382][i] = AND(); + and[382][i].a <== states[i][94]; + and[382][i].b <== and[93][i].out; + multi_or[49][i] = MultiOR(7); + multi_or[49][i].in[0] <== and[376][i].out; + multi_or[49][i].in[1] <== and[377][i].out; + multi_or[49][i].in[2] <== and[378][i].out; + multi_or[49][i].in[3] <== and[379][i].out; + multi_or[49][i].in[4] <== and[380][i].out; + multi_or[49][i].in[5] <== and[381][i].out; + multi_or[49][i].in[6] <== and[382][i].out; + states[i+1][91] <== multi_or[49][i].out; + and[383][i] = AND(); + and[383][i].a <== states[i][76]; + and[383][i].b <== eq[42][i].out; + and[384][i] = AND(); + and[384][i].a <== states[i][86]; + and[384][i].b <== eq[42][i].out; + and[385][i] = AND(); + and[385][i].a <== states[i][89]; + and[385][i].b <== eq[42][i].out; + and[386][i] = AND(); + and[386][i].a <== states[i][90]; + and[386][i].b <== eq[42][i].out; + multi_or[50][i] = MultiOR(4); + multi_or[50][i].in[0] <== and[383][i].out; + multi_or[50][i].in[1] <== and[384][i].out; + multi_or[50][i].in[2] <== and[385][i].out; + multi_or[50][i].in[3] <== and[386][i].out; + states[i+1][92] <== multi_or[50][i].out; + and[387][i] = AND(); + and[387][i].a <== states[i][76]; + and[387][i].b <== multi_or[25][i].out; + and[388][i] = AND(); + and[388][i].a <== states[i][86]; + and[388][i].b <== multi_or[25][i].out; + and[389][i] = AND(); + and[389][i].a <== states[i][89]; + and[389][i].b <== multi_or[25][i].out; + and[390][i] = AND(); + and[390][i].a <== states[i][90]; + and[390][i].b <== multi_or[25][i].out; + and[391][i] = AND(); + and[391][i].a <== states[i][95]; + and[391][i].b <== and[145][i].out; + and[392][i] = AND(); + and[392][i].a <== states[i][96]; + and[392][i].b <== and[42][i].out; + and[393][i] = AND(); + and[393][i].a <== states[i][97]; + and[393][i].b <== multi_or[26][i].out; + multi_or[51][i] = MultiOR(7); + multi_or[51][i].in[0] <== and[387][i].out; + multi_or[51][i].in[1] <== and[388][i].out; + multi_or[51][i].in[2] <== and[389][i].out; + multi_or[51][i].in[3] <== and[390][i].out; + multi_or[51][i].in[4] <== and[391][i].out; + multi_or[51][i].in[5] <== and[392][i].out; + multi_or[51][i].in[6] <== and[393][i].out; + states[i+1][93] <== multi_or[51][i].out; + and[394][i] = AND(); + and[394][i].a <== states[i][76]; + and[394][i].b <== eq[73][i].out; + and[395][i] = AND(); + and[395][i].a <== states[i][86]; + and[395][i].b <== eq[73][i].out; + and[396][i] = AND(); + and[396][i].a <== states[i][89]; + and[396][i].b <== eq[73][i].out; + and[397][i] = AND(); + and[397][i].a <== states[i][90]; + and[397][i].b <== eq[73][i].out; + multi_or[52][i] = MultiOR(4); + multi_or[52][i].in[0] <== and[394][i].out; + multi_or[52][i].in[1] <== and[395][i].out; + multi_or[52][i].in[2] <== and[396][i].out; + multi_or[52][i].in[3] <== and[397][i].out; + states[i+1][94] <== multi_or[52][i].out; + and[398][i] = AND(); + and[398][i].a <== states[i][76]; + and[398][i].b <== eq[74][i].out; + and[399][i] = AND(); + and[399][i].a <== states[i][86]; + and[399][i].b <== eq[74][i].out; + and[400][i] = AND(); + and[400][i].a <== states[i][89]; + and[400][i].b <== eq[74][i].out; + and[401][i] = AND(); + and[401][i].a <== states[i][90]; + and[401][i].b <== eq[74][i].out; + multi_or[53][i] = MultiOR(4); + multi_or[53][i].in[0] <== and[398][i].out; + multi_or[53][i].in[1] <== and[399][i].out; + multi_or[53][i].in[2] <== and[400][i].out; + multi_or[53][i].in[3] <== and[401][i].out; + states[i+1][95] <== multi_or[53][i].out; + and[402][i] = AND(); + and[402][i].a <== states[i][76]; + and[402][i].b <== multi_or[30][i].out; + and[403][i] = AND(); + and[403][i].a <== states[i][86]; + and[403][i].b <== multi_or[30][i].out; + and[404][i] = AND(); + and[404][i].a <== states[i][89]; + and[404][i].b <== multi_or[30][i].out; + and[405][i] = AND(); + and[405][i].a <== states[i][90]; + and[405][i].b <== multi_or[30][i].out; + multi_or[54][i] = MultiOR(4); + multi_or[54][i].in[0] <== and[402][i].out; + multi_or[54][i].in[1] <== and[403][i].out; + multi_or[54][i].in[2] <== and[404][i].out; + multi_or[54][i].in[3] <== and[405][i].out; + states[i+1][96] <== multi_or[54][i].out; + and[406][i] = AND(); + and[406][i].a <== states[i][76]; + and[406][i].b <== eq[78][i].out; + and[407][i] = AND(); + and[407][i].a <== states[i][86]; + and[407][i].b <== eq[78][i].out; + and[408][i] = AND(); + and[408][i].a <== states[i][89]; + and[408][i].b <== eq[78][i].out; + and[409][i] = AND(); + and[409][i].a <== states[i][90]; + and[409][i].b <== eq[78][i].out; + multi_or[55][i] = MultiOR(4); + multi_or[55][i].in[0] <== and[406][i].out; + multi_or[55][i].in[1] <== and[407][i].out; + multi_or[55][i].in[2] <== and[408][i].out; + multi_or[55][i].in[3] <== and[409][i].out; + states[i+1][97] <== multi_or[55][i].out; + and[410][i] = AND(); + and[410][i].a <== states[i][90]; + and[410][i].b <== eq[0][i].out; + states[i+1][98] <== and[410][i].out; + eq[94][i] = IsEqual(); + eq[94][i].in[0] <== in[i]; + eq[94][i].in[1] <== 47; + and[411][i] = AND(); + and[411][i].a <== states[i][98]; + and[411][i].b <== eq[94][i].out; + and[412][i] = AND(); + and[412][i].a <== states[i][107]; + and[412][i].b <== eq[94][i].out; + multi_or[56][i] = MultiOR(2); + multi_or[56][i].in[0] <== and[411][i].out; + multi_or[56][i].in[1] <== and[412][i].out; + states[i+1][99] <== multi_or[56][i].out; + and[413][i] = AND(); + and[413][i].a <== states[i][98]; + and[413][i].b <== eq[1][i].out; + states[i+1][100] <== and[413][i].out; + and[414][i] = AND(); + and[414][i].a <== states[i][99]; + and[414][i].b <== eq[1][i].out; + states[i+1][101] <== and[414][i].out; + and[415][i] = AND(); + and[415][i].a <== states[i][99]; + and[415][i].b <== eq[2][i].out; + and[416][i] = AND(); + and[416][i].a <== states[i][108]; + and[416][i].b <== eq[2][i].out; + multi_or[57][i] = MultiOR(2); + multi_or[57][i].in[0] <== and[415][i].out; + multi_or[57][i].in[1] <== and[416][i].out; + states[i+1][102] <== multi_or[57][i].out; + and[417][i] = AND(); + and[417][i].a <== states[i][100]; + and[417][i].b <== eq[3][i].out; + states[i+1][103] <== and[417][i].out; + and[418][i] = AND(); + and[418][i].a <== states[i][101]; + and[418][i].b <== eq[3][i].out; + states[i+1][104] <== and[418][i].out; + and[419][i] = AND(); + and[419][i].a <== states[i][102]; + and[419][i].b <== eq[1][i].out; + states[i+1][105] <== and[419][i].out; + and[420][i] = AND(); + and[420][i].a <== states[i][102]; + and[420][i].b <== eq[4][i].out; + and[421][i] = AND(); + and[421][i].a <== states[i][112]; + and[421][i].b <== eq[4][i].out; + multi_or[58][i] = MultiOR(2); + multi_or[58][i].in[0] <== and[420][i].out; + multi_or[58][i].in[1] <== and[421][i].out; + states[i+1][106] <== multi_or[58][i].out; + and[422][i] = AND(); + and[422][i].a <== states[i][103]; + and[422][i].b <== eq[5][i].out; + states[i+1][107] <== and[422][i].out; + and[423][i] = AND(); + and[423][i].a <== states[i][104]; + and[423][i].b <== eq[5][i].out; + states[i+1][108] <== and[423][i].out; + and[424][i] = AND(); + and[424][i].a <== states[i][105]; + and[424][i].b <== eq[3][i].out; + states[i+1][109] <== and[424][i].out; + and[425][i] = AND(); + and[425][i].a <== states[i][106]; + and[425][i].b <== eq[1][i].out; + states[i+1][110] <== and[425][i].out; + and[426][i] = AND(); + and[426][i].a <== states[i][106]; + and[426][i].b <== eq[6][i].out; + and[427][i] = AND(); + and[427][i].a <== states[i][116]; + and[427][i].b <== eq[6][i].out; + multi_or[59][i] = MultiOR(2); + multi_or[59][i].in[0] <== and[426][i].out; + multi_or[59][i].in[1] <== and[427][i].out; + states[i+1][111] <== multi_or[59][i].out; + and[428][i] = AND(); + and[428][i].a <== states[i][109]; + and[428][i].b <== eq[5][i].out; + states[i+1][112] <== and[428][i].out; + and[429][i] = AND(); + and[429][i].a <== states[i][110]; + and[429][i].b <== eq[3][i].out; + states[i+1][113] <== and[429][i].out; + and[430][i] = AND(); + and[430][i].a <== states[i][111]; + and[430][i].b <== eq[1][i].out; + states[i+1][114] <== and[430][i].out; + and[431][i] = AND(); + and[431][i].a <== states[i][111]; + and[431][i].b <== eq[82][i].out; + and[432][i] = AND(); + and[432][i].a <== states[i][118]; + and[432][i].b <== eq[82][i].out; + multi_or[60][i] = MultiOR(2); + multi_or[60][i].in[0] <== and[431][i].out; + multi_or[60][i].in[1] <== and[432][i].out; + states[i+1][115] <== multi_or[60][i].out; + and[433][i] = AND(); + and[433][i].a <== states[i][113]; + and[433][i].b <== eq[5][i].out; + states[i+1][116] <== and[433][i].out; + and[434][i] = AND(); + and[434][i].a <== states[i][114]; + and[434][i].b <== eq[3][i].out; + states[i+1][117] <== and[434][i].out; + and[435][i] = AND(); + and[435][i].a <== states[i][117]; + and[435][i].b <== eq[5][i].out; + states[i+1][118] <== and[435][i].out; + from_zero_enabled[i] <== MultiNOR(118)([states_tmp[i+1][1], states[i+1][2], states[i+1][3], states[i+1][4], states[i+1][5], states[i+1][6], states[i+1][7], states[i+1][8], states[i+1][9], states[i+1][10], states[i+1][11], states[i+1][12], states[i+1][13], states[i+1][14], states[i+1][15], states[i+1][16], states[i+1][17], states[i+1][18], states[i+1][19], states[i+1][20], states[i+1][21], states[i+1][22], states[i+1][23], states[i+1][24], states[i+1][25], states[i+1][26], states[i+1][27], states[i+1][28], states[i+1][29], states[i+1][30], states[i+1][31], states[i+1][32], states[i+1][33], states[i+1][34], states[i+1][35], states[i+1][36], states[i+1][37], states[i+1][38], states[i+1][39], states[i+1][40], states[i+1][41], states[i+1][42], states[i+1][43], states[i+1][44], states[i+1][45], states[i+1][46], states[i+1][47], states[i+1][48], states[i+1][49], states[i+1][50], states[i+1][51], states[i+1][52], states[i+1][53], states[i+1][54], states[i+1][55], states[i+1][56], states[i+1][57], states[i+1][58], states[i+1][59], states[i+1][60], states[i+1][61], states[i+1][62], states[i+1][63], states[i+1][64], states[i+1][65], states[i+1][66], states[i+1][67], states[i+1][68], states[i+1][69], states[i+1][70], states[i+1][71], states[i+1][72], states[i+1][73], states[i+1][74], states[i+1][75], states[i+1][76], states[i+1][77], states[i+1][78], states[i+1][79], states[i+1][80], states[i+1][81], states[i+1][82], states[i+1][83], states[i+1][84], states[i+1][85], states[i+1][86], states[i+1][87], states[i+1][88], states[i+1][89], states[i+1][90], states[i+1][91], states[i+1][92], states[i+1][93], states[i+1][94], states[i+1][95], states[i+1][96], states[i+1][97], states[i+1][98], states[i+1][99], states[i+1][100], states[i+1][101], states[i+1][102], states[i+1][103], states[i+1][104], states[i+1][105], states[i+1][106], states[i+1][107], states[i+1][108], states[i+1][109], states[i+1][110], states[i+1][111], states[i+1][112], states[i+1][113], states[i+1][114], states[i+1][115], states[i+1][116], states[i+1][117], states[i+1][118]]); states[i+1][1] <== MultiOR(2)([states_tmp[i+1][1], from_zero_enabled[i] * and[0][i].out]); state_changed[i].in[0] <== states[i+1][1]; state_changed[i].in[1] <== states[i+1][2]; @@ -589,51 +2633,151 @@ template CommandRegex(msg_bytes) { state_changed[i].in[31] <== states[i+1][32]; state_changed[i].in[32] <== states[i+1][33]; state_changed[i].in[33] <== states[i+1][34]; + state_changed[i].in[34] <== states[i+1][35]; + state_changed[i].in[35] <== states[i+1][36]; + state_changed[i].in[36] <== states[i+1][37]; + state_changed[i].in[37] <== states[i+1][38]; + state_changed[i].in[38] <== states[i+1][39]; + state_changed[i].in[39] <== states[i+1][40]; + state_changed[i].in[40] <== states[i+1][41]; + state_changed[i].in[41] <== states[i+1][42]; + state_changed[i].in[42] <== states[i+1][43]; + state_changed[i].in[43] <== states[i+1][44]; + state_changed[i].in[44] <== states[i+1][45]; + state_changed[i].in[45] <== states[i+1][46]; + state_changed[i].in[46] <== states[i+1][47]; + state_changed[i].in[47] <== states[i+1][48]; + state_changed[i].in[48] <== states[i+1][49]; + state_changed[i].in[49] <== states[i+1][50]; + state_changed[i].in[50] <== states[i+1][51]; + state_changed[i].in[51] <== states[i+1][52]; + state_changed[i].in[52] <== states[i+1][53]; + state_changed[i].in[53] <== states[i+1][54]; + state_changed[i].in[54] <== states[i+1][55]; + state_changed[i].in[55] <== states[i+1][56]; + state_changed[i].in[56] <== states[i+1][57]; + state_changed[i].in[57] <== states[i+1][58]; + state_changed[i].in[58] <== states[i+1][59]; + state_changed[i].in[59] <== states[i+1][60]; + state_changed[i].in[60] <== states[i+1][61]; + state_changed[i].in[61] <== states[i+1][62]; + state_changed[i].in[62] <== states[i+1][63]; + state_changed[i].in[63] <== states[i+1][64]; + state_changed[i].in[64] <== states[i+1][65]; + state_changed[i].in[65] <== states[i+1][66]; + state_changed[i].in[66] <== states[i+1][67]; + state_changed[i].in[67] <== states[i+1][68]; + state_changed[i].in[68] <== states[i+1][69]; + state_changed[i].in[69] <== states[i+1][70]; + state_changed[i].in[70] <== states[i+1][71]; + state_changed[i].in[71] <== states[i+1][72]; + state_changed[i].in[72] <== states[i+1][73]; + state_changed[i].in[73] <== states[i+1][74]; + state_changed[i].in[74] <== states[i+1][75]; + state_changed[i].in[75] <== states[i+1][76]; + state_changed[i].in[76] <== states[i+1][77]; + state_changed[i].in[77] <== states[i+1][78]; + state_changed[i].in[78] <== states[i+1][79]; + state_changed[i].in[79] <== states[i+1][80]; + state_changed[i].in[80] <== states[i+1][81]; + state_changed[i].in[81] <== states[i+1][82]; + state_changed[i].in[82] <== states[i+1][83]; + state_changed[i].in[83] <== states[i+1][84]; + state_changed[i].in[84] <== states[i+1][85]; + state_changed[i].in[85] <== states[i+1][86]; + state_changed[i].in[86] <== states[i+1][87]; + state_changed[i].in[87] <== states[i+1][88]; + state_changed[i].in[88] <== states[i+1][89]; + state_changed[i].in[89] <== states[i+1][90]; + state_changed[i].in[90] <== states[i+1][91]; + state_changed[i].in[91] <== states[i+1][92]; + state_changed[i].in[92] <== states[i+1][93]; + state_changed[i].in[93] <== states[i+1][94]; + state_changed[i].in[94] <== states[i+1][95]; + state_changed[i].in[95] <== states[i+1][96]; + state_changed[i].in[96] <== states[i+1][97]; + state_changed[i].in[97] <== states[i+1][98]; + state_changed[i].in[98] <== states[i+1][99]; + state_changed[i].in[99] <== states[i+1][100]; + state_changed[i].in[100] <== states[i+1][101]; + state_changed[i].in[101] <== states[i+1][102]; + state_changed[i].in[102] <== states[i+1][103]; + state_changed[i].in[103] <== states[i+1][104]; + state_changed[i].in[104] <== states[i+1][105]; + state_changed[i].in[105] <== states[i+1][106]; + state_changed[i].in[106] <== states[i+1][107]; + state_changed[i].in[107] <== states[i+1][108]; + state_changed[i].in[108] <== states[i+1][109]; + state_changed[i].in[109] <== states[i+1][110]; + state_changed[i].in[110] <== states[i+1][111]; + state_changed[i].in[111] <== states[i+1][112]; + state_changed[i].in[112] <== states[i+1][113]; + state_changed[i].in[113] <== states[i+1][114]; + state_changed[i].in[114] <== states[i+1][115]; + state_changed[i].in[115] <== states[i+1][116]; + state_changed[i].in[116] <== states[i+1][117]; + state_changed[i].in[117] <== states[i+1][118]; } component is_accepted = MultiOR(num_bytes+1); for (var i = 0; i <= num_bytes; i++) { - is_accepted.in[i] <== states[i][34]; + is_accepted.in[i] <== states[i][115]; } out <== is_accepted.out; signal is_consecutive[msg_bytes+1][3]; is_consecutive[msg_bytes][2] <== 0; for (var i = 0; i < msg_bytes; i++) { - is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][34] * (1 - is_consecutive[msg_bytes-i][2]) + is_consecutive[msg_bytes-i][2]; + is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][115] * (1 - is_consecutive[msg_bytes-i][2]) + is_consecutive[msg_bytes-i][2]; is_consecutive[msg_bytes-1-i][1] <== state_changed[msg_bytes-i].out * is_consecutive[msg_bytes-1-i][0]; - is_consecutive[msg_bytes-1-i][2] <== ORAnd()([(1 - from_zero_enabled[msg_bytes-i+1]), states[num_bytes-i][34], is_consecutive[msg_bytes-1-i][1]]); + is_consecutive[msg_bytes-1-i][2] <== ORAnd()([(1 - from_zero_enabled[msg_bytes-i+1]), states[num_bytes-i][115], is_consecutive[msg_bytes-1-i][1]]); } - // substrings calculated: [{(20, 21), (20, 22), (20, 23), (20, 24), (20, 25), (20, 26), (20, 27), (20, 28), (21, 21), (21, 22), (21, 23), (21, 24), (21, 25), (21, 26), (21, 27), (21, 28), (22, 21), (23, 22), (24, 22), (25, 22), (26, 24), (27, 24), (28, 24)}] - signal prev_states0[23][msg_bytes]; + // substrings calculated: [{(76, 90), (76, 91), (76, 92), (76, 93), (76, 94), (76, 95), (76, 96), (76, 97), (86, 90), (86, 91), (86, 92), (86, 93), (86, 94), (86, 95), (86, 96), (86, 97), (89, 90), (89, 91), (89, 92), (89, 93), (89, 94), (89, 95), (89, 96), (89, 97), (90, 90), (90, 91), (90, 92), (90, 93), (90, 94), (90, 95), (90, 96), (90, 97), (91, 90), (92, 91), (93, 91), (94, 91), (95, 93), (96, 93), (97, 93)}] + signal prev_states0[39][msg_bytes]; signal is_substr0[msg_bytes]; signal is_reveal0[msg_bytes]; signal output reveal0[msg_bytes]; for (var i = 0; i < msg_bytes; i++) { - // the 0-th substring transitions: [(20, 21), (20, 22), (20, 23), (20, 24), (20, 25), (20, 26), (20, 27), (20, 28), (21, 21), (21, 22), (21, 23), (21, 24), (21, 25), (21, 26), (21, 27), (21, 28), (22, 21), (23, 22), (24, 22), (25, 22), (26, 24), (27, 24), (28, 24)] - prev_states0[0][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; - prev_states0[1][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; - prev_states0[2][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; - prev_states0[3][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; - prev_states0[4][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; - prev_states0[5][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; - prev_states0[6][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; - prev_states0[7][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][20]; - prev_states0[8][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[9][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[10][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[11][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[12][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[13][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[14][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[15][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][21]; - prev_states0[16][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][22]; - prev_states0[17][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][23]; - prev_states0[18][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][24]; - prev_states0[19][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][25]; - prev_states0[20][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][26]; - prev_states0[21][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][27]; - prev_states0[22][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][28]; - is_substr0[i] <== MultiOR(23)([prev_states0[0][i] * states[i+2][21], prev_states0[1][i] * states[i+2][22], prev_states0[2][i] * states[i+2][23], prev_states0[3][i] * states[i+2][24], prev_states0[4][i] * states[i+2][25], prev_states0[5][i] * states[i+2][26], prev_states0[6][i] * states[i+2][27], prev_states0[7][i] * states[i+2][28], prev_states0[8][i] * states[i+2][21], prev_states0[9][i] * states[i+2][22], prev_states0[10][i] * states[i+2][23], prev_states0[11][i] * states[i+2][24], prev_states0[12][i] * states[i+2][25], prev_states0[13][i] * states[i+2][26], prev_states0[14][i] * states[i+2][27], prev_states0[15][i] * states[i+2][28], prev_states0[16][i] * states[i+2][21], prev_states0[17][i] * states[i+2][22], prev_states0[18][i] * states[i+2][22], prev_states0[19][i] * states[i+2][22], prev_states0[20][i] * states[i+2][24], prev_states0[21][i] * states[i+2][24], prev_states0[22][i] * states[i+2][24]]); + // the 0-th substring transitions: [(76, 90), (76, 91), (76, 92), (76, 93), (76, 94), (76, 95), (76, 96), (76, 97), (86, 90), (86, 91), (86, 92), (86, 93), (86, 94), (86, 95), (86, 96), (86, 97), (89, 90), (89, 91), (89, 92), (89, 93), (89, 94), (89, 95), (89, 96), (89, 97), (90, 90), (90, 91), (90, 92), (90, 93), (90, 94), (90, 95), (90, 96), (90, 97), (91, 90), (92, 91), (93, 91), (94, 91), (95, 93), (96, 93), (97, 93)] + prev_states0[0][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; + prev_states0[1][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; + prev_states0[2][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; + prev_states0[3][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; + prev_states0[4][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; + prev_states0[5][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; + prev_states0[6][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; + prev_states0[7][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; + prev_states0[8][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; + prev_states0[9][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; + prev_states0[10][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; + prev_states0[11][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; + prev_states0[12][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; + prev_states0[13][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; + prev_states0[14][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; + prev_states0[15][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; + prev_states0[16][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; + prev_states0[17][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; + prev_states0[18][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; + prev_states0[19][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; + prev_states0[20][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; + prev_states0[21][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; + prev_states0[22][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; + prev_states0[23][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; + prev_states0[24][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; + prev_states0[25][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; + prev_states0[26][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; + prev_states0[27][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; + prev_states0[28][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; + prev_states0[29][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; + prev_states0[30][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; + prev_states0[31][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; + prev_states0[32][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][91]; + prev_states0[33][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][92]; + prev_states0[34][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][93]; + prev_states0[35][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][94]; + prev_states0[36][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][95]; + prev_states0[37][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][96]; + prev_states0[38][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][97]; + is_substr0[i] <== MultiOR(39)([prev_states0[0][i] * states[i+2][90], prev_states0[1][i] * states[i+2][91], prev_states0[2][i] * states[i+2][92], prev_states0[3][i] * states[i+2][93], prev_states0[4][i] * states[i+2][94], prev_states0[5][i] * states[i+2][95], prev_states0[6][i] * states[i+2][96], prev_states0[7][i] * states[i+2][97], prev_states0[8][i] * states[i+2][90], prev_states0[9][i] * states[i+2][91], prev_states0[10][i] * states[i+2][92], prev_states0[11][i] * states[i+2][93], prev_states0[12][i] * states[i+2][94], prev_states0[13][i] * states[i+2][95], prev_states0[14][i] * states[i+2][96], prev_states0[15][i] * states[i+2][97], prev_states0[16][i] * states[i+2][90], prev_states0[17][i] * states[i+2][91], prev_states0[18][i] * states[i+2][92], prev_states0[19][i] * states[i+2][93], prev_states0[20][i] * states[i+2][94], prev_states0[21][i] * states[i+2][95], prev_states0[22][i] * states[i+2][96], prev_states0[23][i] * states[i+2][97], prev_states0[24][i] * states[i+2][90], prev_states0[25][i] * states[i+2][91], prev_states0[26][i] * states[i+2][92], prev_states0[27][i] * states[i+2][93], prev_states0[28][i] * states[i+2][94], prev_states0[29][i] * states[i+2][95], prev_states0[30][i] * states[i+2][96], prev_states0[31][i] * states[i+2][97], prev_states0[32][i] * states[i+2][90], prev_states0[33][i] * states[i+2][91], prev_states0[34][i] * states[i+2][91], prev_states0[35][i] * states[i+2][91], prev_states0[36][i] * states[i+2][93], prev_states0[37][i] * states[i+2][93], prev_states0[38][i] * states[i+2][93]]); is_reveal0[i] <== MultiAND(3)([out, is_substr0[i], is_consecutive[i][2]]); reveal0[i] <== in[i+1] * is_reveal0[i]; } diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example index fe8fd1be..5b1428cb 100644 --- a/packages/relayer/.env.example +++ b/packages/relayer/.env.example @@ -6,7 +6,7 @@ CHAIN_ID=11155111 # Chain ID of the testnet. SMTP_SERVER= -PROVER_ADDRESS="https://zkemail--email-auth-prover-v1-0-4-flask-app.modal.run" +PROVER_ADDRESS="https://zkemail--email-auth-prover-body-parsing-v1-0-0-flask-app.modal.run" DATABASE_URL= "postgres://test@localhost/emailauth_test" RELAYER_EMAIL_ADDR= diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index d883d951..5a279ef4 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -24,7 +24,7 @@ serde_json = "1.0.68" tiny_http = "0.12.0" lettre = { version = "0.10.4", features = ["tokio1", "tokio1-native-tls"] } ethers = { version = "2.0.10", features = ["abigen"] } -relayer-utils = { git = "https://github.com/zkemail/relayer-utils", rev = "fd6c7bf" } +relayer-utils = { path = "../../../relayer-utils" } futures = "0.3.28" sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } regex = "1.10.2" diff --git a/packages/relayer/eml_templates/acceptance_request.html b/packages/relayer/eml_templates/acceptance_request.html index 4dfcf524..0620e55d 100644 --- a/packages/relayer/eml_templates/acceptance_request.html +++ b/packages/relayer/eml_templates/acceptance_request.html @@ -167,7 +167,7 @@ " > You have received an guardian request from the wallet address {{walletAddress}}. - {{command}}. +
{{command}}
. Reply "Confirm" to this email to accept the request.
Your request ID is #{{requestId}}. diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 2ebf23e3..10750c60 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -8,10 +8,10 @@ use ethers::{ abi::{encode, Token}, utils::keccak256, }; -use relayer_utils::{extract_substr_idxes, generate_email_circuit_input, LOG}; +use relayer_utils::{extract_substr_idxes, generate_email_circuit_input, EmailCircuitParams, LOG}; const DOMAIN_FIELDS: usize = 9; -const SUBJECT_FIELDS: usize = 20; +const SUBJECT_FIELDS: usize = 9; const EMAIL_ADDR_FIELDS: usize = 9; pub async fn handle_email(email: String) -> Result { @@ -26,7 +26,7 @@ pub async fn handle_email(email: String) -> Result { serde_json::from_str(include_str!("./regex_json/request_def.json"))?; let request_idxes = extract_substr_idxes(&email, &request_decomposed_def)?; if request_idxes.is_empty() { - bail!(WRONG_SUBJECT_FORMAT); + bail!(WRONG_COMMAND_FORMAT); } info!(LOG, "Request idxes: {:?}", request_idxes); let request_id = &email[request_idxes[0].0..request_idxes[0].1]; @@ -77,7 +77,7 @@ pub async fn handle_email(email: String) -> Result { } if !request.is_for_recovery { - let subject_template = CLIENT + let command_template = CLIENT .get_acceptance_subject_templates( &request.controller_eth_addr, request.template_idx, @@ -85,10 +85,10 @@ pub async fn handle_email(email: String) -> Result { .await?; let result = - extract_template_vals_and_skipped_subject_idx(&email_body, subject_template); - let (subject_params, skipped_subject_prefix) = match result { - Ok((subject_params, skipped_subject_prefix)) => { - (subject_params, skipped_subject_prefix) + extract_template_vals_and_skipped_subject_idx(&email_body, command_template); + let (command_params, skipped_command_prefix) = match result { + Ok((command_params, skipped_command_prefix)) => { + (command_params, skipped_command_prefix) } Err(e) => { return Ok(EmailAuthEvent::Error { @@ -98,7 +98,7 @@ pub async fn handle_email(email: String) -> Result { } }; - let subject_params_encoded: Vec = subject_params + let command_params_encoded: Vec = command_params .iter() .map(|param| param.abi_encode(None).unwrap()) .collect(); @@ -114,23 +114,30 @@ pub async fn handle_email(email: String) -> Result { let circuit_input = generate_email_circuit_input( &email, &AccountCode::from(hex_to_field(&format!("0x{}", &account_code_str))?), - None, + Some(EmailCircuitParams { + max_header_length: Some(1024), + max_body_length: Some(5020), + sha_precompute_selector: Some(SHA_PRECOMPUTE_SELECTOR.to_string()), + ignore_body_hash_check: Some(false), + }), ) .await?; let (proof, public_signals) = generate_proof(&circuit_input, "email_auth", PROVER_ADDRESS.get().unwrap()).await?; + info!(LOG, "Public signals: {:?}", public_signals); + let account_salt = u256_to_bytes32(&public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 3]); let is_code_exist = public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); - let masked_subject = get_masked_subject(public_signals.clone(), DOMAIN_FIELDS + 3)?; + let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; let email_proof = EmailProof { proof: proof, domain_name: parsed_email.get_email_domain()?, public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_subject, + masked_subject: masked_command, email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), account_salt, is_code_exist, @@ -138,8 +145,8 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), - subject_params: subject_params_encoded, - skiped_subject_prefix: skipped_subject_prefix.into(), + subject_params: command_params_encoded, + skiped_subject_prefix: skipped_command_prefix.into(), proof: email_proof.clone(), }; @@ -213,15 +220,15 @@ pub async fn handle_email(email: String) -> Result { Err(e) => Err(anyhow!("Failed to handle acceptance: {}", e)), } } else { - let subject_template = CLIENT + let command_template = CLIENT .get_recovery_subject_templates(&request.controller_eth_addr, request.template_idx) .await?; let result = - extract_template_vals_and_skipped_subject_idx(&email_body, subject_template); - let (subject_params, skipped_subject_prefix) = match result { - Ok((subject_params, skipped_subject_prefix)) => { - (subject_params, skipped_subject_prefix) + extract_template_vals_and_skipped_subject_idx(&email_body, command_template); + let (command_params, skipped_command_prefix) = match result { + Ok((command_params, skipped_command_prefix)) => { + (command_params, skipped_command_prefix) } Err(e) => { return Ok(EmailAuthEvent::Error { @@ -231,7 +238,7 @@ pub async fn handle_email(email: String) -> Result { } }; - let subject_params_encoded: Vec = subject_params + let command_params_encoded: Vec = command_params .iter() .map(|param| param.abi_encode(None).unwrap()) .collect(); @@ -256,14 +263,14 @@ pub async fn handle_email(email: String) -> Result { let account_salt = u256_to_bytes32(&public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 3]); let is_code_exist = public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); - let masked_subject = get_masked_subject(public_signals.clone(), DOMAIN_FIELDS + 3)?; + let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; let email_proof = EmailProof { proof: proof, domain_name: parsed_email.get_email_domain()?, public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_subject, + masked_subject: masked_command, email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), account_salt, is_code_exist, @@ -271,8 +278,8 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), - subject_params: subject_params_encoded, - skiped_subject_prefix: skipped_subject_prefix.into(), + subject_params: command_params_encoded, + skiped_subject_prefix: skipped_command_prefix.into(), proof: email_proof.clone(), }; @@ -339,15 +346,15 @@ pub async fn handle_email(email: String) -> Result { } } else { if request.is_for_recovery { - let subject_template = CLIENT + let command_template = CLIENT .get_recovery_subject_templates(&request.controller_eth_addr, request.template_idx) .await?; let result = - extract_template_vals_and_skipped_subject_idx(&email_body, subject_template); - let (subject_params, skipped_subject_prefix) = match result { - Ok((subject_params, skipped_subject_prefix)) => { - (subject_params, skipped_subject_prefix) + extract_template_vals_and_skipped_subject_idx(&email_body, command_template); + let (command_params, skipped_command_prefix) = match result { + Ok((command_params, skipped_command_prefix)) => { + (command_params, skipped_command_prefix) } Err(e) => { return Ok(EmailAuthEvent::Error { @@ -357,7 +364,7 @@ pub async fn handle_email(email: String) -> Result { } }; - let subject_params_encoded: Vec = subject_params + let command_params_encoded: Vec = command_params .iter() .map(|param| param.abi_encode(None).unwrap()) .collect(); @@ -382,14 +389,14 @@ pub async fn handle_email(email: String) -> Result { let account_salt = u256_to_bytes32(&public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 3]); let is_code_exist = public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); - let masked_subject = get_masked_subject(public_signals.clone(), DOMAIN_FIELDS + 3)?; + let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; let email_proof = EmailProof { proof: proof, domain_name: parsed_email.get_email_domain()?, public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_subject, + masked_subject: masked_command, email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), account_salt, is_code_exist, @@ -397,8 +404,8 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), - subject_params: subject_params_encoded, - skiped_subject_prefix: skipped_subject_prefix.into(), + subject_params: command_params_encoded, + skiped_subject_prefix: skipped_command_prefix.into(), proof: email_proof.clone(), }; @@ -471,21 +478,21 @@ pub async fn handle_email(email: String) -> Result { } } -pub fn get_masked_subject(public_signals: Vec, start_idx: usize) -> Result { +pub fn get_masked_command(public_signals: Vec, start_idx: usize) -> Result { // Gather signals from start_idx to start_idx + SUBJECT_FIELDS - let mut subject_bytes = Vec::new(); + let mut command_bytes = Vec::new(); for i in start_idx..start_idx + SUBJECT_FIELDS { let signal = public_signals[i as usize]; if signal == U256::zero() { break; } let bytes = u256_to_bytes32_little(&signal); - subject_bytes.extend_from_slice(&bytes); + command_bytes.extend_from_slice(&bytes); } // Bytes to string, removing null bytes - let subject = String::from_utf8(subject_bytes.into_iter().filter(|&b| b != 0u8).collect()) + let command = String::from_utf8(command_bytes.into_iter().filter(|&b| b != 0u8).collect()) .map_err(|e| anyhow!("Failed to convert bytes to string: {}", e))?; - Ok(subject) + Ok(command) } diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs index acd74822..3d0499a8 100644 --- a/packages/relayer/src/database.rs +++ b/packages/relayer/src/database.rs @@ -74,6 +74,7 @@ impl Database { } pub(crate) async fn get_credentials(&self, account_code: &str) -> Result> { + println!("account_code: {}", account_code); let row = sqlx::query("SELECT * FROM credentials WHERE account_code = $1") .bind(account_code) .fetch_optional(&self.db) diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index f7fe786c..261a0bf4 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -110,11 +110,15 @@ pub async fn request_status_api(payload: RequestStatusRequest) -> Result Response { + println!("Account Code: {:?}", payload.account_code); + let subject_template = CLIENT .get_acceptance_subject_templates(&payload.controller_eth_addr, payload.template_idx) .await .unwrap(); + println!("Subject template: {:?}", subject_template); + let subject_params = extract_template_vals(&payload.subject, subject_template); if subject_params.is_err() { @@ -135,8 +139,12 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response Response = // serde_json::from_str(include_str!("../../permitted_wallets.json")).unwrap(); @@ -194,6 +204,8 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response Response(); + println!("Request ID: {:?}", request_id); while let Ok(Some(request)) = DB.get_request(request_id).await { request_id = rand::thread_rng().gen::(); } let account_salt = calculate_account_salt(&payload.guardian_email_addr, &payload.account_code); + println!("Account Salt: {:?}", account_salt); if DB .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) diff --git a/packages/relayer/src/utils/strings.rs b/packages/relayer/src/utils/strings.rs index b92bbc97..c33a1e7f 100644 --- a/packages/relayer/src/utils/strings.rs +++ b/packages/relayer/src/utils/strings.rs @@ -21,7 +21,7 @@ pub const IMAP_RECONNECT_ERROR: &str = "Failed to reconnect"; pub const SMTP_RECONNECT_ERROR: &str = "Failed to reconnect"; pub const CANNOT_GET_EMAIL_FROM_QUEUE: &str = "Cannot get email from mpsc in handle email task"; pub const NOT_MY_SENDER: &str = "NOT_MY_SENDER"; -pub const WRONG_SUBJECT_FORMAT: &str = "Wrong subject format"; +pub const WRONG_COMMAND_FORMAT: &str = "Wrong command format"; // Core REGEX'es and Commands pub const STRING_REGEX: &str = r"\S+"; @@ -29,6 +29,7 @@ pub const UINT_REGEX: &str = r"\d+"; pub const INT_REGEX: &str = r"-?\d+"; pub const ETH_ADDR_REGEX: &str = r"0x[a-fA-F0-9]{40}"; pub const DECIMALS_REGEX: &str = r"\d+\.\d+"; +pub const SHA_PRECOMPUTE_SELECTOR: &str = r#"(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?\"(=\r\n)?[^\"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^\"]*(=\r\n)?\"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?([^<>\/]+)(<(=\r\n)?\/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>(=\r\n)?)"#; // DKIM ORACLE ARGS pub const CANISTER_ID_KEY: &str = "CANISTER_ID"; From 19b46dfb3b186a4fe0a6de8d11c5a6cb72703881 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Wed, 4 Sep 2024 10:31:44 +0900 Subject: [PATCH 022/121] Fix circuit name in core.py --- packages/prover/Dockerfile | 4 ++-- packages/prover/core.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/prover/Dockerfile b/packages/prover/Dockerfile index 4a0b364b..7997cc71 100644 --- a/packages/prover/Dockerfile +++ b/packages/prover/Dockerfile @@ -1,5 +1,6 @@ FROM python:3.10 + RUN apt-get update && apt-get upgrade -y # Update the package list and install necessary dependencies RUN apt-get update && \ @@ -9,8 +10,7 @@ RUN apt-get update && \ RUN npm install -g n RUN n 18 RUN npm install -g yarn snarkjs - -RUN git clone https://github.com/zkemail/ether-email-auth.git +RUN git clone -b feat/body-parsing-circuit https://github.com/zkemail/ether-email-auth.git WORKDIR /ether-email-auth/packages/prover RUN pip install -r requirements.txt RUN cp ./circom_proofgen.sh /root diff --git a/packages/prover/core.py b/packages/prover/core.py index d182cc81..194fd9f0 100644 --- a/packages/prover/core.py +++ b/packages/prover/core.py @@ -7,7 +7,7 @@ def gen_email_auth_proof(nonce: str, is_local: bool, input: dict) -> dict: - circuit_name = "email_auth" + circuit_name = "email_auth_with_body_parsing_with_qp_encoding" print("Store input") store_input(circuit_name, nonce, input) print("Generate proof") From d19278139686e2b90f43fea81f43a3dfffc18424 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Wed, 4 Sep 2024 08:39:02 +0530 Subject: [PATCH 023/121] chore: update version --- Cargo.lock | 2 +- packages/circuits/package.json | 2 +- packages/circuits/src/regexes/command.json | 4 +- .../circuits/src/regexes/command_regex.circom | 3495 +++++------------ 4 files changed, 1042 insertions(+), 2461 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ce5d4f19..ac6a1d8f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4138,7 +4138,7 @@ dependencies = [ [[package]] name = "relayer-utils" -version = "0.3.3" +version = "0.3.4" dependencies = [ "anyhow", "base64 0.21.7", diff --git a/packages/circuits/package.json b/packages/circuits/package.json index fbe20f0c..f97701e6 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -13,7 +13,7 @@ "dependencies": { "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.3.3", + "@zk-email/relayer-utils": "^0.3.4", "commander": "^11.0.0", "snarkjs": "^0.7.0" }, diff --git a/packages/circuits/src/regexes/command.json b/packages/circuits/src/regexes/command.json index c35fc64b..89b09638 100644 --- a/packages/circuits/src/regexes/command.json +++ b/packages/circuits/src/regexes/command.json @@ -2,7 +2,7 @@ "parts": [ { "is_public": false, - "regex_def": "(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?\"(=\r\n)?[^\"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^\"]*(=\r\n)?\"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?" + "regex_def": "(
]*>)" }, { "is_public": true, @@ -10,7 +10,7 @@ }, { "is_public": false, - "regex_def": "(<(=\r\n)?/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>)" + "regex_def": "
" } ] } diff --git a/packages/circuits/src/regexes/command_regex.circom b/packages/circuits/src/regexes/command_regex.circom index e4c2e2b3..3c4de75f 100644 --- a/packages/circuits/src/regexes/command_regex.circom +++ b/packages/circuits/src/regexes/command_regex.circom @@ -2,7 +2,7 @@ pragma circom 2.1.5; include "@zk-email/zk-regex-circom/circuits/regex_helpers.circom"; -// regex: (<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?"(=\r\n)?[^"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^"]*(=\r\n)?"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?[^<>/]+(<(=\r\n)?/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>) +// regex: (
]*>)[^<>/]+
template CommandRegex(msg_bytes) { signal input msg[msg_bytes]; signal output out; @@ -14,22 +14,22 @@ template CommandRegex(msg_bytes) { in[i+1] <== msg[i]; } - component eq[95][num_bytes]; - component lt[56][num_bytes]; - component and[436][num_bytes]; - component multi_or[61][num_bytes]; - signal states[num_bytes+1][119]; - signal states_tmp[num_bytes+1][119]; + component eq[82][num_bytes]; + component lt[38][num_bytes]; + component and[167][num_bytes]; + component multi_or[36][num_bytes]; + signal states[num_bytes+1][56]; + signal states_tmp[num_bytes+1][56]; signal from_zero_enabled[num_bytes+1]; from_zero_enabled[num_bytes] <== 0; component state_changed[num_bytes]; - for (var i = 1; i < 119; i++) { + for (var i = 1; i < 56; i++) { states[0][i] <== 0; } for (var i = 0; i < num_bytes; i++) { - state_changed[i] = MultiOR(118); + state_changed[i] = MultiOR(55); states[i][0] <== 1; eq[0][i] = IsEqual(); eq[0][i].in[0] <== in[i]; @@ -40,2564 +40,1224 @@ template CommandRegex(msg_bytes) { states_tmp[i+1][1] <== 0; eq[1][i] = IsEqual(); eq[1][i].in[0] <== in[i]; - eq[1][i].in[1] <== 61; + eq[1][i].in[1] <== 100; and[1][i] = AND(); and[1][i].a <== states[i][1]; and[1][i].b <== eq[1][i].out; states[i+1][2] <== and[1][i].out; eq[2][i] = IsEqual(); eq[2][i].in[0] <== in[i]; - eq[2][i].in[1] <== 100; + eq[2][i].in[1] <== 105; and[2][i] = AND(); - and[2][i].a <== states[i][1]; + and[2][i].a <== states[i][2]; and[2][i].b <== eq[2][i].out; - and[3][i] = AND(); - and[3][i].a <== states[i][7]; - and[3][i].b <== eq[2][i].out; - multi_or[0][i] = MultiOR(2); - multi_or[0][i].in[0] <== and[2][i].out; - multi_or[0][i].in[1] <== and[3][i].out; - states[i+1][3] <== multi_or[0][i].out; + states[i+1][3] <== and[2][i].out; eq[3][i] = IsEqual(); eq[3][i].in[0] <== in[i]; - eq[3][i].in[1] <== 13; - and[4][i] = AND(); - and[4][i].a <== states[i][2]; - and[4][i].b <== eq[3][i].out; - states[i+1][4] <== and[4][i].out; - and[5][i] = AND(); - and[5][i].a <== states[i][3]; - and[5][i].b <== eq[1][i].out; - states[i+1][5] <== and[5][i].out; + eq[3][i].in[1] <== 118; + and[3][i] = AND(); + and[3][i].a <== states[i][3]; + and[3][i].b <== eq[3][i].out; + states[i+1][4] <== and[3][i].out; eq[4][i] = IsEqual(); eq[4][i].in[0] <== in[i]; - eq[4][i].in[1] <== 105; + eq[4][i].in[1] <== 32; + and[4][i] = AND(); + and[4][i].a <== states[i][4]; + and[4][i].b <== eq[4][i].out; + states[i+1][5] <== and[4][i].out; + and[5][i] = AND(); + and[5][i].a <== states[i][5]; + and[5][i].b <== eq[2][i].out; + states[i+1][6] <== and[5][i].out; and[6][i] = AND(); - and[6][i].a <== states[i][3]; - and[6][i].b <== eq[4][i].out; - and[7][i] = AND(); - and[7][i].a <== states[i][11]; - and[7][i].b <== eq[4][i].out; - multi_or[1][i] = MultiOR(2); - multi_or[1][i].in[0] <== and[6][i].out; - multi_or[1][i].in[1] <== and[7][i].out; - states[i+1][6] <== multi_or[1][i].out; + and[6][i].a <== states[i][6]; + and[6][i].b <== eq[1][i].out; + states[i+1][7] <== and[6][i].out; eq[5][i] = IsEqual(); eq[5][i].in[0] <== in[i]; - eq[5][i].in[1] <== 10; - and[8][i] = AND(); - and[8][i].a <== states[i][4]; - and[8][i].b <== eq[5][i].out; - states[i+1][7] <== and[8][i].out; - and[9][i] = AND(); - and[9][i].a <== states[i][5]; - and[9][i].b <== eq[3][i].out; - states[i+1][8] <== and[9][i].out; - and[10][i] = AND(); - and[10][i].a <== states[i][6]; - and[10][i].b <== eq[1][i].out; - states[i+1][9] <== and[10][i].out; + eq[5][i].in[1] <== 61; + and[7][i] = AND(); + and[7][i].a <== states[i][7]; + and[7][i].b <== eq[5][i].out; + states[i+1][8] <== and[7][i].out; eq[6][i] = IsEqual(); eq[6][i].in[0] <== in[i]; - eq[6][i].in[1] <== 118; - and[11][i] = AND(); - and[11][i].a <== states[i][6]; - and[11][i].b <== eq[6][i].out; - and[12][i] = AND(); - and[12][i].a <== states[i][15]; - and[12][i].b <== eq[6][i].out; - multi_or[2][i] = MultiOR(2); - multi_or[2][i].in[0] <== and[11][i].out; - multi_or[2][i].in[1] <== and[12][i].out; - states[i+1][10] <== multi_or[2][i].out; - and[13][i] = AND(); - and[13][i].a <== states[i][8]; - and[13][i].b <== eq[5][i].out; - states[i+1][11] <== and[13][i].out; - and[14][i] = AND(); - and[14][i].a <== states[i][9]; - and[14][i].b <== eq[3][i].out; - states[i+1][12] <== and[14][i].out; + eq[6][i].in[1] <== 51; + and[8][i] = AND(); + and[8][i].a <== states[i][8]; + and[8][i].b <== eq[6][i].out; + states[i+1][9] <== and[8][i].out; eq[7][i] = IsEqual(); eq[7][i].in[0] <== in[i]; - eq[7][i].in[1] <== 32; - and[15][i] = AND(); - and[15][i].a <== states[i][10]; - and[15][i].b <== eq[7][i].out; - and[16][i] = AND(); - and[16][i].a <== states[i][22]; - and[16][i].b <== eq[7][i].out; - multi_or[3][i] = MultiOR(2); - multi_or[3][i].in[0] <== and[15][i].out; - multi_or[3][i].in[1] <== and[16][i].out; - states[i+1][13] <== multi_or[3][i].out; - and[17][i] = AND(); - and[17][i].a <== states[i][10]; - and[17][i].b <== eq[1][i].out; - states[i+1][14] <== and[17][i].out; - and[18][i] = AND(); - and[18][i].a <== states[i][12]; - and[18][i].b <== eq[5][i].out; - states[i+1][15] <== and[18][i].out; - and[19][i] = AND(); - and[19][i].a <== states[i][13]; - and[19][i].b <== eq[1][i].out; - states[i+1][16] <== and[19][i].out; - and[20][i] = AND(); - and[20][i].a <== states[i][13]; - and[20][i].b <== eq[4][i].out; - and[21][i] = AND(); - and[21][i].a <== states[i][23]; - and[21][i].b <== eq[4][i].out; - multi_or[4][i] = MultiOR(2); - multi_or[4][i].in[0] <== and[20][i].out; - multi_or[4][i].in[1] <== and[21][i].out; - states[i+1][17] <== multi_or[4][i].out; - and[22][i] = AND(); - and[22][i].a <== states[i][14]; - and[22][i].b <== eq[3][i].out; - states[i+1][18] <== and[22][i].out; - and[23][i] = AND(); - and[23][i].a <== states[i][16]; - and[23][i].b <== eq[3][i].out; - states[i+1][19] <== and[23][i].out; - and[24][i] = AND(); - and[24][i].a <== states[i][17]; - and[24][i].b <== eq[1][i].out; - states[i+1][20] <== and[24][i].out; - and[25][i] = AND(); - and[25][i].a <== states[i][17]; - and[25][i].b <== eq[2][i].out; - and[26][i] = AND(); - and[26][i].a <== states[i][26]; - and[26][i].b <== eq[2][i].out; - multi_or[5][i] = MultiOR(2); - multi_or[5][i].in[0] <== and[25][i].out; - multi_or[5][i].in[1] <== and[26][i].out; - states[i+1][21] <== multi_or[5][i].out; - and[27][i] = AND(); - and[27][i].a <== states[i][18]; - and[27][i].b <== eq[5][i].out; - states[i+1][22] <== and[27][i].out; - and[28][i] = AND(); - and[28][i].a <== states[i][19]; - and[28][i].b <== eq[5][i].out; - states[i+1][23] <== and[28][i].out; - and[29][i] = AND(); - and[29][i].a <== states[i][20]; - and[29][i].b <== eq[3][i].out; - states[i+1][24] <== and[29][i].out; - and[30][i] = AND(); - and[30][i].a <== states[i][21]; - and[30][i].b <== eq[1][i].out; - states[i+1][25] <== and[30][i].out; - and[31][i] = AND(); - and[31][i].a <== states[i][24]; - and[31][i].b <== eq[5][i].out; - states[i+1][26] <== and[31][i].out; + eq[7][i].in[1] <== 68; + and[9][i] = AND(); + and[9][i].a <== states[i][9]; + and[9][i].b <== eq[7][i].out; + states[i+1][10] <== and[9][i].out; eq[8][i] = IsEqual(); eq[8][i].in[0] <== in[i]; - eq[8][i].in[1] <== 51; - and[32][i] = AND(); - and[32][i].a <== states[i][25]; - and[32][i].b <== eq[8][i].out; - and[33][i] = AND(); - and[33][i].a <== states[i][33]; - and[33][i].b <== eq[8][i].out; - multi_or[6][i] = MultiOR(2); - multi_or[6][i].in[0] <== and[32][i].out; - multi_or[6][i].in[1] <== and[33][i].out; - states[i+1][27] <== multi_or[6][i].out; - and[34][i] = AND(); - and[34][i].a <== states[i][25]; - and[34][i].b <== eq[3][i].out; - states[i+1][28] <== and[34][i].out; - eq[9][i] = IsEqual(); - eq[9][i].in[0] <== in[i]; - eq[9][i].in[1] <== 68; - and[35][i] = AND(); - and[35][i].a <== states[i][27]; - and[35][i].b <== eq[9][i].out; - states[i+1][29] <== and[35][i].out; - and[36][i] = AND(); - and[36][i].a <== states[i][28]; - and[36][i].b <== eq[5][i].out; - states[i+1][30] <== and[36][i].out; - and[37][i] = AND(); - and[37][i].a <== states[i][29]; - and[37][i].b <== eq[1][i].out; - states[i+1][31] <== and[37][i].out; - eq[10][i] = IsEqual(); - eq[10][i].in[0] <== in[i]; - eq[10][i].in[1] <== 34; - and[38][i] = AND(); - and[38][i].a <== states[i][29]; - and[38][i].b <== eq[10][i].out; + eq[8][i].in[1] <== 34; + and[10][i] = AND(); + and[10][i].a <== states[i][10]; + and[10][i].b <== eq[8][i].out; lt[0][i] = LessEqThan(8); lt[0][i].in[0] <== 1; lt[0][i].in[1] <== in[i]; lt[1][i] = LessEqThan(8); lt[1][i].in[0] <== in[i]; lt[1][i].in[1] <== 33; - and[39][i] = AND(); - and[39][i].a <== lt[0][i].out; - and[39][i].b <== lt[1][i].out; + and[11][i] = AND(); + and[11][i].a <== lt[0][i].out; + and[11][i].b <== lt[1][i].out; lt[2][i] = LessEqThan(8); lt[2][i].in[0] <== 35; lt[2][i].in[1] <== in[i]; lt[3][i] = LessEqThan(8); lt[3][i].in[0] <== in[i]; lt[3][i].in[1] <== 121; - and[40][i] = AND(); - and[40][i].a <== lt[2][i].out; - and[40][i].b <== lt[3][i].out; + and[12][i] = AND(); + and[12][i].a <== lt[2][i].out; + and[12][i].b <== lt[3][i].out; + eq[9][i] = IsEqual(); + eq[9][i].in[0] <== in[i]; + eq[9][i].in[1] <== 123; + eq[10][i] = IsEqual(); + eq[10][i].in[0] <== in[i]; + eq[10][i].in[1] <== 124; eq[11][i] = IsEqual(); eq[11][i].in[0] <== in[i]; - eq[11][i].in[1] <== 123; + eq[11][i].in[1] <== 125; eq[12][i] = IsEqual(); eq[12][i].in[0] <== in[i]; - eq[12][i].in[1] <== 124; + eq[12][i].in[1] <== 126; eq[13][i] = IsEqual(); eq[13][i].in[0] <== in[i]; - eq[13][i].in[1] <== 125; - eq[14][i] = IsEqual(); - eq[14][i].in[0] <== in[i]; - eq[14][i].in[1] <== 126; - eq[15][i] = IsEqual(); - eq[15][i].in[0] <== in[i]; - eq[15][i].in[1] <== 127; - and[41][i] = AND(); - and[41][i].a <== states[i][32]; - multi_or[7][i] = MultiOR(7); - multi_or[7][i].in[0] <== and[39][i].out; - multi_or[7][i].in[1] <== and[40][i].out; - multi_or[7][i].in[2] <== eq[11][i].out; - multi_or[7][i].in[3] <== eq[12][i].out; - multi_or[7][i].in[4] <== eq[13][i].out; - multi_or[7][i].in[5] <== eq[14][i].out; - multi_or[7][i].in[6] <== eq[15][i].out; - and[41][i].b <== multi_or[7][i].out; + eq[13][i].in[1] <== 127; + and[13][i] = AND(); + and[13][i].a <== states[i][11]; + multi_or[0][i] = MultiOR(7); + multi_or[0][i].in[0] <== and[11][i].out; + multi_or[0][i].in[1] <== and[12][i].out; + multi_or[0][i].in[2] <== eq[9][i].out; + multi_or[0][i].in[3] <== eq[10][i].out; + multi_or[0][i].in[4] <== eq[11][i].out; + multi_or[0][i].in[5] <== eq[12][i].out; + multi_or[0][i].in[6] <== eq[13][i].out; + and[13][i].b <== multi_or[0][i].out; lt[4][i] = LessEqThan(8); lt[4][i].in[0] <== 128; lt[4][i].in[1] <== in[i]; lt[5][i] = LessEqThan(8); lt[5][i].in[0] <== in[i]; lt[5][i].in[1] <== 191; - and[42][i] = AND(); - and[42][i].a <== lt[4][i].out; - and[42][i].b <== lt[5][i].out; - and[43][i] = AND(); - and[43][i].a <== states[i][35]; - and[43][i].b <== and[42][i].out; + and[14][i] = AND(); + and[14][i].a <== lt[4][i].out; + and[14][i].b <== lt[5][i].out; + and[15][i] = AND(); + and[15][i].a <== states[i][12]; + and[15][i].b <== and[14][i].out; lt[6][i] = LessEqThan(8); lt[6][i].in[0] <== 35; lt[6][i].in[1] <== in[i]; lt[7][i] = LessEqThan(8); lt[7][i].in[0] <== in[i]; - lt[7][i].in[1] <== 60; - and[44][i] = AND(); - and[44][i].a <== lt[6][i].out; - and[44][i].b <== lt[7][i].out; - lt[8][i] = LessEqThan(8); - lt[8][i].in[0] <== 62; - lt[8][i].in[1] <== in[i]; - lt[9][i] = LessEqThan(8); - lt[9][i].in[0] <== in[i]; - lt[9][i].in[1] <== 106; - and[45][i] = AND(); - and[45][i].a <== lt[8][i].out; - and[45][i].b <== lt[9][i].out; + lt[7][i].in[1] <== 106; + and[16][i] = AND(); + and[16][i].a <== lt[6][i].out; + and[16][i].b <== lt[7][i].out; + eq[14][i] = IsEqual(); + eq[14][i].in[0] <== in[i]; + eq[14][i].in[1] <== 108; + eq[15][i] = IsEqual(); + eq[15][i].in[0] <== in[i]; + eq[15][i].in[1] <== 109; eq[16][i] = IsEqual(); eq[16][i].in[0] <== in[i]; - eq[16][i].in[1] <== 108; + eq[16][i].in[1] <== 110; eq[17][i] = IsEqual(); eq[17][i].in[0] <== in[i]; - eq[17][i].in[1] <== 109; + eq[17][i].in[1] <== 111; eq[18][i] = IsEqual(); eq[18][i].in[0] <== in[i]; - eq[18][i].in[1] <== 110; + eq[18][i].in[1] <== 112; eq[19][i] = IsEqual(); eq[19][i].in[0] <== in[i]; - eq[19][i].in[1] <== 111; + eq[19][i].in[1] <== 113; eq[20][i] = IsEqual(); eq[20][i].in[0] <== in[i]; - eq[20][i].in[1] <== 112; + eq[20][i].in[1] <== 114; eq[21][i] = IsEqual(); eq[21][i].in[0] <== in[i]; - eq[21][i].in[1] <== 113; + eq[21][i].in[1] <== 115; eq[22][i] = IsEqual(); eq[22][i].in[0] <== in[i]; - eq[22][i].in[1] <== 114; + eq[22][i].in[1] <== 116; eq[23][i] = IsEqual(); eq[23][i].in[0] <== in[i]; - eq[23][i].in[1] <== 115; + eq[23][i].in[1] <== 117; eq[24][i] = IsEqual(); eq[24][i].in[0] <== in[i]; - eq[24][i].in[1] <== 116; + eq[24][i].in[1] <== 119; eq[25][i] = IsEqual(); eq[25][i].in[0] <== in[i]; - eq[25][i].in[1] <== 117; + eq[25][i].in[1] <== 120; eq[26][i] = IsEqual(); eq[26][i].in[0] <== in[i]; - eq[26][i].in[1] <== 119; + eq[26][i].in[1] <== 121; + and[17][i] = AND(); + and[17][i].a <== states[i][19]; + multi_or[1][i] = MultiOR(21); + multi_or[1][i].in[0] <== and[11][i].out; + multi_or[1][i].in[1] <== and[16][i].out; + multi_or[1][i].in[2] <== eq[14][i].out; + multi_or[1][i].in[3] <== eq[15][i].out; + multi_or[1][i].in[4] <== eq[16][i].out; + multi_or[1][i].in[5] <== eq[17][i].out; + multi_or[1][i].in[6] <== eq[18][i].out; + multi_or[1][i].in[7] <== eq[19][i].out; + multi_or[1][i].in[8] <== eq[20][i].out; + multi_or[1][i].in[9] <== eq[21][i].out; + multi_or[1][i].in[10] <== eq[22][i].out; + multi_or[1][i].in[11] <== eq[23][i].out; + multi_or[1][i].in[12] <== eq[3][i].out; + multi_or[1][i].in[13] <== eq[24][i].out; + multi_or[1][i].in[14] <== eq[25][i].out; + multi_or[1][i].in[15] <== eq[26][i].out; + multi_or[1][i].in[16] <== eq[9][i].out; + multi_or[1][i].in[17] <== eq[10][i].out; + multi_or[1][i].in[18] <== eq[11][i].out; + multi_or[1][i].in[19] <== eq[12][i].out; + multi_or[1][i].in[20] <== eq[13][i].out; + and[17][i].b <== multi_or[1][i].out; + lt[8][i] = LessEqThan(8); + lt[8][i].in[0] <== 35; + lt[8][i].in[1] <== in[i]; + lt[9][i] = LessEqThan(8); + lt[9][i].in[0] <== in[i]; + lt[9][i].in[1] <== 100; + and[18][i] = AND(); + and[18][i].a <== lt[8][i].out; + and[18][i].b <== lt[9][i].out; + lt[10][i] = LessEqThan(8); + lt[10][i].in[0] <== 102; + lt[10][i].in[1] <== in[i]; + lt[11][i] = LessEqThan(8); + lt[11][i].in[0] <== in[i]; + lt[11][i].in[1] <== 121; + and[19][i] = AND(); + and[19][i].a <== lt[10][i].out; + and[19][i].b <== lt[11][i].out; + and[20][i] = AND(); + and[20][i].a <== states[i][20]; + multi_or[2][i] = MultiOR(8); + multi_or[2][i].in[0] <== and[11][i].out; + multi_or[2][i].in[1] <== and[18][i].out; + multi_or[2][i].in[2] <== and[19][i].out; + multi_or[2][i].in[3] <== eq[9][i].out; + multi_or[2][i].in[4] <== eq[10][i].out; + multi_or[2][i].in[5] <== eq[11][i].out; + multi_or[2][i].in[6] <== eq[12][i].out; + multi_or[2][i].in[7] <== eq[13][i].out; + and[20][i].b <== multi_or[2][i].out; + lt[12][i] = LessEqThan(8); + lt[12][i].in[0] <== 35; + lt[12][i].in[1] <== in[i]; + lt[13][i] = LessEqThan(8); + lt[13][i].in[0] <== in[i]; + lt[13][i].in[1] <== 108; + and[21][i] = AND(); + and[21][i].a <== lt[12][i].out; + and[21][i].b <== lt[13][i].out; + and[22][i] = AND(); + and[22][i].a <== states[i][21]; + multi_or[3][i] = MultiOR(19); + multi_or[3][i].in[0] <== and[11][i].out; + multi_or[3][i].in[1] <== and[21][i].out; + multi_or[3][i].in[2] <== eq[16][i].out; + multi_or[3][i].in[3] <== eq[17][i].out; + multi_or[3][i].in[4] <== eq[18][i].out; + multi_or[3][i].in[5] <== eq[19][i].out; + multi_or[3][i].in[6] <== eq[20][i].out; + multi_or[3][i].in[7] <== eq[21][i].out; + multi_or[3][i].in[8] <== eq[22][i].out; + multi_or[3][i].in[9] <== eq[23][i].out; + multi_or[3][i].in[10] <== eq[3][i].out; + multi_or[3][i].in[11] <== eq[24][i].out; + multi_or[3][i].in[12] <== eq[25][i].out; + multi_or[3][i].in[13] <== eq[26][i].out; + multi_or[3][i].in[14] <== eq[9][i].out; + multi_or[3][i].in[15] <== eq[10][i].out; + multi_or[3][i].in[16] <== eq[11][i].out; + multi_or[3][i].in[17] <== eq[12][i].out; + multi_or[3][i].in[18] <== eq[13][i].out; + and[22][i].b <== multi_or[3][i].out; + lt[14][i] = LessEqThan(8); + lt[14][i].in[0] <== 35; + lt[14][i].in[1] <== in[i]; + lt[15][i] = LessEqThan(8); + lt[15][i].in[0] <== in[i]; + lt[15][i].in[1] <== 96; + and[23][i] = AND(); + and[23][i].a <== lt[14][i].out; + and[23][i].b <== lt[15][i].out; + lt[16][i] = LessEqThan(8); + lt[16][i].in[0] <== 98; + lt[16][i].in[1] <== in[i]; + lt[17][i] = LessEqThan(8); + lt[17][i].in[0] <== in[i]; + lt[17][i].in[1] <== 121; + and[24][i] = AND(); + and[24][i].a <== lt[16][i].out; + and[24][i].b <== lt[17][i].out; + and[25][i] = AND(); + and[25][i].a <== states[i][22]; + multi_or[4][i] = MultiOR(8); + multi_or[4][i].in[0] <== and[11][i].out; + multi_or[4][i].in[1] <== and[23][i].out; + multi_or[4][i].in[2] <== and[24][i].out; + multi_or[4][i].in[3] <== eq[9][i].out; + multi_or[4][i].in[4] <== eq[10][i].out; + multi_or[4][i].in[5] <== eq[11][i].out; + multi_or[4][i].in[6] <== eq[12][i].out; + multi_or[4][i].in[7] <== eq[13][i].out; + and[25][i].b <== multi_or[4][i].out; + lt[18][i] = LessEqThan(8); + lt[18][i].in[0] <== 35; + lt[18][i].in[1] <== in[i]; + lt[19][i] = LessEqThan(8); + lt[19][i].in[0] <== in[i]; + lt[19][i].in[1] <== 104; + and[26][i] = AND(); + and[26][i].a <== lt[18][i].out; + and[26][i].b <== lt[19][i].out; eq[27][i] = IsEqual(); eq[27][i].in[0] <== in[i]; - eq[27][i].in[1] <== 120; + eq[27][i].in[1] <== 106; eq[28][i] = IsEqual(); eq[28][i].in[0] <== in[i]; - eq[28][i].in[1] <== 121; + eq[28][i].in[1] <== 107; + and[27][i] = AND(); + and[27][i].a <== states[i][23]; + multi_or[5][i] = MultiOR(23); + multi_or[5][i].in[0] <== and[11][i].out; + multi_or[5][i].in[1] <== and[26][i].out; + multi_or[5][i].in[2] <== eq[27][i].out; + multi_or[5][i].in[3] <== eq[28][i].out; + multi_or[5][i].in[4] <== eq[14][i].out; + multi_or[5][i].in[5] <== eq[15][i].out; + multi_or[5][i].in[6] <== eq[16][i].out; + multi_or[5][i].in[7] <== eq[17][i].out; + multi_or[5][i].in[8] <== eq[18][i].out; + multi_or[5][i].in[9] <== eq[19][i].out; + multi_or[5][i].in[10] <== eq[20][i].out; + multi_or[5][i].in[11] <== eq[21][i].out; + multi_or[5][i].in[12] <== eq[22][i].out; + multi_or[5][i].in[13] <== eq[23][i].out; + multi_or[5][i].in[14] <== eq[3][i].out; + multi_or[5][i].in[15] <== eq[24][i].out; + multi_or[5][i].in[16] <== eq[25][i].out; + multi_or[5][i].in[17] <== eq[26][i].out; + multi_or[5][i].in[18] <== eq[9][i].out; + multi_or[5][i].in[19] <== eq[10][i].out; + multi_or[5][i].in[20] <== eq[11][i].out; + multi_or[5][i].in[21] <== eq[12][i].out; + multi_or[5][i].in[22] <== eq[13][i].out; + and[27][i].b <== multi_or[5][i].out; + lt[20][i] = LessEqThan(8); + lt[20][i].in[0] <== 35; + lt[20][i].in[1] <== in[i]; + lt[21][i] = LessEqThan(8); + lt[21][i].in[0] <== in[i]; + lt[21][i].in[1] <== 107; + and[28][i] = AND(); + and[28][i].a <== lt[20][i].out; + and[28][i].b <== lt[21][i].out; + and[29][i] = AND(); + and[29][i].a <== states[i][24]; + multi_or[6][i] = MultiOR(20); + multi_or[6][i].in[0] <== and[11][i].out; + multi_or[6][i].in[1] <== and[28][i].out; + multi_or[6][i].in[2] <== eq[15][i].out; + multi_or[6][i].in[3] <== eq[16][i].out; + multi_or[6][i].in[4] <== eq[17][i].out; + multi_or[6][i].in[5] <== eq[18][i].out; + multi_or[6][i].in[6] <== eq[19][i].out; + multi_or[6][i].in[7] <== eq[20][i].out; + multi_or[6][i].in[8] <== eq[21][i].out; + multi_or[6][i].in[9] <== eq[22][i].out; + multi_or[6][i].in[10] <== eq[23][i].out; + multi_or[6][i].in[11] <== eq[3][i].out; + multi_or[6][i].in[12] <== eq[24][i].out; + multi_or[6][i].in[13] <== eq[25][i].out; + multi_or[6][i].in[14] <== eq[26][i].out; + multi_or[6][i].in[15] <== eq[9][i].out; + multi_or[6][i].in[16] <== eq[10][i].out; + multi_or[6][i].in[17] <== eq[11][i].out; + multi_or[6][i].in[18] <== eq[12][i].out; + multi_or[6][i].in[19] <== eq[13][i].out; + and[29][i].b <== multi_or[6][i].out; + multi_or[7][i] = MultiOR(9); + multi_or[7][i].in[0] <== and[10][i].out; + multi_or[7][i].in[1] <== and[13][i].out; + multi_or[7][i].in[2] <== and[15][i].out; + multi_or[7][i].in[3] <== and[17][i].out; + multi_or[7][i].in[4] <== and[20][i].out; + multi_or[7][i].in[5] <== and[22][i].out; + multi_or[7][i].in[6] <== and[25][i].out; + multi_or[7][i].in[7] <== and[27][i].out; + multi_or[7][i].in[8] <== and[29][i].out; + states[i+1][11] <== multi_or[7][i].out; + lt[22][i] = LessEqThan(8); + lt[22][i].in[0] <== 194; + lt[22][i].in[1] <== in[i]; + lt[23][i] = LessEqThan(8); + lt[23][i].in[0] <== in[i]; + lt[23][i].in[1] <== 223; + and[30][i] = AND(); + and[30][i].a <== lt[22][i].out; + and[30][i].b <== lt[23][i].out; + and[31][i] = AND(); + and[31][i].a <== states[i][11]; + and[31][i].b <== and[30][i].out; + lt[24][i] = LessEqThan(8); + lt[24][i].in[0] <== 160; + lt[24][i].in[1] <== in[i]; + lt[25][i] = LessEqThan(8); + lt[25][i].in[0] <== in[i]; + lt[25][i].in[1] <== 191; + and[32][i] = AND(); + and[32][i].a <== lt[24][i].out; + and[32][i].b <== lt[25][i].out; + and[33][i] = AND(); + and[33][i].a <== states[i][13]; + and[33][i].b <== and[32][i].out; + and[34][i] = AND(); + and[34][i].a <== states[i][14]; + and[34][i].b <== and[14][i].out; + lt[26][i] = LessEqThan(8); + lt[26][i].in[0] <== 128; + lt[26][i].in[1] <== in[i]; + lt[27][i] = LessEqThan(8); + lt[27][i].in[0] <== in[i]; + lt[27][i].in[1] <== 159; + and[35][i] = AND(); + and[35][i].a <== lt[26][i].out; + and[35][i].b <== lt[27][i].out; + and[36][i] = AND(); + and[36][i].a <== states[i][15]; + and[36][i].b <== and[35][i].out; + and[37][i] = AND(); + and[37][i].a <== states[i][19]; + and[37][i].b <== and[30][i].out; + and[38][i] = AND(); + and[38][i].a <== states[i][20]; + and[38][i].b <== and[30][i].out; + and[39][i] = AND(); + and[39][i].a <== states[i][21]; + and[39][i].b <== and[30][i].out; + and[40][i] = AND(); + and[40][i].a <== states[i][22]; + and[40][i].b <== and[30][i].out; + and[41][i] = AND(); + and[41][i].a <== states[i][23]; + and[41][i].b <== and[30][i].out; + and[42][i] = AND(); + and[42][i].a <== states[i][24]; + and[42][i].b <== and[30][i].out; + multi_or[8][i] = MultiOR(10); + multi_or[8][i].in[0] <== and[31][i].out; + multi_or[8][i].in[1] <== and[33][i].out; + multi_or[8][i].in[2] <== and[34][i].out; + multi_or[8][i].in[3] <== and[36][i].out; + multi_or[8][i].in[4] <== and[37][i].out; + multi_or[8][i].in[5] <== and[38][i].out; + multi_or[8][i].in[6] <== and[39][i].out; + multi_or[8][i].in[7] <== and[40][i].out; + multi_or[8][i].in[8] <== and[41][i].out; + multi_or[8][i].in[9] <== and[42][i].out; + states[i+1][12] <== multi_or[8][i].out; + eq[29][i] = IsEqual(); + eq[29][i].in[0] <== in[i]; + eq[29][i].in[1] <== 224; + and[43][i] = AND(); + and[43][i].a <== states[i][11]; + and[43][i].b <== eq[29][i].out; + and[44][i] = AND(); + and[44][i].a <== states[i][19]; + and[44][i].b <== eq[29][i].out; + and[45][i] = AND(); + and[45][i].a <== states[i][20]; + and[45][i].b <== eq[29][i].out; and[46][i] = AND(); - and[46][i].a <== states[i][42]; - multi_or[8][i] = MultiOR(22); - multi_or[8][i].in[0] <== and[39][i].out; - multi_or[8][i].in[1] <== and[44][i].out; - multi_or[8][i].in[2] <== and[45][i].out; - multi_or[8][i].in[3] <== eq[16][i].out; - multi_or[8][i].in[4] <== eq[17][i].out; - multi_or[8][i].in[5] <== eq[18][i].out; - multi_or[8][i].in[6] <== eq[19][i].out; - multi_or[8][i].in[7] <== eq[20][i].out; - multi_or[8][i].in[8] <== eq[21][i].out; - multi_or[8][i].in[9] <== eq[22][i].out; - multi_or[8][i].in[10] <== eq[23][i].out; - multi_or[8][i].in[11] <== eq[24][i].out; - multi_or[8][i].in[12] <== eq[25][i].out; - multi_or[8][i].in[13] <== eq[6][i].out; - multi_or[8][i].in[14] <== eq[26][i].out; - multi_or[8][i].in[15] <== eq[27][i].out; - multi_or[8][i].in[16] <== eq[28][i].out; - multi_or[8][i].in[17] <== eq[11][i].out; - multi_or[8][i].in[18] <== eq[12][i].out; - multi_or[8][i].in[19] <== eq[13][i].out; - multi_or[8][i].in[20] <== eq[14][i].out; - multi_or[8][i].in[21] <== eq[15][i].out; - and[46][i].b <== multi_or[8][i].out; + and[46][i].a <== states[i][21]; + and[46][i].b <== eq[29][i].out; and[47][i] = AND(); - and[47][i].a <== states[i][43]; - and[47][i].b <== eq[10][i].out; - lt[10][i] = LessEqThan(8); - lt[10][i].in[0] <== 14; - lt[10][i].in[1] <== in[i]; - lt[11][i] = LessEqThan(8); - lt[11][i].in[0] <== in[i]; - lt[11][i].in[1] <== 33; + and[47][i].a <== states[i][22]; + and[47][i].b <== eq[29][i].out; and[48][i] = AND(); - and[48][i].a <== lt[10][i].out; - and[48][i].b <== lt[11][i].out; - eq[29][i] = IsEqual(); - eq[29][i].in[0] <== in[i]; - eq[29][i].in[1] <== 1; + and[48][i].a <== states[i][23]; + and[48][i].b <== eq[29][i].out; + and[49][i] = AND(); + and[49][i].a <== states[i][24]; + and[49][i].b <== eq[29][i].out; + multi_or[9][i] = MultiOR(7); + multi_or[9][i].in[0] <== and[43][i].out; + multi_or[9][i].in[1] <== and[44][i].out; + multi_or[9][i].in[2] <== and[45][i].out; + multi_or[9][i].in[3] <== and[46][i].out; + multi_or[9][i].in[4] <== and[47][i].out; + multi_or[9][i].in[5] <== and[48][i].out; + multi_or[9][i].in[6] <== and[49][i].out; + states[i+1][13] <== multi_or[9][i].out; eq[30][i] = IsEqual(); eq[30][i].in[0] <== in[i]; - eq[30][i].in[1] <== 2; + eq[30][i].in[1] <== 225; eq[31][i] = IsEqual(); eq[31][i].in[0] <== in[i]; - eq[31][i].in[1] <== 3; + eq[31][i].in[1] <== 226; eq[32][i] = IsEqual(); eq[32][i].in[0] <== in[i]; - eq[32][i].in[1] <== 4; + eq[32][i].in[1] <== 227; eq[33][i] = IsEqual(); eq[33][i].in[0] <== in[i]; - eq[33][i].in[1] <== 5; + eq[33][i].in[1] <== 228; eq[34][i] = IsEqual(); eq[34][i].in[0] <== in[i]; - eq[34][i].in[1] <== 6; + eq[34][i].in[1] <== 229; eq[35][i] = IsEqual(); eq[35][i].in[0] <== in[i]; - eq[35][i].in[1] <== 7; + eq[35][i].in[1] <== 230; eq[36][i] = IsEqual(); eq[36][i].in[0] <== in[i]; - eq[36][i].in[1] <== 8; + eq[36][i].in[1] <== 231; eq[37][i] = IsEqual(); eq[37][i].in[0] <== in[i]; - eq[37][i].in[1] <== 9; + eq[37][i].in[1] <== 232; eq[38][i] = IsEqual(); eq[38][i].in[0] <== in[i]; - eq[38][i].in[1] <== 11; + eq[38][i].in[1] <== 233; eq[39][i] = IsEqual(); eq[39][i].in[0] <== in[i]; - eq[39][i].in[1] <== 12; - and[49][i] = AND(); - and[49][i].a <== states[i][44]; - multi_or[9][i] = MultiOR(19); - multi_or[9][i].in[0] <== and[48][i].out; - multi_or[9][i].in[1] <== and[40][i].out; - multi_or[9][i].in[2] <== eq[29][i].out; - multi_or[9][i].in[3] <== eq[30][i].out; - multi_or[9][i].in[4] <== eq[31][i].out; - multi_or[9][i].in[5] <== eq[32][i].out; - multi_or[9][i].in[6] <== eq[33][i].out; - multi_or[9][i].in[7] <== eq[34][i].out; - multi_or[9][i].in[8] <== eq[35][i].out; - multi_or[9][i].in[9] <== eq[36][i].out; - multi_or[9][i].in[10] <== eq[37][i].out; - multi_or[9][i].in[11] <== eq[5][i].out; - multi_or[9][i].in[12] <== eq[38][i].out; - multi_or[9][i].in[13] <== eq[39][i].out; - multi_or[9][i].in[14] <== eq[11][i].out; - multi_or[9][i].in[15] <== eq[12][i].out; - multi_or[9][i].in[16] <== eq[13][i].out; - multi_or[9][i].in[17] <== eq[14][i].out; - multi_or[9][i].in[18] <== eq[15][i].out; - and[49][i].b <== multi_or[9][i].out; - lt[12][i] = LessEqThan(8); - lt[12][i].in[0] <== 62; - lt[12][i].in[1] <== in[i]; - lt[13][i] = LessEqThan(8); - lt[13][i].in[0] <== in[i]; - lt[13][i].in[1] <== 100; + eq[39][i].in[1] <== 234; + eq[40][i] = IsEqual(); + eq[40][i].in[0] <== in[i]; + eq[40][i].in[1] <== 235; + eq[41][i] = IsEqual(); + eq[41][i].in[0] <== in[i]; + eq[41][i].in[1] <== 236; + eq[42][i] = IsEqual(); + eq[42][i].in[0] <== in[i]; + eq[42][i].in[1] <== 238; + eq[43][i] = IsEqual(); + eq[43][i].in[0] <== in[i]; + eq[43][i].in[1] <== 239; and[50][i] = AND(); - and[50][i].a <== lt[12][i].out; - and[50][i].b <== lt[13][i].out; - lt[14][i] = LessEqThan(8); - lt[14][i].in[0] <== 102; - lt[14][i].in[1] <== in[i]; - lt[15][i] = LessEqThan(8); - lt[15][i].in[0] <== in[i]; - lt[15][i].in[1] <== 121; + and[50][i].a <== states[i][11]; + multi_or[10][i] = MultiOR(14); + multi_or[10][i].in[0] <== eq[30][i].out; + multi_or[10][i].in[1] <== eq[31][i].out; + multi_or[10][i].in[2] <== eq[32][i].out; + multi_or[10][i].in[3] <== eq[33][i].out; + multi_or[10][i].in[4] <== eq[34][i].out; + multi_or[10][i].in[5] <== eq[35][i].out; + multi_or[10][i].in[6] <== eq[36][i].out; + multi_or[10][i].in[7] <== eq[37][i].out; + multi_or[10][i].in[8] <== eq[38][i].out; + multi_or[10][i].in[9] <== eq[39][i].out; + multi_or[10][i].in[10] <== eq[40][i].out; + multi_or[10][i].in[11] <== eq[41][i].out; + multi_or[10][i].in[12] <== eq[42][i].out; + multi_or[10][i].in[13] <== eq[43][i].out; + and[50][i].b <== multi_or[10][i].out; + lt[28][i] = LessEqThan(8); + lt[28][i].in[0] <== 144; + lt[28][i].in[1] <== in[i]; + lt[29][i] = LessEqThan(8); + lt[29][i].in[0] <== in[i]; + lt[29][i].in[1] <== 191; and[51][i] = AND(); - and[51][i].a <== lt[14][i].out; - and[51][i].b <== lt[15][i].out; + and[51][i].a <== lt[28][i].out; + and[51][i].b <== lt[29][i].out; and[52][i] = AND(); - and[52][i].a <== states[i][45]; - multi_or[10][i] = MultiOR(9); - multi_or[10][i].in[0] <== and[39][i].out; - multi_or[10][i].in[1] <== and[44][i].out; - multi_or[10][i].in[2] <== and[50][i].out; - multi_or[10][i].in[3] <== and[51][i].out; - multi_or[10][i].in[4] <== eq[11][i].out; - multi_or[10][i].in[5] <== eq[12][i].out; - multi_or[10][i].in[6] <== eq[13][i].out; - multi_or[10][i].in[7] <== eq[14][i].out; - multi_or[10][i].in[8] <== eq[15][i].out; - and[52][i].b <== multi_or[10][i].out; - lt[16][i] = LessEqThan(8); - lt[16][i].in[0] <== 11; - lt[16][i].in[1] <== in[i]; - lt[17][i] = LessEqThan(8); - lt[17][i].in[0] <== in[i]; - lt[17][i].in[1] <== 33; + and[52][i].a <== states[i][16]; + and[52][i].b <== and[51][i].out; and[53][i] = AND(); - and[53][i].a <== lt[16][i].out; - and[53][i].b <== lt[17][i].out; + and[53][i].a <== states[i][17]; + and[53][i].b <== and[14][i].out; + eq[44][i] = IsEqual(); + eq[44][i].in[0] <== in[i]; + eq[44][i].in[1] <== 128; + eq[45][i] = IsEqual(); + eq[45][i].in[0] <== in[i]; + eq[45][i].in[1] <== 129; + eq[46][i] = IsEqual(); + eq[46][i].in[0] <== in[i]; + eq[46][i].in[1] <== 130; + eq[47][i] = IsEqual(); + eq[47][i].in[0] <== in[i]; + eq[47][i].in[1] <== 131; + eq[48][i] = IsEqual(); + eq[48][i].in[0] <== in[i]; + eq[48][i].in[1] <== 132; + eq[49][i] = IsEqual(); + eq[49][i].in[0] <== in[i]; + eq[49][i].in[1] <== 133; + eq[50][i] = IsEqual(); + eq[50][i].in[0] <== in[i]; + eq[50][i].in[1] <== 134; + eq[51][i] = IsEqual(); + eq[51][i].in[0] <== in[i]; + eq[51][i].in[1] <== 135; + eq[52][i] = IsEqual(); + eq[52][i].in[0] <== in[i]; + eq[52][i].in[1] <== 136; + eq[53][i] = IsEqual(); + eq[53][i].in[0] <== in[i]; + eq[53][i].in[1] <== 137; + eq[54][i] = IsEqual(); + eq[54][i].in[0] <== in[i]; + eq[54][i].in[1] <== 138; + eq[55][i] = IsEqual(); + eq[55][i].in[0] <== in[i]; + eq[55][i].in[1] <== 139; + eq[56][i] = IsEqual(); + eq[56][i].in[0] <== in[i]; + eq[56][i].in[1] <== 140; + eq[57][i] = IsEqual(); + eq[57][i].in[0] <== in[i]; + eq[57][i].in[1] <== 141; + eq[58][i] = IsEqual(); + eq[58][i].in[0] <== in[i]; + eq[58][i].in[1] <== 142; + eq[59][i] = IsEqual(); + eq[59][i].in[0] <== in[i]; + eq[59][i].in[1] <== 143; and[54][i] = AND(); - and[54][i].a <== states[i][46]; + and[54][i].a <== states[i][18]; multi_or[11][i] = MultiOR(16); - multi_or[11][i].in[0] <== and[53][i].out; - multi_or[11][i].in[1] <== and[40][i].out; - multi_or[11][i].in[2] <== eq[29][i].out; - multi_or[11][i].in[3] <== eq[30][i].out; - multi_or[11][i].in[4] <== eq[31][i].out; - multi_or[11][i].in[5] <== eq[32][i].out; - multi_or[11][i].in[6] <== eq[33][i].out; - multi_or[11][i].in[7] <== eq[34][i].out; - multi_or[11][i].in[8] <== eq[35][i].out; - multi_or[11][i].in[9] <== eq[36][i].out; - multi_or[11][i].in[10] <== eq[37][i].out; - multi_or[11][i].in[11] <== eq[11][i].out; - multi_or[11][i].in[12] <== eq[12][i].out; - multi_or[11][i].in[13] <== eq[13][i].out; - multi_or[11][i].in[14] <== eq[14][i].out; - multi_or[11][i].in[15] <== eq[15][i].out; + multi_or[11][i].in[0] <== eq[44][i].out; + multi_or[11][i].in[1] <== eq[45][i].out; + multi_or[11][i].in[2] <== eq[46][i].out; + multi_or[11][i].in[3] <== eq[47][i].out; + multi_or[11][i].in[4] <== eq[48][i].out; + multi_or[11][i].in[5] <== eq[49][i].out; + multi_or[11][i].in[6] <== eq[50][i].out; + multi_or[11][i].in[7] <== eq[51][i].out; + multi_or[11][i].in[8] <== eq[52][i].out; + multi_or[11][i].in[9] <== eq[53][i].out; + multi_or[11][i].in[10] <== eq[54][i].out; + multi_or[11][i].in[11] <== eq[55][i].out; + multi_or[11][i].in[12] <== eq[56][i].out; + multi_or[11][i].in[13] <== eq[57][i].out; + multi_or[11][i].in[14] <== eq[58][i].out; + multi_or[11][i].in[15] <== eq[59][i].out; and[54][i].b <== multi_or[11][i].out; and[55][i] = AND(); - and[55][i].a <== states[i][47]; - and[55][i].b <== multi_or[9][i].out; - lt[18][i] = LessEqThan(8); - lt[18][i].in[0] <== 62; - lt[18][i].in[1] <== in[i]; - lt[19][i] = LessEqThan(8); - lt[19][i].in[0] <== in[i]; - lt[19][i].in[1] <== 108; + and[55][i].a <== states[i][19]; + and[55][i].b <== multi_or[10][i].out; and[56][i] = AND(); - and[56][i].a <== lt[18][i].out; - and[56][i].b <== lt[19][i].out; + and[56][i].a <== states[i][20]; + and[56][i].b <== multi_or[10][i].out; and[57][i] = AND(); - and[57][i].a <== states[i][48]; - multi_or[12][i] = MultiOR(20); - multi_or[12][i].in[0] <== and[39][i].out; - multi_or[12][i].in[1] <== and[44][i].out; - multi_or[12][i].in[2] <== and[56][i].out; - multi_or[12][i].in[3] <== eq[18][i].out; - multi_or[12][i].in[4] <== eq[19][i].out; - multi_or[12][i].in[5] <== eq[20][i].out; - multi_or[12][i].in[6] <== eq[21][i].out; - multi_or[12][i].in[7] <== eq[22][i].out; - multi_or[12][i].in[8] <== eq[23][i].out; - multi_or[12][i].in[9] <== eq[24][i].out; - multi_or[12][i].in[10] <== eq[25][i].out; - multi_or[12][i].in[11] <== eq[6][i].out; - multi_or[12][i].in[12] <== eq[26][i].out; - multi_or[12][i].in[13] <== eq[27][i].out; - multi_or[12][i].in[14] <== eq[28][i].out; - multi_or[12][i].in[15] <== eq[11][i].out; - multi_or[12][i].in[16] <== eq[12][i].out; - multi_or[12][i].in[17] <== eq[13][i].out; - multi_or[12][i].in[18] <== eq[14][i].out; - multi_or[12][i].in[19] <== eq[15][i].out; - and[57][i].b <== multi_or[12][i].out; - lt[20][i] = LessEqThan(8); - lt[20][i].in[0] <== 35; - lt[20][i].in[1] <== in[i]; - lt[21][i] = LessEqThan(8); - lt[21][i].in[0] <== in[i]; - lt[21][i].in[1] <== 106; + and[57][i].a <== states[i][21]; + and[57][i].b <== multi_or[10][i].out; and[58][i] = AND(); - and[58][i].a <== lt[20][i].out; - and[58][i].b <== lt[21][i].out; + and[58][i].a <== states[i][22]; + and[58][i].b <== multi_or[10][i].out; and[59][i] = AND(); - and[59][i].a <== states[i][49]; - multi_or[13][i] = MultiOR(21); - multi_or[13][i].in[0] <== and[39][i].out; - multi_or[13][i].in[1] <== and[58][i].out; - multi_or[13][i].in[2] <== eq[16][i].out; - multi_or[13][i].in[3] <== eq[17][i].out; - multi_or[13][i].in[4] <== eq[18][i].out; - multi_or[13][i].in[5] <== eq[19][i].out; - multi_or[13][i].in[6] <== eq[20][i].out; - multi_or[13][i].in[7] <== eq[21][i].out; - multi_or[13][i].in[8] <== eq[22][i].out; - multi_or[13][i].in[9] <== eq[23][i].out; - multi_or[13][i].in[10] <== eq[24][i].out; - multi_or[13][i].in[11] <== eq[25][i].out; - multi_or[13][i].in[12] <== eq[6][i].out; - multi_or[13][i].in[13] <== eq[26][i].out; - multi_or[13][i].in[14] <== eq[27][i].out; - multi_or[13][i].in[15] <== eq[28][i].out; - multi_or[13][i].in[16] <== eq[11][i].out; - multi_or[13][i].in[17] <== eq[12][i].out; - multi_or[13][i].in[18] <== eq[13][i].out; - multi_or[13][i].in[19] <== eq[14][i].out; - multi_or[13][i].in[20] <== eq[15][i].out; - and[59][i].b <== multi_or[13][i].out; + and[59][i].a <== states[i][23]; + and[59][i].b <== multi_or[10][i].out; and[60][i] = AND(); - and[60][i].a <== states[i][50]; - and[60][i].b <== multi_or[11][i].out; + and[60][i].a <== states[i][24]; + and[60][i].b <== multi_or[10][i].out; + multi_or[12][i] = MultiOR(10); + multi_or[12][i].in[0] <== and[50][i].out; + multi_or[12][i].in[1] <== and[52][i].out; + multi_or[12][i].in[2] <== and[53][i].out; + multi_or[12][i].in[3] <== and[54][i].out; + multi_or[12][i].in[4] <== and[55][i].out; + multi_or[12][i].in[5] <== and[56][i].out; + multi_or[12][i].in[6] <== and[57][i].out; + multi_or[12][i].in[7] <== and[58][i].out; + multi_or[12][i].in[8] <== and[59][i].out; + multi_or[12][i].in[9] <== and[60][i].out; + states[i+1][14] <== multi_or[12][i].out; + eq[60][i] = IsEqual(); + eq[60][i].in[0] <== in[i]; + eq[60][i].in[1] <== 237; and[61][i] = AND(); - and[61][i].a <== states[i][51]; - and[61][i].b <== multi_or[9][i].out; - lt[22][i] = LessEqThan(8); - lt[22][i].in[0] <== 62; - lt[22][i].in[1] <== in[i]; - lt[23][i] = LessEqThan(8); - lt[23][i].in[0] <== in[i]; - lt[23][i].in[1] <== 96; + and[61][i].a <== states[i][11]; + and[61][i].b <== eq[60][i].out; and[62][i] = AND(); - and[62][i].a <== lt[22][i].out; - and[62][i].b <== lt[23][i].out; - lt[24][i] = LessEqThan(8); - lt[24][i].in[0] <== 98; - lt[24][i].in[1] <== in[i]; - lt[25][i] = LessEqThan(8); - lt[25][i].in[0] <== in[i]; - lt[25][i].in[1] <== 121; + and[62][i].a <== states[i][19]; + and[62][i].b <== eq[60][i].out; and[63][i] = AND(); - and[63][i].a <== lt[24][i].out; - and[63][i].b <== lt[25][i].out; + and[63][i].a <== states[i][20]; + and[63][i].b <== eq[60][i].out; and[64][i] = AND(); - and[64][i].a <== states[i][52]; - multi_or[14][i] = MultiOR(9); - multi_or[14][i].in[0] <== and[39][i].out; - multi_or[14][i].in[1] <== and[44][i].out; - multi_or[14][i].in[2] <== and[62][i].out; - multi_or[14][i].in[3] <== and[63][i].out; - multi_or[14][i].in[4] <== eq[11][i].out; - multi_or[14][i].in[5] <== eq[12][i].out; - multi_or[14][i].in[6] <== eq[13][i].out; - multi_or[14][i].in[7] <== eq[14][i].out; - multi_or[14][i].in[8] <== eq[15][i].out; - and[64][i].b <== multi_or[14][i].out; - lt[26][i] = LessEqThan(8); - lt[26][i].in[0] <== 35; - lt[26][i].in[1] <== in[i]; - lt[27][i] = LessEqThan(8); - lt[27][i].in[0] <== in[i]; - lt[27][i].in[1] <== 100; + and[64][i].a <== states[i][21]; + and[64][i].b <== eq[60][i].out; and[65][i] = AND(); - and[65][i].a <== lt[26][i].out; - and[65][i].b <== lt[27][i].out; + and[65][i].a <== states[i][22]; + and[65][i].b <== eq[60][i].out; and[66][i] = AND(); - and[66][i].a <== states[i][53]; - multi_or[15][i] = MultiOR(8); - multi_or[15][i].in[0] <== and[39][i].out; - multi_or[15][i].in[1] <== and[65][i].out; - multi_or[15][i].in[2] <== and[51][i].out; - multi_or[15][i].in[3] <== eq[11][i].out; - multi_or[15][i].in[4] <== eq[12][i].out; - multi_or[15][i].in[5] <== eq[13][i].out; - multi_or[15][i].in[6] <== eq[14][i].out; - multi_or[15][i].in[7] <== eq[15][i].out; - and[66][i].b <== multi_or[15][i].out; + and[66][i].a <== states[i][23]; + and[66][i].b <== eq[60][i].out; and[67][i] = AND(); - and[67][i].a <== states[i][54]; - and[67][i].b <== multi_or[11][i].out; + and[67][i].a <== states[i][24]; + and[67][i].b <== eq[60][i].out; + multi_or[13][i] = MultiOR(7); + multi_or[13][i].in[0] <== and[61][i].out; + multi_or[13][i].in[1] <== and[62][i].out; + multi_or[13][i].in[2] <== and[63][i].out; + multi_or[13][i].in[3] <== and[64][i].out; + multi_or[13][i].in[4] <== and[65][i].out; + multi_or[13][i].in[5] <== and[66][i].out; + multi_or[13][i].in[6] <== and[67][i].out; + states[i+1][15] <== multi_or[13][i].out; + eq[61][i] = IsEqual(); + eq[61][i].in[0] <== in[i]; + eq[61][i].in[1] <== 240; and[68][i] = AND(); - and[68][i].a <== states[i][55]; - and[68][i].b <== multi_or[9][i].out; - lt[28][i] = LessEqThan(8); - lt[28][i].in[0] <== 62; - lt[28][i].in[1] <== in[i]; - lt[29][i] = LessEqThan(8); - lt[29][i].in[0] <== in[i]; - lt[29][i].in[1] <== 104; + and[68][i].a <== states[i][11]; + and[68][i].b <== eq[61][i].out; and[69][i] = AND(); - and[69][i].a <== lt[28][i].out; - and[69][i].b <== lt[29][i].out; - eq[40][i] = IsEqual(); - eq[40][i].in[0] <== in[i]; - eq[40][i].in[1] <== 106; - eq[41][i] = IsEqual(); - eq[41][i].in[0] <== in[i]; - eq[41][i].in[1] <== 107; + and[69][i].a <== states[i][19]; + and[69][i].b <== eq[61][i].out; and[70][i] = AND(); - and[70][i].a <== states[i][56]; - multi_or[16][i] = MultiOR(24); - multi_or[16][i].in[0] <== and[39][i].out; - multi_or[16][i].in[1] <== and[44][i].out; - multi_or[16][i].in[2] <== and[69][i].out; - multi_or[16][i].in[3] <== eq[40][i].out; - multi_or[16][i].in[4] <== eq[41][i].out; - multi_or[16][i].in[5] <== eq[16][i].out; - multi_or[16][i].in[6] <== eq[17][i].out; - multi_or[16][i].in[7] <== eq[18][i].out; - multi_or[16][i].in[8] <== eq[19][i].out; - multi_or[16][i].in[9] <== eq[20][i].out; - multi_or[16][i].in[10] <== eq[21][i].out; - multi_or[16][i].in[11] <== eq[22][i].out; - multi_or[16][i].in[12] <== eq[23][i].out; - multi_or[16][i].in[13] <== eq[24][i].out; - multi_or[16][i].in[14] <== eq[25][i].out; - multi_or[16][i].in[15] <== eq[6][i].out; - multi_or[16][i].in[16] <== eq[26][i].out; - multi_or[16][i].in[17] <== eq[27][i].out; - multi_or[16][i].in[18] <== eq[28][i].out; - multi_or[16][i].in[19] <== eq[11][i].out; - multi_or[16][i].in[20] <== eq[12][i].out; - multi_or[16][i].in[21] <== eq[13][i].out; - multi_or[16][i].in[22] <== eq[14][i].out; - multi_or[16][i].in[23] <== eq[15][i].out; - and[70][i].b <== multi_or[16][i].out; - lt[30][i] = LessEqThan(8); - lt[30][i].in[0] <== 35; - lt[30][i].in[1] <== in[i]; - lt[31][i] = LessEqThan(8); - lt[31][i].in[0] <== in[i]; - lt[31][i].in[1] <== 108; + and[70][i].a <== states[i][20]; + and[70][i].b <== eq[61][i].out; and[71][i] = AND(); - and[71][i].a <== lt[30][i].out; - and[71][i].b <== lt[31][i].out; + and[71][i].a <== states[i][21]; + and[71][i].b <== eq[61][i].out; and[72][i] = AND(); - and[72][i].a <== states[i][57]; - multi_or[17][i] = MultiOR(19); - multi_or[17][i].in[0] <== and[39][i].out; - multi_or[17][i].in[1] <== and[71][i].out; - multi_or[17][i].in[2] <== eq[18][i].out; - multi_or[17][i].in[3] <== eq[19][i].out; - multi_or[17][i].in[4] <== eq[20][i].out; - multi_or[17][i].in[5] <== eq[21][i].out; - multi_or[17][i].in[6] <== eq[22][i].out; - multi_or[17][i].in[7] <== eq[23][i].out; - multi_or[17][i].in[8] <== eq[24][i].out; - multi_or[17][i].in[9] <== eq[25][i].out; - multi_or[17][i].in[10] <== eq[6][i].out; - multi_or[17][i].in[11] <== eq[26][i].out; - multi_or[17][i].in[12] <== eq[27][i].out; - multi_or[17][i].in[13] <== eq[28][i].out; - multi_or[17][i].in[14] <== eq[11][i].out; - multi_or[17][i].in[15] <== eq[12][i].out; - multi_or[17][i].in[16] <== eq[13][i].out; - multi_or[17][i].in[17] <== eq[14][i].out; - multi_or[17][i].in[18] <== eq[15][i].out; - and[72][i].b <== multi_or[17][i].out; + and[72][i].a <== states[i][22]; + and[72][i].b <== eq[61][i].out; and[73][i] = AND(); - and[73][i].a <== states[i][58]; - and[73][i].b <== multi_or[11][i].out; + and[73][i].a <== states[i][23]; + and[73][i].b <== eq[61][i].out; and[74][i] = AND(); - and[74][i].a <== states[i][59]; - and[74][i].b <== multi_or[9][i].out; - lt[32][i] = LessEqThan(8); - lt[32][i].in[0] <== 62; - lt[32][i].in[1] <== in[i]; - lt[33][i] = LessEqThan(8); - lt[33][i].in[0] <== in[i]; - lt[33][i].in[1] <== 107; + and[74][i].a <== states[i][24]; + and[74][i].b <== eq[61][i].out; + multi_or[14][i] = MultiOR(7); + multi_or[14][i].in[0] <== and[68][i].out; + multi_or[14][i].in[1] <== and[69][i].out; + multi_or[14][i].in[2] <== and[70][i].out; + multi_or[14][i].in[3] <== and[71][i].out; + multi_or[14][i].in[4] <== and[72][i].out; + multi_or[14][i].in[5] <== and[73][i].out; + multi_or[14][i].in[6] <== and[74][i].out; + states[i+1][16] <== multi_or[14][i].out; + eq[62][i] = IsEqual(); + eq[62][i].in[0] <== in[i]; + eq[62][i].in[1] <== 241; + eq[63][i] = IsEqual(); + eq[63][i].in[0] <== in[i]; + eq[63][i].in[1] <== 242; + eq[64][i] = IsEqual(); + eq[64][i].in[0] <== in[i]; + eq[64][i].in[1] <== 243; and[75][i] = AND(); - and[75][i].a <== lt[32][i].out; - and[75][i].b <== lt[33][i].out; + and[75][i].a <== states[i][11]; + multi_or[15][i] = MultiOR(3); + multi_or[15][i].in[0] <== eq[62][i].out; + multi_or[15][i].in[1] <== eq[63][i].out; + multi_or[15][i].in[2] <== eq[64][i].out; + and[75][i].b <== multi_or[15][i].out; and[76][i] = AND(); - and[76][i].a <== states[i][60]; - multi_or[18][i] = MultiOR(21); - multi_or[18][i].in[0] <== and[39][i].out; - multi_or[18][i].in[1] <== and[44][i].out; - multi_or[18][i].in[2] <== and[75][i].out; - multi_or[18][i].in[3] <== eq[17][i].out; - multi_or[18][i].in[4] <== eq[18][i].out; - multi_or[18][i].in[5] <== eq[19][i].out; - multi_or[18][i].in[6] <== eq[20][i].out; - multi_or[18][i].in[7] <== eq[21][i].out; - multi_or[18][i].in[8] <== eq[22][i].out; - multi_or[18][i].in[9] <== eq[23][i].out; - multi_or[18][i].in[10] <== eq[24][i].out; - multi_or[18][i].in[11] <== eq[25][i].out; - multi_or[18][i].in[12] <== eq[6][i].out; - multi_or[18][i].in[13] <== eq[26][i].out; - multi_or[18][i].in[14] <== eq[27][i].out; - multi_or[18][i].in[15] <== eq[28][i].out; - multi_or[18][i].in[16] <== eq[11][i].out; - multi_or[18][i].in[17] <== eq[12][i].out; - multi_or[18][i].in[18] <== eq[13][i].out; - multi_or[18][i].in[19] <== eq[14][i].out; - multi_or[18][i].in[20] <== eq[15][i].out; - and[76][i].b <== multi_or[18][i].out; - lt[34][i] = LessEqThan(8); - lt[34][i].in[0] <== 35; - lt[34][i].in[1] <== in[i]; - lt[35][i] = LessEqThan(8); - lt[35][i].in[0] <== in[i]; - lt[35][i].in[1] <== 96; + and[76][i].a <== states[i][19]; + and[76][i].b <== multi_or[15][i].out; and[77][i] = AND(); - and[77][i].a <== lt[34][i].out; - and[77][i].b <== lt[35][i].out; + and[77][i].a <== states[i][20]; + and[77][i].b <== multi_or[15][i].out; and[78][i] = AND(); - and[78][i].a <== states[i][61]; - multi_or[19][i] = MultiOR(8); - multi_or[19][i].in[0] <== and[39][i].out; - multi_or[19][i].in[1] <== and[77][i].out; - multi_or[19][i].in[2] <== and[63][i].out; - multi_or[19][i].in[3] <== eq[11][i].out; - multi_or[19][i].in[4] <== eq[12][i].out; - multi_or[19][i].in[5] <== eq[13][i].out; - multi_or[19][i].in[6] <== eq[14][i].out; - multi_or[19][i].in[7] <== eq[15][i].out; - and[78][i].b <== multi_or[19][i].out; + and[78][i].a <== states[i][21]; + and[78][i].b <== multi_or[15][i].out; and[79][i] = AND(); - and[79][i].a <== states[i][62]; - and[79][i].b <== multi_or[11][i].out; + and[79][i].a <== states[i][22]; + and[79][i].b <== multi_or[15][i].out; and[80][i] = AND(); - and[80][i].a <== states[i][63]; - and[80][i].b <== multi_or[9][i].out; - lt[36][i] = LessEqThan(8); - lt[36][i].in[0] <== 35; - lt[36][i].in[1] <== in[i]; - lt[37][i] = LessEqThan(8); - lt[37][i].in[0] <== in[i]; - lt[37][i].in[1] <== 104; + and[80][i].a <== states[i][23]; + and[80][i].b <== multi_or[15][i].out; and[81][i] = AND(); - and[81][i].a <== lt[36][i].out; - and[81][i].b <== lt[37][i].out; + and[81][i].a <== states[i][24]; + and[81][i].b <== multi_or[15][i].out; + multi_or[16][i] = MultiOR(7); + multi_or[16][i].in[0] <== and[75][i].out; + multi_or[16][i].in[1] <== and[76][i].out; + multi_or[16][i].in[2] <== and[77][i].out; + multi_or[16][i].in[3] <== and[78][i].out; + multi_or[16][i].in[4] <== and[79][i].out; + multi_or[16][i].in[5] <== and[80][i].out; + multi_or[16][i].in[6] <== and[81][i].out; + states[i+1][17] <== multi_or[16][i].out; + eq[65][i] = IsEqual(); + eq[65][i].in[0] <== in[i]; + eq[65][i].in[1] <== 244; and[82][i] = AND(); - and[82][i].a <== states[i][65]; - multi_or[20][i] = MultiOR(23); - multi_or[20][i].in[0] <== and[39][i].out; - multi_or[20][i].in[1] <== and[81][i].out; - multi_or[20][i].in[2] <== eq[40][i].out; - multi_or[20][i].in[3] <== eq[41][i].out; - multi_or[20][i].in[4] <== eq[16][i].out; - multi_or[20][i].in[5] <== eq[17][i].out; - multi_or[20][i].in[6] <== eq[18][i].out; - multi_or[20][i].in[7] <== eq[19][i].out; - multi_or[20][i].in[8] <== eq[20][i].out; - multi_or[20][i].in[9] <== eq[21][i].out; - multi_or[20][i].in[10] <== eq[22][i].out; - multi_or[20][i].in[11] <== eq[23][i].out; - multi_or[20][i].in[12] <== eq[24][i].out; - multi_or[20][i].in[13] <== eq[25][i].out; - multi_or[20][i].in[14] <== eq[6][i].out; - multi_or[20][i].in[15] <== eq[26][i].out; - multi_or[20][i].in[16] <== eq[27][i].out; - multi_or[20][i].in[17] <== eq[28][i].out; - multi_or[20][i].in[18] <== eq[11][i].out; - multi_or[20][i].in[19] <== eq[12][i].out; - multi_or[20][i].in[20] <== eq[13][i].out; - multi_or[20][i].in[21] <== eq[14][i].out; - multi_or[20][i].in[22] <== eq[15][i].out; - and[82][i].b <== multi_or[20][i].out; + and[82][i].a <== states[i][11]; + and[82][i].b <== eq[65][i].out; and[83][i] = AND(); - and[83][i].a <== states[i][66]; - and[83][i].b <== multi_or[11][i].out; - lt[38][i] = LessEqThan(8); - lt[38][i].in[0] <== 35; - lt[38][i].in[1] <== in[i]; - lt[39][i] = LessEqThan(8); - lt[39][i].in[0] <== in[i]; - lt[39][i].in[1] <== 107; + and[83][i].a <== states[i][19]; + and[83][i].b <== eq[65][i].out; and[84][i] = AND(); - and[84][i].a <== lt[38][i].out; - and[84][i].b <== lt[39][i].out; + and[84][i].a <== states[i][20]; + and[84][i].b <== eq[65][i].out; and[85][i] = AND(); - and[85][i].a <== states[i][75]; - multi_or[21][i] = MultiOR(20); - multi_or[21][i].in[0] <== and[39][i].out; - multi_or[21][i].in[1] <== and[84][i].out; - multi_or[21][i].in[2] <== eq[17][i].out; - multi_or[21][i].in[3] <== eq[18][i].out; - multi_or[21][i].in[4] <== eq[19][i].out; - multi_or[21][i].in[5] <== eq[20][i].out; - multi_or[21][i].in[6] <== eq[21][i].out; - multi_or[21][i].in[7] <== eq[22][i].out; - multi_or[21][i].in[8] <== eq[23][i].out; - multi_or[21][i].in[9] <== eq[24][i].out; - multi_or[21][i].in[10] <== eq[25][i].out; - multi_or[21][i].in[11] <== eq[6][i].out; - multi_or[21][i].in[12] <== eq[26][i].out; - multi_or[21][i].in[13] <== eq[27][i].out; - multi_or[21][i].in[14] <== eq[28][i].out; - multi_or[21][i].in[15] <== eq[11][i].out; - multi_or[21][i].in[16] <== eq[12][i].out; - multi_or[21][i].in[17] <== eq[13][i].out; - multi_or[21][i].in[18] <== eq[14][i].out; - multi_or[21][i].in[19] <== eq[15][i].out; - and[85][i].b <== multi_or[21][i].out; - multi_or[22][i] = MultiOR(28); - multi_or[22][i].in[0] <== and[38][i].out; - multi_or[22][i].in[1] <== and[41][i].out; - multi_or[22][i].in[2] <== and[43][i].out; - multi_or[22][i].in[3] <== and[46][i].out; - multi_or[22][i].in[4] <== and[47][i].out; - multi_or[22][i].in[5] <== and[49][i].out; - multi_or[22][i].in[6] <== and[52][i].out; - multi_or[22][i].in[7] <== and[54][i].out; - multi_or[22][i].in[8] <== and[55][i].out; - multi_or[22][i].in[9] <== and[57][i].out; - multi_or[22][i].in[10] <== and[59][i].out; - multi_or[22][i].in[11] <== and[60][i].out; - multi_or[22][i].in[12] <== and[61][i].out; - multi_or[22][i].in[13] <== and[64][i].out; - multi_or[22][i].in[14] <== and[66][i].out; - multi_or[22][i].in[15] <== and[67][i].out; - multi_or[22][i].in[16] <== and[68][i].out; - multi_or[22][i].in[17] <== and[70][i].out; - multi_or[22][i].in[18] <== and[72][i].out; - multi_or[22][i].in[19] <== and[73][i].out; - multi_or[22][i].in[20] <== and[74][i].out; - multi_or[22][i].in[21] <== and[76][i].out; - multi_or[22][i].in[22] <== and[78][i].out; - multi_or[22][i].in[23] <== and[79][i].out; - multi_or[22][i].in[24] <== and[80][i].out; - multi_or[22][i].in[25] <== and[82][i].out; - multi_or[22][i].in[26] <== and[83][i].out; - multi_or[22][i].in[27] <== and[85][i].out; - states[i+1][32] <== multi_or[22][i].out; + and[85][i].a <== states[i][21]; + and[85][i].b <== eq[65][i].out; and[86][i] = AND(); - and[86][i].a <== states[i][30]; - and[86][i].b <== eq[1][i].out; - states[i+1][33] <== and[86][i].out; + and[86][i].a <== states[i][22]; + and[86][i].b <== eq[65][i].out; and[87][i] = AND(); - and[87][i].a <== states[i][31]; - and[87][i].b <== eq[3][i].out; - states[i+1][34] <== and[87][i].out; - lt[40][i] = LessEqThan(8); - lt[40][i].in[0] <== 194; - lt[40][i].in[1] <== in[i]; - lt[41][i] = LessEqThan(8); - lt[41][i].in[0] <== in[i]; - lt[41][i].in[1] <== 223; + and[87][i].a <== states[i][23]; + and[87][i].b <== eq[65][i].out; and[88][i] = AND(); - and[88][i].a <== lt[40][i].out; - and[88][i].b <== lt[41][i].out; + and[88][i].a <== states[i][24]; + and[88][i].b <== eq[65][i].out; + multi_or[17][i] = MultiOR(7); + multi_or[17][i].in[0] <== and[82][i].out; + multi_or[17][i].in[1] <== and[83][i].out; + multi_or[17][i].in[2] <== and[84][i].out; + multi_or[17][i].in[3] <== and[85][i].out; + multi_or[17][i].in[4] <== and[86][i].out; + multi_or[17][i].in[5] <== and[87][i].out; + multi_or[17][i].in[6] <== and[88][i].out; + states[i+1][18] <== multi_or[17][i].out; + eq[66][i] = IsEqual(); + eq[66][i].in[0] <== in[i]; + eq[66][i].in[1] <== 122; and[89][i] = AND(); - and[89][i].a <== states[i][32]; - and[89][i].b <== and[88][i].out; - lt[42][i] = LessEqThan(8); - lt[42][i].in[0] <== 160; - lt[42][i].in[1] <== in[i]; - lt[43][i] = LessEqThan(8); - lt[43][i].in[0] <== in[i]; - lt[43][i].in[1] <== 191; + and[89][i].a <== states[i][11]; + and[89][i].b <== eq[66][i].out; and[90][i] = AND(); - and[90][i].a <== lt[42][i].out; - and[90][i].b <== lt[43][i].out; + and[90][i].a <== states[i][19]; + and[90][i].b <== eq[66][i].out; and[91][i] = AND(); - and[91][i].a <== states[i][36]; - and[91][i].b <== and[90][i].out; + and[91][i].a <== states[i][20]; + and[91][i].b <== eq[66][i].out; and[92][i] = AND(); - and[92][i].a <== states[i][37]; - and[92][i].b <== and[42][i].out; - lt[44][i] = LessEqThan(8); - lt[44][i].in[0] <== 128; - lt[44][i].in[1] <== in[i]; - lt[45][i] = LessEqThan(8); - lt[45][i].in[0] <== in[i]; - lt[45][i].in[1] <== 159; + and[92][i].a <== states[i][21]; + and[92][i].b <== eq[66][i].out; and[93][i] = AND(); - and[93][i].a <== lt[44][i].out; - and[93][i].b <== lt[45][i].out; + and[93][i].a <== states[i][22]; + and[93][i].b <== eq[66][i].out; and[94][i] = AND(); - and[94][i].a <== states[i][38]; - and[94][i].b <== and[93][i].out; + and[94][i].a <== states[i][23]; + and[94][i].b <== eq[66][i].out; and[95][i] = AND(); - and[95][i].a <== states[i][42]; - and[95][i].b <== and[88][i].out; + and[95][i].a <== states[i][24]; + and[95][i].b <== eq[66][i].out; + multi_or[18][i] = MultiOR(7); + multi_or[18][i].in[0] <== and[89][i].out; + multi_or[18][i].in[1] <== and[90][i].out; + multi_or[18][i].in[2] <== and[91][i].out; + multi_or[18][i].in[3] <== and[92][i].out; + multi_or[18][i].in[4] <== and[93][i].out; + multi_or[18][i].in[5] <== and[94][i].out; + multi_or[18][i].in[6] <== and[95][i].out; + states[i+1][19] <== multi_or[18][i].out; and[96][i] = AND(); - and[96][i].a <== states[i][44]; - and[96][i].b <== and[88][i].out; + and[96][i].a <== states[i][19]; + and[96][i].b <== eq[28][i].out; + states[i+1][20] <== and[96][i].out; + eq[67][i] = IsEqual(); + eq[67][i].in[0] <== in[i]; + eq[67][i].in[1] <== 101; and[97][i] = AND(); - and[97][i].a <== states[i][45]; - and[97][i].b <== and[88][i].out; + and[97][i].a <== states[i][20]; + and[97][i].b <== eq[67][i].out; + states[i+1][21] <== and[97][i].out; and[98][i] = AND(); - and[98][i].a <== states[i][46]; - and[98][i].b <== and[88][i].out; + and[98][i].a <== states[i][21]; + and[98][i].b <== eq[15][i].out; + states[i+1][22] <== and[98][i].out; + eq[68][i] = IsEqual(); + eq[68][i].in[0] <== in[i]; + eq[68][i].in[1] <== 97; and[99][i] = AND(); - and[99][i].a <== states[i][47]; - and[99][i].b <== and[88][i].out; + and[99][i].a <== states[i][22]; + and[99][i].b <== eq[68][i].out; + states[i+1][23] <== and[99][i].out; and[100][i] = AND(); - and[100][i].a <== states[i][48]; - and[100][i].b <== and[88][i].out; + and[100][i].a <== states[i][23]; + and[100][i].b <== eq[2][i].out; + states[i+1][24] <== and[100][i].out; and[101][i] = AND(); - and[101][i].a <== states[i][49]; - and[101][i].b <== and[88][i].out; + and[101][i].a <== states[i][24]; + and[101][i].b <== eq[14][i].out; + lt[30][i] = LessEqThan(8); + lt[30][i].in[0] <== 35; + lt[30][i].in[1] <== in[i]; + lt[31][i] = LessEqThan(8); + lt[31][i].in[0] <== in[i]; + lt[31][i].in[1] <== 127; and[102][i] = AND(); - and[102][i].a <== states[i][50]; - and[102][i].b <== and[88][i].out; + and[102][i].a <== lt[30][i].out; + and[102][i].b <== lt[31][i].out; and[103][i] = AND(); - and[103][i].a <== states[i][51]; - and[103][i].b <== and[88][i].out; + and[103][i].a <== states[i][25]; + multi_or[19][i] = MultiOR(2); + multi_or[19][i].in[0] <== and[11][i].out; + multi_or[19][i].in[1] <== and[102][i].out; + and[103][i].b <== multi_or[19][i].out; and[104][i] = AND(); - and[104][i].a <== states[i][52]; - and[104][i].b <== and[88][i].out; + and[104][i].a <== states[i][27]; + and[104][i].b <== and[14][i].out; + multi_or[20][i] = MultiOR(3); + multi_or[20][i].in[0] <== and[101][i].out; + multi_or[20][i].in[1] <== and[103][i].out; + multi_or[20][i].in[2] <== and[104][i].out; + states[i+1][25] <== multi_or[20][i].out; and[105][i] = AND(); - and[105][i].a <== states[i][53]; - and[105][i].b <== and[88][i].out; + and[105][i].a <== states[i][25]; + and[105][i].b <== eq[8][i].out; + lt[32][i] = LessEqThan(8); + lt[32][i].in[0] <== 1; + lt[32][i].in[1] <== in[i]; + lt[33][i] = LessEqThan(8); + lt[33][i].in[0] <== in[i]; + lt[33][i].in[1] <== 61; and[106][i] = AND(); - and[106][i].a <== states[i][54]; - and[106][i].b <== and[88][i].out; + and[106][i].a <== lt[32][i].out; + and[106][i].b <== lt[33][i].out; + lt[34][i] = LessEqThan(8); + lt[34][i].in[0] <== 63; + lt[34][i].in[1] <== in[i]; + lt[35][i] = LessEqThan(8); + lt[35][i].in[0] <== in[i]; + lt[35][i].in[1] <== 127; and[107][i] = AND(); - and[107][i].a <== states[i][55]; - and[107][i].b <== and[88][i].out; + and[107][i].a <== lt[34][i].out; + and[107][i].b <== lt[35][i].out; and[108][i] = AND(); - and[108][i].a <== states[i][56]; - and[108][i].b <== and[88][i].out; + and[108][i].a <== states[i][26]; + multi_or[21][i] = MultiOR(2); + multi_or[21][i].in[0] <== and[106][i].out; + multi_or[21][i].in[1] <== and[107][i].out; + and[108][i].b <== multi_or[21][i].out; and[109][i] = AND(); - and[109][i].a <== states[i][57]; - and[109][i].b <== and[88][i].out; + and[109][i].a <== states[i][35]; + and[109][i].b <== and[14][i].out; + multi_or[22][i] = MultiOR(3); + multi_or[22][i].in[0] <== and[105][i].out; + multi_or[22][i].in[1] <== and[108][i].out; + multi_or[22][i].in[2] <== and[109][i].out; + states[i+1][26] <== multi_or[22][i].out; and[110][i] = AND(); - and[110][i].a <== states[i][58]; - and[110][i].b <== and[88][i].out; + and[110][i].a <== states[i][25]; + and[110][i].b <== and[30][i].out; and[111][i] = AND(); - and[111][i].a <== states[i][59]; - and[111][i].b <== and[88][i].out; + and[111][i].a <== states[i][28]; + and[111][i].b <== and[32][i].out; and[112][i] = AND(); - and[112][i].a <== states[i][60]; - and[112][i].b <== and[88][i].out; + and[112][i].a <== states[i][29]; + and[112][i].b <== and[14][i].out; and[113][i] = AND(); - and[113][i].a <== states[i][61]; - and[113][i].b <== and[88][i].out; + and[113][i].a <== states[i][30]; + and[113][i].b <== and[35][i].out; + multi_or[23][i] = MultiOR(4); + multi_or[23][i].in[0] <== and[110][i].out; + multi_or[23][i].in[1] <== and[111][i].out; + multi_or[23][i].in[2] <== and[112][i].out; + multi_or[23][i].in[3] <== and[113][i].out; + states[i+1][27] <== multi_or[23][i].out; and[114][i] = AND(); - and[114][i].a <== states[i][62]; - and[114][i].b <== and[88][i].out; + and[114][i].a <== states[i][25]; + and[114][i].b <== eq[29][i].out; + states[i+1][28] <== and[114][i].out; and[115][i] = AND(); - and[115][i].a <== states[i][63]; - and[115][i].b <== and[88][i].out; + and[115][i].a <== states[i][25]; + and[115][i].b <== multi_or[10][i].out; and[116][i] = AND(); - and[116][i].a <== states[i][65]; - and[116][i].b <== and[88][i].out; + and[116][i].a <== states[i][31]; + and[116][i].b <== and[51][i].out; and[117][i] = AND(); - and[117][i].a <== states[i][66]; - and[117][i].b <== and[88][i].out; + and[117][i].a <== states[i][32]; + and[117][i].b <== and[14][i].out; and[118][i] = AND(); - and[118][i].a <== states[i][75]; - and[118][i].b <== and[88][i].out; - multi_or[23][i] = MultiOR(28); - multi_or[23][i].in[0] <== and[89][i].out; - multi_or[23][i].in[1] <== and[91][i].out; - multi_or[23][i].in[2] <== and[92][i].out; - multi_or[23][i].in[3] <== and[94][i].out; - multi_or[23][i].in[4] <== and[95][i].out; - multi_or[23][i].in[5] <== and[96][i].out; - multi_or[23][i].in[6] <== and[97][i].out; - multi_or[23][i].in[7] <== and[98][i].out; - multi_or[23][i].in[8] <== and[99][i].out; - multi_or[23][i].in[9] <== and[100][i].out; - multi_or[23][i].in[10] <== and[101][i].out; - multi_or[23][i].in[11] <== and[102][i].out; - multi_or[23][i].in[12] <== and[103][i].out; - multi_or[23][i].in[13] <== and[104][i].out; - multi_or[23][i].in[14] <== and[105][i].out; - multi_or[23][i].in[15] <== and[106][i].out; - multi_or[23][i].in[16] <== and[107][i].out; - multi_or[23][i].in[17] <== and[108][i].out; - multi_or[23][i].in[18] <== and[109][i].out; - multi_or[23][i].in[19] <== and[110][i].out; - multi_or[23][i].in[20] <== and[111][i].out; - multi_or[23][i].in[21] <== and[112][i].out; - multi_or[23][i].in[22] <== and[113][i].out; - multi_or[23][i].in[23] <== and[114][i].out; - multi_or[23][i].in[24] <== and[115][i].out; - multi_or[23][i].in[25] <== and[116][i].out; - multi_or[23][i].in[26] <== and[117][i].out; - multi_or[23][i].in[27] <== and[118][i].out; - states[i+1][35] <== multi_or[23][i].out; - eq[42][i] = IsEqual(); - eq[42][i].in[0] <== in[i]; - eq[42][i].in[1] <== 224; + and[118][i].a <== states[i][33]; + and[118][i].b <== multi_or[11][i].out; + multi_or[24][i] = MultiOR(4); + multi_or[24][i].in[0] <== and[115][i].out; + multi_or[24][i].in[1] <== and[116][i].out; + multi_or[24][i].in[2] <== and[117][i].out; + multi_or[24][i].in[3] <== and[118][i].out; + states[i+1][29] <== multi_or[24][i].out; and[119][i] = AND(); - and[119][i].a <== states[i][32]; - and[119][i].b <== eq[42][i].out; + and[119][i].a <== states[i][25]; + and[119][i].b <== eq[60][i].out; + states[i+1][30] <== and[119][i].out; and[120][i] = AND(); - and[120][i].a <== states[i][42]; - and[120][i].b <== eq[42][i].out; + and[120][i].a <== states[i][25]; + and[120][i].b <== eq[61][i].out; + states[i+1][31] <== and[120][i].out; and[121][i] = AND(); - and[121][i].a <== states[i][44]; - and[121][i].b <== eq[42][i].out; + and[121][i].a <== states[i][25]; + and[121][i].b <== multi_or[15][i].out; + states[i+1][32] <== and[121][i].out; and[122][i] = AND(); - and[122][i].a <== states[i][45]; - and[122][i].b <== eq[42][i].out; + and[122][i].a <== states[i][25]; + and[122][i].b <== eq[65][i].out; + states[i+1][33] <== and[122][i].out; + eq[69][i] = IsEqual(); + eq[69][i].in[0] <== in[i]; + eq[69][i].in[1] <== 62; and[123][i] = AND(); - and[123][i].a <== states[i][46]; - and[123][i].b <== eq[42][i].out; + and[123][i].a <== states[i][26]; + and[123][i].b <== eq[69][i].out; + states[i+1][34] <== and[123][i].out; and[124][i] = AND(); - and[124][i].a <== states[i][47]; - and[124][i].b <== eq[42][i].out; + and[124][i].a <== states[i][26]; + and[124][i].b <== and[30][i].out; and[125][i] = AND(); - and[125][i].a <== states[i][48]; - and[125][i].b <== eq[42][i].out; + and[125][i].a <== states[i][36]; + and[125][i].b <== and[32][i].out; and[126][i] = AND(); - and[126][i].a <== states[i][49]; - and[126][i].b <== eq[42][i].out; + and[126][i].a <== states[i][37]; + and[126][i].b <== and[14][i].out; and[127][i] = AND(); - and[127][i].a <== states[i][50]; - and[127][i].b <== eq[42][i].out; + and[127][i].a <== states[i][38]; + and[127][i].b <== and[35][i].out; + multi_or[25][i] = MultiOR(4); + multi_or[25][i].in[0] <== and[124][i].out; + multi_or[25][i].in[1] <== and[125][i].out; + multi_or[25][i].in[2] <== and[126][i].out; + multi_or[25][i].in[3] <== and[127][i].out; + states[i+1][35] <== multi_or[25][i].out; and[128][i] = AND(); - and[128][i].a <== states[i][51]; - and[128][i].b <== eq[42][i].out; + and[128][i].a <== states[i][26]; + and[128][i].b <== eq[29][i].out; + states[i+1][36] <== and[128][i].out; and[129][i] = AND(); - and[129][i].a <== states[i][52]; - and[129][i].b <== eq[42][i].out; + and[129][i].a <== states[i][26]; + and[129][i].b <== multi_or[10][i].out; and[130][i] = AND(); - and[130][i].a <== states[i][53]; - and[130][i].b <== eq[42][i].out; + and[130][i].a <== states[i][39]; + and[130][i].b <== and[51][i].out; and[131][i] = AND(); - and[131][i].a <== states[i][54]; - and[131][i].b <== eq[42][i].out; + and[131][i].a <== states[i][40]; + and[131][i].b <== and[14][i].out; and[132][i] = AND(); - and[132][i].a <== states[i][55]; - and[132][i].b <== eq[42][i].out; + and[132][i].a <== states[i][41]; + and[132][i].b <== multi_or[11][i].out; + multi_or[26][i] = MultiOR(4); + multi_or[26][i].in[0] <== and[129][i].out; + multi_or[26][i].in[1] <== and[130][i].out; + multi_or[26][i].in[2] <== and[131][i].out; + multi_or[26][i].in[3] <== and[132][i].out; + states[i+1][37] <== multi_or[26][i].out; and[133][i] = AND(); - and[133][i].a <== states[i][56]; - and[133][i].b <== eq[42][i].out; + and[133][i].a <== states[i][26]; + and[133][i].b <== eq[60][i].out; + states[i+1][38] <== and[133][i].out; and[134][i] = AND(); - and[134][i].a <== states[i][57]; - and[134][i].b <== eq[42][i].out; + and[134][i].a <== states[i][26]; + and[134][i].b <== eq[61][i].out; + states[i+1][39] <== and[134][i].out; and[135][i] = AND(); - and[135][i].a <== states[i][58]; - and[135][i].b <== eq[42][i].out; + and[135][i].a <== states[i][26]; + and[135][i].b <== multi_or[15][i].out; + states[i+1][40] <== and[135][i].out; and[136][i] = AND(); - and[136][i].a <== states[i][59]; - and[136][i].b <== eq[42][i].out; + and[136][i].a <== states[i][26]; + and[136][i].b <== eq[65][i].out; + states[i+1][41] <== and[136][i].out; + lt[36][i] = LessEqThan(8); + lt[36][i].in[0] <== 1; + lt[36][i].in[1] <== in[i]; + lt[37][i] = LessEqThan(8); + lt[37][i].in[0] <== in[i]; + lt[37][i].in[1] <== 46; and[137][i] = AND(); - and[137][i].a <== states[i][60]; - and[137][i].b <== eq[42][i].out; + and[137][i].a <== lt[36][i].out; + and[137][i].b <== lt[37][i].out; + eq[70][i] = IsEqual(); + eq[70][i].in[0] <== in[i]; + eq[70][i].in[1] <== 48; + eq[71][i] = IsEqual(); + eq[71][i].in[0] <== in[i]; + eq[71][i].in[1] <== 49; + eq[72][i] = IsEqual(); + eq[72][i].in[0] <== in[i]; + eq[72][i].in[1] <== 50; + eq[73][i] = IsEqual(); + eq[73][i].in[0] <== in[i]; + eq[73][i].in[1] <== 52; + eq[74][i] = IsEqual(); + eq[74][i].in[0] <== in[i]; + eq[74][i].in[1] <== 53; + eq[75][i] = IsEqual(); + eq[75][i].in[0] <== in[i]; + eq[75][i].in[1] <== 54; + eq[76][i] = IsEqual(); + eq[76][i].in[0] <== in[i]; + eq[76][i].in[1] <== 55; + eq[77][i] = IsEqual(); + eq[77][i].in[0] <== in[i]; + eq[77][i].in[1] <== 56; + eq[78][i] = IsEqual(); + eq[78][i].in[0] <== in[i]; + eq[78][i].in[1] <== 57; + eq[79][i] = IsEqual(); + eq[79][i].in[0] <== in[i]; + eq[79][i].in[1] <== 58; + eq[80][i] = IsEqual(); + eq[80][i].in[0] <== in[i]; + eq[80][i].in[1] <== 59; and[138][i] = AND(); - and[138][i].a <== states[i][61]; - and[138][i].b <== eq[42][i].out; + and[138][i].a <== states[i][34]; + multi_or[27][i] = MultiOR(15); + multi_or[27][i].in[0] <== and[137][i].out; + multi_or[27][i].in[1] <== and[107][i].out; + multi_or[27][i].in[2] <== eq[70][i].out; + multi_or[27][i].in[3] <== eq[71][i].out; + multi_or[27][i].in[4] <== eq[72][i].out; + multi_or[27][i].in[5] <== eq[6][i].out; + multi_or[27][i].in[6] <== eq[73][i].out; + multi_or[27][i].in[7] <== eq[74][i].out; + multi_or[27][i].in[8] <== eq[75][i].out; + multi_or[27][i].in[9] <== eq[76][i].out; + multi_or[27][i].in[10] <== eq[77][i].out; + multi_or[27][i].in[11] <== eq[78][i].out; + multi_or[27][i].in[12] <== eq[79][i].out; + multi_or[27][i].in[13] <== eq[80][i].out; + multi_or[27][i].in[14] <== eq[5][i].out; + and[138][i].b <== multi_or[27][i].out; and[139][i] = AND(); - and[139][i].a <== states[i][62]; - and[139][i].b <== eq[42][i].out; + and[139][i].a <== states[i][42]; + and[139][i].b <== multi_or[27][i].out; and[140][i] = AND(); - and[140][i].a <== states[i][63]; - and[140][i].b <== eq[42][i].out; + and[140][i].a <== states[i][43]; + and[140][i].b <== and[14][i].out; + multi_or[28][i] = MultiOR(3); + multi_or[28][i].in[0] <== and[138][i].out; + multi_or[28][i].in[1] <== and[139][i].out; + multi_or[28][i].in[2] <== and[140][i].out; + states[i+1][42] <== multi_or[28][i].out; and[141][i] = AND(); - and[141][i].a <== states[i][65]; - and[141][i].b <== eq[42][i].out; + and[141][i].a <== states[i][34]; + and[141][i].b <== and[30][i].out; and[142][i] = AND(); - and[142][i].a <== states[i][66]; - and[142][i].b <== eq[42][i].out; + and[142][i].a <== states[i][42]; + and[142][i].b <== and[30][i].out; and[143][i] = AND(); - and[143][i].a <== states[i][75]; - and[143][i].b <== eq[42][i].out; - multi_or[24][i] = MultiOR(25); - multi_or[24][i].in[0] <== and[119][i].out; - multi_or[24][i].in[1] <== and[120][i].out; - multi_or[24][i].in[2] <== and[121][i].out; - multi_or[24][i].in[3] <== and[122][i].out; - multi_or[24][i].in[4] <== and[123][i].out; - multi_or[24][i].in[5] <== and[124][i].out; - multi_or[24][i].in[6] <== and[125][i].out; - multi_or[24][i].in[7] <== and[126][i].out; - multi_or[24][i].in[8] <== and[127][i].out; - multi_or[24][i].in[9] <== and[128][i].out; - multi_or[24][i].in[10] <== and[129][i].out; - multi_or[24][i].in[11] <== and[130][i].out; - multi_or[24][i].in[12] <== and[131][i].out; - multi_or[24][i].in[13] <== and[132][i].out; - multi_or[24][i].in[14] <== and[133][i].out; - multi_or[24][i].in[15] <== and[134][i].out; - multi_or[24][i].in[16] <== and[135][i].out; - multi_or[24][i].in[17] <== and[136][i].out; - multi_or[24][i].in[18] <== and[137][i].out; - multi_or[24][i].in[19] <== and[138][i].out; - multi_or[24][i].in[20] <== and[139][i].out; - multi_or[24][i].in[21] <== and[140][i].out; - multi_or[24][i].in[22] <== and[141][i].out; - multi_or[24][i].in[23] <== and[142][i].out; - multi_or[24][i].in[24] <== and[143][i].out; - states[i+1][36] <== multi_or[24][i].out; - eq[43][i] = IsEqual(); - eq[43][i].in[0] <== in[i]; - eq[43][i].in[1] <== 225; - eq[44][i] = IsEqual(); - eq[44][i].in[0] <== in[i]; - eq[44][i].in[1] <== 226; - eq[45][i] = IsEqual(); - eq[45][i].in[0] <== in[i]; - eq[45][i].in[1] <== 227; - eq[46][i] = IsEqual(); - eq[46][i].in[0] <== in[i]; - eq[46][i].in[1] <== 228; - eq[47][i] = IsEqual(); - eq[47][i].in[0] <== in[i]; - eq[47][i].in[1] <== 229; - eq[48][i] = IsEqual(); - eq[48][i].in[0] <== in[i]; - eq[48][i].in[1] <== 230; - eq[49][i] = IsEqual(); - eq[49][i].in[0] <== in[i]; - eq[49][i].in[1] <== 231; - eq[50][i] = IsEqual(); - eq[50][i].in[0] <== in[i]; - eq[50][i].in[1] <== 232; - eq[51][i] = IsEqual(); - eq[51][i].in[0] <== in[i]; - eq[51][i].in[1] <== 233; - eq[52][i] = IsEqual(); - eq[52][i].in[0] <== in[i]; - eq[52][i].in[1] <== 234; - eq[53][i] = IsEqual(); - eq[53][i].in[0] <== in[i]; - eq[53][i].in[1] <== 235; - eq[54][i] = IsEqual(); - eq[54][i].in[0] <== in[i]; - eq[54][i].in[1] <== 236; - eq[55][i] = IsEqual(); - eq[55][i].in[0] <== in[i]; - eq[55][i].in[1] <== 238; - eq[56][i] = IsEqual(); - eq[56][i].in[0] <== in[i]; - eq[56][i].in[1] <== 239; + and[143][i].a <== states[i][44]; + and[143][i].b <== and[32][i].out; and[144][i] = AND(); - and[144][i].a <== states[i][32]; - multi_or[25][i] = MultiOR(14); - multi_or[25][i].in[0] <== eq[43][i].out; - multi_or[25][i].in[1] <== eq[44][i].out; - multi_or[25][i].in[2] <== eq[45][i].out; - multi_or[25][i].in[3] <== eq[46][i].out; - multi_or[25][i].in[4] <== eq[47][i].out; - multi_or[25][i].in[5] <== eq[48][i].out; - multi_or[25][i].in[6] <== eq[49][i].out; - multi_or[25][i].in[7] <== eq[50][i].out; - multi_or[25][i].in[8] <== eq[51][i].out; - multi_or[25][i].in[9] <== eq[52][i].out; - multi_or[25][i].in[10] <== eq[53][i].out; - multi_or[25][i].in[11] <== eq[54][i].out; - multi_or[25][i].in[12] <== eq[55][i].out; - multi_or[25][i].in[13] <== eq[56][i].out; - and[144][i].b <== multi_or[25][i].out; - lt[46][i] = LessEqThan(8); - lt[46][i].in[0] <== 144; - lt[46][i].in[1] <== in[i]; - lt[47][i] = LessEqThan(8); - lt[47][i].in[0] <== in[i]; - lt[47][i].in[1] <== 191; + and[144][i].a <== states[i][45]; + and[144][i].b <== and[14][i].out; and[145][i] = AND(); - and[145][i].a <== lt[46][i].out; - and[145][i].b <== lt[47][i].out; + and[145][i].a <== states[i][46]; + and[145][i].b <== and[35][i].out; + multi_or[29][i] = MultiOR(5); + multi_or[29][i].in[0] <== and[141][i].out; + multi_or[29][i].in[1] <== and[142][i].out; + multi_or[29][i].in[2] <== and[143][i].out; + multi_or[29][i].in[3] <== and[144][i].out; + multi_or[29][i].in[4] <== and[145][i].out; + states[i+1][43] <== multi_or[29][i].out; and[146][i] = AND(); - and[146][i].a <== states[i][39]; - and[146][i].b <== and[145][i].out; + and[146][i].a <== states[i][34]; + and[146][i].b <== eq[29][i].out; and[147][i] = AND(); - and[147][i].a <== states[i][40]; - and[147][i].b <== and[42][i].out; - eq[57][i] = IsEqual(); - eq[57][i].in[0] <== in[i]; - eq[57][i].in[1] <== 128; - eq[58][i] = IsEqual(); - eq[58][i].in[0] <== in[i]; - eq[58][i].in[1] <== 129; - eq[59][i] = IsEqual(); - eq[59][i].in[0] <== in[i]; - eq[59][i].in[1] <== 130; - eq[60][i] = IsEqual(); - eq[60][i].in[0] <== in[i]; - eq[60][i].in[1] <== 131; - eq[61][i] = IsEqual(); - eq[61][i].in[0] <== in[i]; - eq[61][i].in[1] <== 132; - eq[62][i] = IsEqual(); - eq[62][i].in[0] <== in[i]; - eq[62][i].in[1] <== 133; - eq[63][i] = IsEqual(); - eq[63][i].in[0] <== in[i]; - eq[63][i].in[1] <== 134; - eq[64][i] = IsEqual(); - eq[64][i].in[0] <== in[i]; - eq[64][i].in[1] <== 135; - eq[65][i] = IsEqual(); - eq[65][i].in[0] <== in[i]; - eq[65][i].in[1] <== 136; - eq[66][i] = IsEqual(); - eq[66][i].in[0] <== in[i]; - eq[66][i].in[1] <== 137; - eq[67][i] = IsEqual(); - eq[67][i].in[0] <== in[i]; - eq[67][i].in[1] <== 138; - eq[68][i] = IsEqual(); - eq[68][i].in[0] <== in[i]; - eq[68][i].in[1] <== 139; - eq[69][i] = IsEqual(); - eq[69][i].in[0] <== in[i]; - eq[69][i].in[1] <== 140; - eq[70][i] = IsEqual(); - eq[70][i].in[0] <== in[i]; - eq[70][i].in[1] <== 141; - eq[71][i] = IsEqual(); - eq[71][i].in[0] <== in[i]; - eq[71][i].in[1] <== 142; - eq[72][i] = IsEqual(); - eq[72][i].in[0] <== in[i]; - eq[72][i].in[1] <== 143; + and[147][i].a <== states[i][42]; + and[147][i].b <== eq[29][i].out; + multi_or[30][i] = MultiOR(2); + multi_or[30][i].in[0] <== and[146][i].out; + multi_or[30][i].in[1] <== and[147][i].out; + states[i+1][44] <== multi_or[30][i].out; and[148][i] = AND(); - and[148][i].a <== states[i][41]; - multi_or[26][i] = MultiOR(16); - multi_or[26][i].in[0] <== eq[57][i].out; - multi_or[26][i].in[1] <== eq[58][i].out; - multi_or[26][i].in[2] <== eq[59][i].out; - multi_or[26][i].in[3] <== eq[60][i].out; - multi_or[26][i].in[4] <== eq[61][i].out; - multi_or[26][i].in[5] <== eq[62][i].out; - multi_or[26][i].in[6] <== eq[63][i].out; - multi_or[26][i].in[7] <== eq[64][i].out; - multi_or[26][i].in[8] <== eq[65][i].out; - multi_or[26][i].in[9] <== eq[66][i].out; - multi_or[26][i].in[10] <== eq[67][i].out; - multi_or[26][i].in[11] <== eq[68][i].out; - multi_or[26][i].in[12] <== eq[69][i].out; - multi_or[26][i].in[13] <== eq[70][i].out; - multi_or[26][i].in[14] <== eq[71][i].out; - multi_or[26][i].in[15] <== eq[72][i].out; - and[148][i].b <== multi_or[26][i].out; + and[148][i].a <== states[i][34]; + and[148][i].b <== multi_or[10][i].out; and[149][i] = AND(); and[149][i].a <== states[i][42]; - and[149][i].b <== multi_or[25][i].out; + and[149][i].b <== multi_or[10][i].out; and[150][i] = AND(); - and[150][i].a <== states[i][44]; - and[150][i].b <== multi_or[25][i].out; + and[150][i].a <== states[i][47]; + and[150][i].b <== and[51][i].out; and[151][i] = AND(); - and[151][i].a <== states[i][45]; - and[151][i].b <== multi_or[25][i].out; + and[151][i].a <== states[i][48]; + and[151][i].b <== and[14][i].out; and[152][i] = AND(); - and[152][i].a <== states[i][46]; - and[152][i].b <== multi_or[25][i].out; + and[152][i].a <== states[i][49]; + and[152][i].b <== multi_or[11][i].out; + multi_or[31][i] = MultiOR(5); + multi_or[31][i].in[0] <== and[148][i].out; + multi_or[31][i].in[1] <== and[149][i].out; + multi_or[31][i].in[2] <== and[150][i].out; + multi_or[31][i].in[3] <== and[151][i].out; + multi_or[31][i].in[4] <== and[152][i].out; + states[i+1][45] <== multi_or[31][i].out; and[153][i] = AND(); - and[153][i].a <== states[i][47]; - and[153][i].b <== multi_or[25][i].out; + and[153][i].a <== states[i][34]; + and[153][i].b <== eq[60][i].out; and[154][i] = AND(); - and[154][i].a <== states[i][48]; - and[154][i].b <== multi_or[25][i].out; + and[154][i].a <== states[i][42]; + and[154][i].b <== eq[60][i].out; + multi_or[32][i] = MultiOR(2); + multi_or[32][i].in[0] <== and[153][i].out; + multi_or[32][i].in[1] <== and[154][i].out; + states[i+1][46] <== multi_or[32][i].out; and[155][i] = AND(); - and[155][i].a <== states[i][49]; - and[155][i].b <== multi_or[25][i].out; + and[155][i].a <== states[i][34]; + and[155][i].b <== eq[61][i].out; and[156][i] = AND(); - and[156][i].a <== states[i][50]; - and[156][i].b <== multi_or[25][i].out; + and[156][i].a <== states[i][42]; + and[156][i].b <== eq[61][i].out; + multi_or[33][i] = MultiOR(2); + multi_or[33][i].in[0] <== and[155][i].out; + multi_or[33][i].in[1] <== and[156][i].out; + states[i+1][47] <== multi_or[33][i].out; and[157][i] = AND(); - and[157][i].a <== states[i][51]; - and[157][i].b <== multi_or[25][i].out; + and[157][i].a <== states[i][34]; + and[157][i].b <== multi_or[15][i].out; and[158][i] = AND(); - and[158][i].a <== states[i][52]; - and[158][i].b <== multi_or[25][i].out; + and[158][i].a <== states[i][42]; + and[158][i].b <== multi_or[15][i].out; + multi_or[34][i] = MultiOR(2); + multi_or[34][i].in[0] <== and[157][i].out; + multi_or[34][i].in[1] <== and[158][i].out; + states[i+1][48] <== multi_or[34][i].out; and[159][i] = AND(); - and[159][i].a <== states[i][53]; - and[159][i].b <== multi_or[25][i].out; + and[159][i].a <== states[i][34]; + and[159][i].b <== eq[65][i].out; and[160][i] = AND(); - and[160][i].a <== states[i][54]; - and[160][i].b <== multi_or[25][i].out; + and[160][i].a <== states[i][42]; + and[160][i].b <== eq[65][i].out; + multi_or[35][i] = MultiOR(2); + multi_or[35][i].in[0] <== and[159][i].out; + multi_or[35][i].in[1] <== and[160][i].out; + states[i+1][49] <== multi_or[35][i].out; and[161][i] = AND(); - and[161][i].a <== states[i][55]; - and[161][i].b <== multi_or[25][i].out; + and[161][i].a <== states[i][42]; + and[161][i].b <== eq[0][i].out; + states[i+1][50] <== and[161][i].out; + eq[81][i] = IsEqual(); + eq[81][i].in[0] <== in[i]; + eq[81][i].in[1] <== 47; and[162][i] = AND(); - and[162][i].a <== states[i][56]; - and[162][i].b <== multi_or[25][i].out; + and[162][i].a <== states[i][50]; + and[162][i].b <== eq[81][i].out; + states[i+1][51] <== and[162][i].out; and[163][i] = AND(); - and[163][i].a <== states[i][57]; - and[163][i].b <== multi_or[25][i].out; + and[163][i].a <== states[i][51]; + and[163][i].b <== eq[1][i].out; + states[i+1][52] <== and[163][i].out; and[164][i] = AND(); - and[164][i].a <== states[i][58]; - and[164][i].b <== multi_or[25][i].out; + and[164][i].a <== states[i][52]; + and[164][i].b <== eq[2][i].out; + states[i+1][53] <== and[164][i].out; and[165][i] = AND(); - and[165][i].a <== states[i][59]; - and[165][i].b <== multi_or[25][i].out; + and[165][i].a <== states[i][53]; + and[165][i].b <== eq[3][i].out; + states[i+1][54] <== and[165][i].out; and[166][i] = AND(); - and[166][i].a <== states[i][60]; - and[166][i].b <== multi_or[25][i].out; - and[167][i] = AND(); - and[167][i].a <== states[i][61]; - and[167][i].b <== multi_or[25][i].out; - and[168][i] = AND(); - and[168][i].a <== states[i][62]; - and[168][i].b <== multi_or[25][i].out; - and[169][i] = AND(); - and[169][i].a <== states[i][63]; - and[169][i].b <== multi_or[25][i].out; - and[170][i] = AND(); - and[170][i].a <== states[i][65]; - and[170][i].b <== multi_or[25][i].out; - and[171][i] = AND(); - and[171][i].a <== states[i][66]; - and[171][i].b <== multi_or[25][i].out; - and[172][i] = AND(); - and[172][i].a <== states[i][75]; - and[172][i].b <== multi_or[25][i].out; - multi_or[27][i] = MultiOR(28); - multi_or[27][i].in[0] <== and[144][i].out; - multi_or[27][i].in[1] <== and[146][i].out; - multi_or[27][i].in[2] <== and[147][i].out; - multi_or[27][i].in[3] <== and[148][i].out; - multi_or[27][i].in[4] <== and[149][i].out; - multi_or[27][i].in[5] <== and[150][i].out; - multi_or[27][i].in[6] <== and[151][i].out; - multi_or[27][i].in[7] <== and[152][i].out; - multi_or[27][i].in[8] <== and[153][i].out; - multi_or[27][i].in[9] <== and[154][i].out; - multi_or[27][i].in[10] <== and[155][i].out; - multi_or[27][i].in[11] <== and[156][i].out; - multi_or[27][i].in[12] <== and[157][i].out; - multi_or[27][i].in[13] <== and[158][i].out; - multi_or[27][i].in[14] <== and[159][i].out; - multi_or[27][i].in[15] <== and[160][i].out; - multi_or[27][i].in[16] <== and[161][i].out; - multi_or[27][i].in[17] <== and[162][i].out; - multi_or[27][i].in[18] <== and[163][i].out; - multi_or[27][i].in[19] <== and[164][i].out; - multi_or[27][i].in[20] <== and[165][i].out; - multi_or[27][i].in[21] <== and[166][i].out; - multi_or[27][i].in[22] <== and[167][i].out; - multi_or[27][i].in[23] <== and[168][i].out; - multi_or[27][i].in[24] <== and[169][i].out; - multi_or[27][i].in[25] <== and[170][i].out; - multi_or[27][i].in[26] <== and[171][i].out; - multi_or[27][i].in[27] <== and[172][i].out; - states[i+1][37] <== multi_or[27][i].out; - eq[73][i] = IsEqual(); - eq[73][i].in[0] <== in[i]; - eq[73][i].in[1] <== 237; - and[173][i] = AND(); - and[173][i].a <== states[i][32]; - and[173][i].b <== eq[73][i].out; - and[174][i] = AND(); - and[174][i].a <== states[i][42]; - and[174][i].b <== eq[73][i].out; - and[175][i] = AND(); - and[175][i].a <== states[i][44]; - and[175][i].b <== eq[73][i].out; - and[176][i] = AND(); - and[176][i].a <== states[i][45]; - and[176][i].b <== eq[73][i].out; - and[177][i] = AND(); - and[177][i].a <== states[i][46]; - and[177][i].b <== eq[73][i].out; - and[178][i] = AND(); - and[178][i].a <== states[i][47]; - and[178][i].b <== eq[73][i].out; - and[179][i] = AND(); - and[179][i].a <== states[i][48]; - and[179][i].b <== eq[73][i].out; - and[180][i] = AND(); - and[180][i].a <== states[i][49]; - and[180][i].b <== eq[73][i].out; - and[181][i] = AND(); - and[181][i].a <== states[i][50]; - and[181][i].b <== eq[73][i].out; - and[182][i] = AND(); - and[182][i].a <== states[i][51]; - and[182][i].b <== eq[73][i].out; - and[183][i] = AND(); - and[183][i].a <== states[i][52]; - and[183][i].b <== eq[73][i].out; - and[184][i] = AND(); - and[184][i].a <== states[i][53]; - and[184][i].b <== eq[73][i].out; - and[185][i] = AND(); - and[185][i].a <== states[i][54]; - and[185][i].b <== eq[73][i].out; - and[186][i] = AND(); - and[186][i].a <== states[i][55]; - and[186][i].b <== eq[73][i].out; - and[187][i] = AND(); - and[187][i].a <== states[i][56]; - and[187][i].b <== eq[73][i].out; - and[188][i] = AND(); - and[188][i].a <== states[i][57]; - and[188][i].b <== eq[73][i].out; - and[189][i] = AND(); - and[189][i].a <== states[i][58]; - and[189][i].b <== eq[73][i].out; - and[190][i] = AND(); - and[190][i].a <== states[i][59]; - and[190][i].b <== eq[73][i].out; - and[191][i] = AND(); - and[191][i].a <== states[i][60]; - and[191][i].b <== eq[73][i].out; - and[192][i] = AND(); - and[192][i].a <== states[i][61]; - and[192][i].b <== eq[73][i].out; - and[193][i] = AND(); - and[193][i].a <== states[i][62]; - and[193][i].b <== eq[73][i].out; - and[194][i] = AND(); - and[194][i].a <== states[i][63]; - and[194][i].b <== eq[73][i].out; - and[195][i] = AND(); - and[195][i].a <== states[i][65]; - and[195][i].b <== eq[73][i].out; - and[196][i] = AND(); - and[196][i].a <== states[i][66]; - and[196][i].b <== eq[73][i].out; - and[197][i] = AND(); - and[197][i].a <== states[i][75]; - and[197][i].b <== eq[73][i].out; - multi_or[28][i] = MultiOR(25); - multi_or[28][i].in[0] <== and[173][i].out; - multi_or[28][i].in[1] <== and[174][i].out; - multi_or[28][i].in[2] <== and[175][i].out; - multi_or[28][i].in[3] <== and[176][i].out; - multi_or[28][i].in[4] <== and[177][i].out; - multi_or[28][i].in[5] <== and[178][i].out; - multi_or[28][i].in[6] <== and[179][i].out; - multi_or[28][i].in[7] <== and[180][i].out; - multi_or[28][i].in[8] <== and[181][i].out; - multi_or[28][i].in[9] <== and[182][i].out; - multi_or[28][i].in[10] <== and[183][i].out; - multi_or[28][i].in[11] <== and[184][i].out; - multi_or[28][i].in[12] <== and[185][i].out; - multi_or[28][i].in[13] <== and[186][i].out; - multi_or[28][i].in[14] <== and[187][i].out; - multi_or[28][i].in[15] <== and[188][i].out; - multi_or[28][i].in[16] <== and[189][i].out; - multi_or[28][i].in[17] <== and[190][i].out; - multi_or[28][i].in[18] <== and[191][i].out; - multi_or[28][i].in[19] <== and[192][i].out; - multi_or[28][i].in[20] <== and[193][i].out; - multi_or[28][i].in[21] <== and[194][i].out; - multi_or[28][i].in[22] <== and[195][i].out; - multi_or[28][i].in[23] <== and[196][i].out; - multi_or[28][i].in[24] <== and[197][i].out; - states[i+1][38] <== multi_or[28][i].out; - eq[74][i] = IsEqual(); - eq[74][i].in[0] <== in[i]; - eq[74][i].in[1] <== 240; - and[198][i] = AND(); - and[198][i].a <== states[i][32]; - and[198][i].b <== eq[74][i].out; - and[199][i] = AND(); - and[199][i].a <== states[i][42]; - and[199][i].b <== eq[74][i].out; - and[200][i] = AND(); - and[200][i].a <== states[i][44]; - and[200][i].b <== eq[74][i].out; - and[201][i] = AND(); - and[201][i].a <== states[i][45]; - and[201][i].b <== eq[74][i].out; - and[202][i] = AND(); - and[202][i].a <== states[i][46]; - and[202][i].b <== eq[74][i].out; - and[203][i] = AND(); - and[203][i].a <== states[i][47]; - and[203][i].b <== eq[74][i].out; - and[204][i] = AND(); - and[204][i].a <== states[i][48]; - and[204][i].b <== eq[74][i].out; - and[205][i] = AND(); - and[205][i].a <== states[i][49]; - and[205][i].b <== eq[74][i].out; - and[206][i] = AND(); - and[206][i].a <== states[i][50]; - and[206][i].b <== eq[74][i].out; - and[207][i] = AND(); - and[207][i].a <== states[i][51]; - and[207][i].b <== eq[74][i].out; - and[208][i] = AND(); - and[208][i].a <== states[i][52]; - and[208][i].b <== eq[74][i].out; - and[209][i] = AND(); - and[209][i].a <== states[i][53]; - and[209][i].b <== eq[74][i].out; - and[210][i] = AND(); - and[210][i].a <== states[i][54]; - and[210][i].b <== eq[74][i].out; - and[211][i] = AND(); - and[211][i].a <== states[i][55]; - and[211][i].b <== eq[74][i].out; - and[212][i] = AND(); - and[212][i].a <== states[i][56]; - and[212][i].b <== eq[74][i].out; - and[213][i] = AND(); - and[213][i].a <== states[i][57]; - and[213][i].b <== eq[74][i].out; - and[214][i] = AND(); - and[214][i].a <== states[i][58]; - and[214][i].b <== eq[74][i].out; - and[215][i] = AND(); - and[215][i].a <== states[i][59]; - and[215][i].b <== eq[74][i].out; - and[216][i] = AND(); - and[216][i].a <== states[i][60]; - and[216][i].b <== eq[74][i].out; - and[217][i] = AND(); - and[217][i].a <== states[i][61]; - and[217][i].b <== eq[74][i].out; - and[218][i] = AND(); - and[218][i].a <== states[i][62]; - and[218][i].b <== eq[74][i].out; - and[219][i] = AND(); - and[219][i].a <== states[i][63]; - and[219][i].b <== eq[74][i].out; - and[220][i] = AND(); - and[220][i].a <== states[i][65]; - and[220][i].b <== eq[74][i].out; - and[221][i] = AND(); - and[221][i].a <== states[i][66]; - and[221][i].b <== eq[74][i].out; - and[222][i] = AND(); - and[222][i].a <== states[i][75]; - and[222][i].b <== eq[74][i].out; - multi_or[29][i] = MultiOR(25); - multi_or[29][i].in[0] <== and[198][i].out; - multi_or[29][i].in[1] <== and[199][i].out; - multi_or[29][i].in[2] <== and[200][i].out; - multi_or[29][i].in[3] <== and[201][i].out; - multi_or[29][i].in[4] <== and[202][i].out; - multi_or[29][i].in[5] <== and[203][i].out; - multi_or[29][i].in[6] <== and[204][i].out; - multi_or[29][i].in[7] <== and[205][i].out; - multi_or[29][i].in[8] <== and[206][i].out; - multi_or[29][i].in[9] <== and[207][i].out; - multi_or[29][i].in[10] <== and[208][i].out; - multi_or[29][i].in[11] <== and[209][i].out; - multi_or[29][i].in[12] <== and[210][i].out; - multi_or[29][i].in[13] <== and[211][i].out; - multi_or[29][i].in[14] <== and[212][i].out; - multi_or[29][i].in[15] <== and[213][i].out; - multi_or[29][i].in[16] <== and[214][i].out; - multi_or[29][i].in[17] <== and[215][i].out; - multi_or[29][i].in[18] <== and[216][i].out; - multi_or[29][i].in[19] <== and[217][i].out; - multi_or[29][i].in[20] <== and[218][i].out; - multi_or[29][i].in[21] <== and[219][i].out; - multi_or[29][i].in[22] <== and[220][i].out; - multi_or[29][i].in[23] <== and[221][i].out; - multi_or[29][i].in[24] <== and[222][i].out; - states[i+1][39] <== multi_or[29][i].out; - eq[75][i] = IsEqual(); - eq[75][i].in[0] <== in[i]; - eq[75][i].in[1] <== 241; - eq[76][i] = IsEqual(); - eq[76][i].in[0] <== in[i]; - eq[76][i].in[1] <== 242; - eq[77][i] = IsEqual(); - eq[77][i].in[0] <== in[i]; - eq[77][i].in[1] <== 243; - and[223][i] = AND(); - and[223][i].a <== states[i][32]; - multi_or[30][i] = MultiOR(3); - multi_or[30][i].in[0] <== eq[75][i].out; - multi_or[30][i].in[1] <== eq[76][i].out; - multi_or[30][i].in[2] <== eq[77][i].out; - and[223][i].b <== multi_or[30][i].out; - and[224][i] = AND(); - and[224][i].a <== states[i][42]; - and[224][i].b <== multi_or[30][i].out; - and[225][i] = AND(); - and[225][i].a <== states[i][44]; - and[225][i].b <== multi_or[30][i].out; - and[226][i] = AND(); - and[226][i].a <== states[i][45]; - and[226][i].b <== multi_or[30][i].out; - and[227][i] = AND(); - and[227][i].a <== states[i][46]; - and[227][i].b <== multi_or[30][i].out; - and[228][i] = AND(); - and[228][i].a <== states[i][47]; - and[228][i].b <== multi_or[30][i].out; - and[229][i] = AND(); - and[229][i].a <== states[i][48]; - and[229][i].b <== multi_or[30][i].out; - and[230][i] = AND(); - and[230][i].a <== states[i][49]; - and[230][i].b <== multi_or[30][i].out; - and[231][i] = AND(); - and[231][i].a <== states[i][50]; - and[231][i].b <== multi_or[30][i].out; - and[232][i] = AND(); - and[232][i].a <== states[i][51]; - and[232][i].b <== multi_or[30][i].out; - and[233][i] = AND(); - and[233][i].a <== states[i][52]; - and[233][i].b <== multi_or[30][i].out; - and[234][i] = AND(); - and[234][i].a <== states[i][53]; - and[234][i].b <== multi_or[30][i].out; - and[235][i] = AND(); - and[235][i].a <== states[i][54]; - and[235][i].b <== multi_or[30][i].out; - and[236][i] = AND(); - and[236][i].a <== states[i][55]; - and[236][i].b <== multi_or[30][i].out; - and[237][i] = AND(); - and[237][i].a <== states[i][56]; - and[237][i].b <== multi_or[30][i].out; - and[238][i] = AND(); - and[238][i].a <== states[i][57]; - and[238][i].b <== multi_or[30][i].out; - and[239][i] = AND(); - and[239][i].a <== states[i][58]; - and[239][i].b <== multi_or[30][i].out; - and[240][i] = AND(); - and[240][i].a <== states[i][59]; - and[240][i].b <== multi_or[30][i].out; - and[241][i] = AND(); - and[241][i].a <== states[i][60]; - and[241][i].b <== multi_or[30][i].out; - and[242][i] = AND(); - and[242][i].a <== states[i][61]; - and[242][i].b <== multi_or[30][i].out; - and[243][i] = AND(); - and[243][i].a <== states[i][62]; - and[243][i].b <== multi_or[30][i].out; - and[244][i] = AND(); - and[244][i].a <== states[i][63]; - and[244][i].b <== multi_or[30][i].out; - and[245][i] = AND(); - and[245][i].a <== states[i][65]; - and[245][i].b <== multi_or[30][i].out; - and[246][i] = AND(); - and[246][i].a <== states[i][66]; - and[246][i].b <== multi_or[30][i].out; - and[247][i] = AND(); - and[247][i].a <== states[i][75]; - and[247][i].b <== multi_or[30][i].out; - multi_or[31][i] = MultiOR(25); - multi_or[31][i].in[0] <== and[223][i].out; - multi_or[31][i].in[1] <== and[224][i].out; - multi_or[31][i].in[2] <== and[225][i].out; - multi_or[31][i].in[3] <== and[226][i].out; - multi_or[31][i].in[4] <== and[227][i].out; - multi_or[31][i].in[5] <== and[228][i].out; - multi_or[31][i].in[6] <== and[229][i].out; - multi_or[31][i].in[7] <== and[230][i].out; - multi_or[31][i].in[8] <== and[231][i].out; - multi_or[31][i].in[9] <== and[232][i].out; - multi_or[31][i].in[10] <== and[233][i].out; - multi_or[31][i].in[11] <== and[234][i].out; - multi_or[31][i].in[12] <== and[235][i].out; - multi_or[31][i].in[13] <== and[236][i].out; - multi_or[31][i].in[14] <== and[237][i].out; - multi_or[31][i].in[15] <== and[238][i].out; - multi_or[31][i].in[16] <== and[239][i].out; - multi_or[31][i].in[17] <== and[240][i].out; - multi_or[31][i].in[18] <== and[241][i].out; - multi_or[31][i].in[19] <== and[242][i].out; - multi_or[31][i].in[20] <== and[243][i].out; - multi_or[31][i].in[21] <== and[244][i].out; - multi_or[31][i].in[22] <== and[245][i].out; - multi_or[31][i].in[23] <== and[246][i].out; - multi_or[31][i].in[24] <== and[247][i].out; - states[i+1][40] <== multi_or[31][i].out; - eq[78][i] = IsEqual(); - eq[78][i].in[0] <== in[i]; - eq[78][i].in[1] <== 244; - and[248][i] = AND(); - and[248][i].a <== states[i][32]; - and[248][i].b <== eq[78][i].out; - and[249][i] = AND(); - and[249][i].a <== states[i][42]; - and[249][i].b <== eq[78][i].out; - and[250][i] = AND(); - and[250][i].a <== states[i][44]; - and[250][i].b <== eq[78][i].out; - and[251][i] = AND(); - and[251][i].a <== states[i][45]; - and[251][i].b <== eq[78][i].out; - and[252][i] = AND(); - and[252][i].a <== states[i][46]; - and[252][i].b <== eq[78][i].out; - and[253][i] = AND(); - and[253][i].a <== states[i][47]; - and[253][i].b <== eq[78][i].out; - and[254][i] = AND(); - and[254][i].a <== states[i][48]; - and[254][i].b <== eq[78][i].out; - and[255][i] = AND(); - and[255][i].a <== states[i][49]; - and[255][i].b <== eq[78][i].out; - and[256][i] = AND(); - and[256][i].a <== states[i][50]; - and[256][i].b <== eq[78][i].out; - and[257][i] = AND(); - and[257][i].a <== states[i][51]; - and[257][i].b <== eq[78][i].out; - and[258][i] = AND(); - and[258][i].a <== states[i][52]; - and[258][i].b <== eq[78][i].out; - and[259][i] = AND(); - and[259][i].a <== states[i][53]; - and[259][i].b <== eq[78][i].out; - and[260][i] = AND(); - and[260][i].a <== states[i][54]; - and[260][i].b <== eq[78][i].out; - and[261][i] = AND(); - and[261][i].a <== states[i][55]; - and[261][i].b <== eq[78][i].out; - and[262][i] = AND(); - and[262][i].a <== states[i][56]; - and[262][i].b <== eq[78][i].out; - and[263][i] = AND(); - and[263][i].a <== states[i][57]; - and[263][i].b <== eq[78][i].out; - and[264][i] = AND(); - and[264][i].a <== states[i][58]; - and[264][i].b <== eq[78][i].out; - and[265][i] = AND(); - and[265][i].a <== states[i][59]; - and[265][i].b <== eq[78][i].out; - and[266][i] = AND(); - and[266][i].a <== states[i][60]; - and[266][i].b <== eq[78][i].out; - and[267][i] = AND(); - and[267][i].a <== states[i][61]; - and[267][i].b <== eq[78][i].out; - and[268][i] = AND(); - and[268][i].a <== states[i][62]; - and[268][i].b <== eq[78][i].out; - and[269][i] = AND(); - and[269][i].a <== states[i][63]; - and[269][i].b <== eq[78][i].out; - and[270][i] = AND(); - and[270][i].a <== states[i][65]; - and[270][i].b <== eq[78][i].out; - and[271][i] = AND(); - and[271][i].a <== states[i][66]; - and[271][i].b <== eq[78][i].out; - and[272][i] = AND(); - and[272][i].a <== states[i][75]; - and[272][i].b <== eq[78][i].out; - multi_or[32][i] = MultiOR(25); - multi_or[32][i].in[0] <== and[248][i].out; - multi_or[32][i].in[1] <== and[249][i].out; - multi_or[32][i].in[2] <== and[250][i].out; - multi_or[32][i].in[3] <== and[251][i].out; - multi_or[32][i].in[4] <== and[252][i].out; - multi_or[32][i].in[5] <== and[253][i].out; - multi_or[32][i].in[6] <== and[254][i].out; - multi_or[32][i].in[7] <== and[255][i].out; - multi_or[32][i].in[8] <== and[256][i].out; - multi_or[32][i].in[9] <== and[257][i].out; - multi_or[32][i].in[10] <== and[258][i].out; - multi_or[32][i].in[11] <== and[259][i].out; - multi_or[32][i].in[12] <== and[260][i].out; - multi_or[32][i].in[13] <== and[261][i].out; - multi_or[32][i].in[14] <== and[262][i].out; - multi_or[32][i].in[15] <== and[263][i].out; - multi_or[32][i].in[16] <== and[264][i].out; - multi_or[32][i].in[17] <== and[265][i].out; - multi_or[32][i].in[18] <== and[266][i].out; - multi_or[32][i].in[19] <== and[267][i].out; - multi_or[32][i].in[20] <== and[268][i].out; - multi_or[32][i].in[21] <== and[269][i].out; - multi_or[32][i].in[22] <== and[270][i].out; - multi_or[32][i].in[23] <== and[271][i].out; - multi_or[32][i].in[24] <== and[272][i].out; - states[i+1][41] <== multi_or[32][i].out; - eq[79][i] = IsEqual(); - eq[79][i].in[0] <== in[i]; - eq[79][i].in[1] <== 122; - and[273][i] = AND(); - and[273][i].a <== states[i][32]; - and[273][i].b <== eq[79][i].out; - and[274][i] = AND(); - and[274][i].a <== states[i][42]; - and[274][i].b <== eq[79][i].out; - and[275][i] = AND(); - and[275][i].a <== states[i][44]; - and[275][i].b <== eq[79][i].out; - and[276][i] = AND(); - and[276][i].a <== states[i][45]; - and[276][i].b <== eq[79][i].out; - and[277][i] = AND(); - and[277][i].a <== states[i][46]; - and[277][i].b <== eq[79][i].out; - and[278][i] = AND(); - and[278][i].a <== states[i][47]; - and[278][i].b <== eq[79][i].out; - and[279][i] = AND(); - and[279][i].a <== states[i][48]; - and[279][i].b <== eq[79][i].out; - and[280][i] = AND(); - and[280][i].a <== states[i][49]; - and[280][i].b <== eq[79][i].out; - and[281][i] = AND(); - and[281][i].a <== states[i][50]; - and[281][i].b <== eq[79][i].out; - and[282][i] = AND(); - and[282][i].a <== states[i][51]; - and[282][i].b <== eq[79][i].out; - and[283][i] = AND(); - and[283][i].a <== states[i][52]; - and[283][i].b <== eq[79][i].out; - and[284][i] = AND(); - and[284][i].a <== states[i][53]; - and[284][i].b <== eq[79][i].out; - and[285][i] = AND(); - and[285][i].a <== states[i][54]; - and[285][i].b <== eq[79][i].out; - and[286][i] = AND(); - and[286][i].a <== states[i][55]; - and[286][i].b <== eq[79][i].out; - and[287][i] = AND(); - and[287][i].a <== states[i][56]; - and[287][i].b <== eq[79][i].out; - and[288][i] = AND(); - and[288][i].a <== states[i][57]; - and[288][i].b <== eq[79][i].out; - and[289][i] = AND(); - and[289][i].a <== states[i][58]; - and[289][i].b <== eq[79][i].out; - and[290][i] = AND(); - and[290][i].a <== states[i][59]; - and[290][i].b <== eq[79][i].out; - and[291][i] = AND(); - and[291][i].a <== states[i][60]; - and[291][i].b <== eq[79][i].out; - and[292][i] = AND(); - and[292][i].a <== states[i][61]; - and[292][i].b <== eq[79][i].out; - and[293][i] = AND(); - and[293][i].a <== states[i][62]; - and[293][i].b <== eq[79][i].out; - and[294][i] = AND(); - and[294][i].a <== states[i][63]; - and[294][i].b <== eq[79][i].out; - and[295][i] = AND(); - and[295][i].a <== states[i][65]; - and[295][i].b <== eq[79][i].out; - and[296][i] = AND(); - and[296][i].a <== states[i][66]; - and[296][i].b <== eq[79][i].out; - and[297][i] = AND(); - and[297][i].a <== states[i][75]; - and[297][i].b <== eq[79][i].out; - multi_or[33][i] = MultiOR(25); - multi_or[33][i].in[0] <== and[273][i].out; - multi_or[33][i].in[1] <== and[274][i].out; - multi_or[33][i].in[2] <== and[275][i].out; - multi_or[33][i].in[3] <== and[276][i].out; - multi_or[33][i].in[4] <== and[277][i].out; - multi_or[33][i].in[5] <== and[278][i].out; - multi_or[33][i].in[6] <== and[279][i].out; - multi_or[33][i].in[7] <== and[280][i].out; - multi_or[33][i].in[8] <== and[281][i].out; - multi_or[33][i].in[9] <== and[282][i].out; - multi_or[33][i].in[10] <== and[283][i].out; - multi_or[33][i].in[11] <== and[284][i].out; - multi_or[33][i].in[12] <== and[285][i].out; - multi_or[33][i].in[13] <== and[286][i].out; - multi_or[33][i].in[14] <== and[287][i].out; - multi_or[33][i].in[15] <== and[288][i].out; - multi_or[33][i].in[16] <== and[289][i].out; - multi_or[33][i].in[17] <== and[290][i].out; - multi_or[33][i].in[18] <== and[291][i].out; - multi_or[33][i].in[19] <== and[292][i].out; - multi_or[33][i].in[20] <== and[293][i].out; - multi_or[33][i].in[21] <== and[294][i].out; - multi_or[33][i].in[22] <== and[295][i].out; - multi_or[33][i].in[23] <== and[296][i].out; - multi_or[33][i].in[24] <== and[297][i].out; - states[i+1][42] <== multi_or[33][i].out; - and[298][i] = AND(); - and[298][i].a <== states[i][34]; - and[298][i].b <== eq[5][i].out; - states[i+1][43] <== and[298][i].out; - and[299][i] = AND(); - and[299][i].a <== states[i][42]; - and[299][i].b <== eq[1][i].out; - states[i+1][44] <== and[299][i].out; - and[300][i] = AND(); - and[300][i].a <== states[i][42]; - and[300][i].b <== eq[41][i].out; - and[301][i] = AND(); - and[301][i].a <== states[i][49]; - and[301][i].b <== eq[41][i].out; - multi_or[34][i] = MultiOR(2); - multi_or[34][i].in[0] <== and[300][i].out; - multi_or[34][i].in[1] <== and[301][i].out; - states[i+1][45] <== multi_or[34][i].out; - and[302][i] = AND(); - and[302][i].a <== states[i][44]; - and[302][i].b <== eq[3][i].out; - states[i+1][46] <== and[302][i].out; - and[303][i] = AND(); - and[303][i].a <== states[i][45]; - and[303][i].b <== eq[1][i].out; - states[i+1][47] <== and[303][i].out; - eq[80][i] = IsEqual(); - eq[80][i].in[0] <== in[i]; - eq[80][i].in[1] <== 101; - and[304][i] = AND(); - and[304][i].a <== states[i][45]; - and[304][i].b <== eq[80][i].out; - and[305][i] = AND(); - and[305][i].a <== states[i][53]; - and[305][i].b <== eq[80][i].out; - multi_or[35][i] = MultiOR(2); - multi_or[35][i].in[0] <== and[304][i].out; - multi_or[35][i].in[1] <== and[305][i].out; - states[i+1][48] <== multi_or[35][i].out; - and[306][i] = AND(); - and[306][i].a <== states[i][46]; - and[306][i].b <== eq[5][i].out; - states[i+1][49] <== and[306][i].out; - and[307][i] = AND(); - and[307][i].a <== states[i][47]; - and[307][i].b <== eq[3][i].out; - states[i+1][50] <== and[307][i].out; - and[308][i] = AND(); - and[308][i].a <== states[i][48]; - and[308][i].b <== eq[1][i].out; - states[i+1][51] <== and[308][i].out; - and[309][i] = AND(); - and[309][i].a <== states[i][48]; - and[309][i].b <== eq[17][i].out; - and[310][i] = AND(); - and[310][i].a <== states[i][57]; - and[310][i].b <== eq[17][i].out; - multi_or[36][i] = MultiOR(2); - multi_or[36][i].in[0] <== and[309][i].out; - multi_or[36][i].in[1] <== and[310][i].out; - states[i+1][52] <== multi_or[36][i].out; - and[311][i] = AND(); - and[311][i].a <== states[i][50]; - and[311][i].b <== eq[5][i].out; - states[i+1][53] <== and[311][i].out; - and[312][i] = AND(); - and[312][i].a <== states[i][51]; - and[312][i].b <== eq[3][i].out; - states[i+1][54] <== and[312][i].out; - and[313][i] = AND(); - and[313][i].a <== states[i][52]; - and[313][i].b <== eq[1][i].out; - states[i+1][55] <== and[313][i].out; - eq[81][i] = IsEqual(); - eq[81][i].in[0] <== in[i]; - eq[81][i].in[1] <== 97; - and[314][i] = AND(); - and[314][i].a <== states[i][52]; - and[314][i].b <== eq[81][i].out; - and[315][i] = AND(); - and[315][i].a <== states[i][61]; - and[315][i].b <== eq[81][i].out; - multi_or[37][i] = MultiOR(2); - multi_or[37][i].in[0] <== and[314][i].out; - multi_or[37][i].in[1] <== and[315][i].out; - states[i+1][56] <== multi_or[37][i].out; - and[316][i] = AND(); - and[316][i].a <== states[i][54]; - and[316][i].b <== eq[5][i].out; - states[i+1][57] <== and[316][i].out; - and[317][i] = AND(); - and[317][i].a <== states[i][55]; - and[317][i].b <== eq[3][i].out; - states[i+1][58] <== and[317][i].out; - and[318][i] = AND(); - and[318][i].a <== states[i][56]; - and[318][i].b <== eq[1][i].out; - states[i+1][59] <== and[318][i].out; - and[319][i] = AND(); - and[319][i].a <== states[i][56]; - and[319][i].b <== eq[4][i].out; - and[320][i] = AND(); - and[320][i].a <== states[i][65]; - and[320][i].b <== eq[4][i].out; - multi_or[38][i] = MultiOR(2); - multi_or[38][i].in[0] <== and[319][i].out; - multi_or[38][i].in[1] <== and[320][i].out; - states[i+1][60] <== multi_or[38][i].out; - and[321][i] = AND(); - and[321][i].a <== states[i][58]; - and[321][i].b <== eq[5][i].out; - states[i+1][61] <== and[321][i].out; - and[322][i] = AND(); - and[322][i].a <== states[i][59]; - and[322][i].b <== eq[3][i].out; - states[i+1][62] <== and[322][i].out; - and[323][i] = AND(); - and[323][i].a <== states[i][60]; - and[323][i].b <== eq[1][i].out; - states[i+1][63] <== and[323][i].out; - and[324][i] = AND(); - and[324][i].a <== states[i][60]; - and[324][i].b <== eq[16][i].out; - lt[48][i] = LessEqThan(8); - lt[48][i].in[0] <== 35; - lt[48][i].in[1] <== in[i]; - lt[49][i] = LessEqThan(8); - lt[49][i].in[0] <== in[i]; - lt[49][i].in[1] <== 127; - and[325][i] = AND(); - and[325][i].a <== lt[48][i].out; - and[325][i].b <== lt[49][i].out; - and[326][i] = AND(); - and[326][i].a <== states[i][64]; - multi_or[39][i] = MultiOR(2); - multi_or[39][i].in[0] <== and[39][i].out; - multi_or[39][i].in[1] <== and[325][i].out; - and[326][i].b <== multi_or[39][i].out; - and[327][i] = AND(); - and[327][i].a <== states[i][68]; - and[327][i].b <== and[42][i].out; - and[328][i] = AND(); - and[328][i].a <== states[i][75]; - and[328][i].b <== eq[16][i].out; - multi_or[40][i] = MultiOR(4); - multi_or[40][i].in[0] <== and[324][i].out; - multi_or[40][i].in[1] <== and[326][i].out; - multi_or[40][i].in[2] <== and[327][i].out; - multi_or[40][i].in[3] <== and[328][i].out; - states[i+1][64] <== multi_or[40][i].out; - and[329][i] = AND(); - and[329][i].a <== states[i][62]; - and[329][i].b <== eq[5][i].out; - states[i+1][65] <== and[329][i].out; - and[330][i] = AND(); - and[330][i].a <== states[i][63]; - and[330][i].b <== eq[3][i].out; - states[i+1][66] <== and[330][i].out; - and[331][i] = AND(); - and[331][i].a <== states[i][64]; - and[331][i].b <== eq[10][i].out; - lt[50][i] = LessEqThan(8); - lt[50][i].in[0] <== 1; - lt[50][i].in[1] <== in[i]; - lt[51][i] = LessEqThan(8); - lt[51][i].in[0] <== in[i]; - lt[51][i].in[1] <== 61; - and[332][i] = AND(); - and[332][i].a <== lt[50][i].out; - and[332][i].b <== lt[51][i].out; - lt[52][i] = LessEqThan(8); - lt[52][i].in[0] <== 63; - lt[52][i].in[1] <== in[i]; - lt[53][i] = LessEqThan(8); - lt[53][i].in[0] <== in[i]; - lt[53][i].in[1] <== 127; - and[333][i] = AND(); - and[333][i].a <== lt[52][i].out; - and[333][i].b <== lt[53][i].out; - and[334][i] = AND(); - and[334][i].a <== states[i][67]; - multi_or[41][i] = MultiOR(2); - multi_or[41][i].in[0] <== and[332][i].out; - multi_or[41][i].in[1] <== and[333][i].out; - and[334][i].b <== multi_or[41][i].out; - and[335][i] = AND(); - and[335][i].a <== states[i][77]; - and[335][i].b <== and[42][i].out; - multi_or[42][i] = MultiOR(3); - multi_or[42][i].in[0] <== and[331][i].out; - multi_or[42][i].in[1] <== and[334][i].out; - multi_or[42][i].in[2] <== and[335][i].out; - states[i+1][67] <== multi_or[42][i].out; - and[336][i] = AND(); - and[336][i].a <== states[i][64]; - and[336][i].b <== and[88][i].out; - and[337][i] = AND(); - and[337][i].a <== states[i][69]; - and[337][i].b <== and[90][i].out; - and[338][i] = AND(); - and[338][i].a <== states[i][70]; - and[338][i].b <== and[42][i].out; - and[339][i] = AND(); - and[339][i].a <== states[i][71]; - and[339][i].b <== and[93][i].out; - multi_or[43][i] = MultiOR(4); - multi_or[43][i].in[0] <== and[336][i].out; - multi_or[43][i].in[1] <== and[337][i].out; - multi_or[43][i].in[2] <== and[338][i].out; - multi_or[43][i].in[3] <== and[339][i].out; - states[i+1][68] <== multi_or[43][i].out; - and[340][i] = AND(); - and[340][i].a <== states[i][64]; - and[340][i].b <== eq[42][i].out; - states[i+1][69] <== and[340][i].out; - and[341][i] = AND(); - and[341][i].a <== states[i][64]; - and[341][i].b <== multi_or[25][i].out; - and[342][i] = AND(); - and[342][i].a <== states[i][72]; - and[342][i].b <== and[145][i].out; - and[343][i] = AND(); - and[343][i].a <== states[i][73]; - and[343][i].b <== and[42][i].out; - and[344][i] = AND(); - and[344][i].a <== states[i][74]; - and[344][i].b <== multi_or[26][i].out; - multi_or[44][i] = MultiOR(4); - multi_or[44][i].in[0] <== and[341][i].out; - multi_or[44][i].in[1] <== and[342][i].out; - multi_or[44][i].in[2] <== and[343][i].out; - multi_or[44][i].in[3] <== and[344][i].out; - states[i+1][70] <== multi_or[44][i].out; - and[345][i] = AND(); - and[345][i].a <== states[i][64]; - and[345][i].b <== eq[73][i].out; - states[i+1][71] <== and[345][i].out; - and[346][i] = AND(); - and[346][i].a <== states[i][64]; - and[346][i].b <== eq[74][i].out; - states[i+1][72] <== and[346][i].out; - and[347][i] = AND(); - and[347][i].a <== states[i][64]; - and[347][i].b <== multi_or[30][i].out; - states[i+1][73] <== and[347][i].out; - and[348][i] = AND(); - and[348][i].a <== states[i][64]; - and[348][i].b <== eq[78][i].out; - states[i+1][74] <== and[348][i].out; - and[349][i] = AND(); - and[349][i].a <== states[i][66]; - and[349][i].b <== eq[5][i].out; - states[i+1][75] <== and[349][i].out; - eq[82][i] = IsEqual(); - eq[82][i].in[0] <== in[i]; - eq[82][i].in[1] <== 62; - and[350][i] = AND(); - and[350][i].a <== states[i][67]; - and[350][i].b <== eq[82][i].out; - states[i+1][76] <== and[350][i].out; - and[351][i] = AND(); - and[351][i].a <== states[i][67]; - and[351][i].b <== and[88][i].out; - and[352][i] = AND(); - and[352][i].a <== states[i][78]; - and[352][i].b <== and[90][i].out; - and[353][i] = AND(); - and[353][i].a <== states[i][79]; - and[353][i].b <== and[42][i].out; - and[354][i] = AND(); - and[354][i].a <== states[i][80]; - and[354][i].b <== and[93][i].out; - multi_or[45][i] = MultiOR(4); - multi_or[45][i].in[0] <== and[351][i].out; - multi_or[45][i].in[1] <== and[352][i].out; - multi_or[45][i].in[2] <== and[353][i].out; - multi_or[45][i].in[3] <== and[354][i].out; - states[i+1][77] <== multi_or[45][i].out; - and[355][i] = AND(); - and[355][i].a <== states[i][67]; - and[355][i].b <== eq[42][i].out; - states[i+1][78] <== and[355][i].out; - and[356][i] = AND(); - and[356][i].a <== states[i][67]; - and[356][i].b <== multi_or[25][i].out; - and[357][i] = AND(); - and[357][i].a <== states[i][81]; - and[357][i].b <== and[145][i].out; - and[358][i] = AND(); - and[358][i].a <== states[i][82]; - and[358][i].b <== and[42][i].out; - and[359][i] = AND(); - and[359][i].a <== states[i][83]; - and[359][i].b <== multi_or[26][i].out; - multi_or[46][i] = MultiOR(4); - multi_or[46][i].in[0] <== and[356][i].out; - multi_or[46][i].in[1] <== and[357][i].out; - multi_or[46][i].in[2] <== and[358][i].out; - multi_or[46][i].in[3] <== and[359][i].out; - states[i+1][79] <== multi_or[46][i].out; - and[360][i] = AND(); - and[360][i].a <== states[i][67]; - and[360][i].b <== eq[73][i].out; - states[i+1][80] <== and[360][i].out; - and[361][i] = AND(); - and[361][i].a <== states[i][67]; - and[361][i].b <== eq[74][i].out; - states[i+1][81] <== and[361][i].out; - and[362][i] = AND(); - and[362][i].a <== states[i][67]; - and[362][i].b <== multi_or[30][i].out; - states[i+1][82] <== and[362][i].out; - and[363][i] = AND(); - and[363][i].a <== states[i][67]; - and[363][i].b <== eq[78][i].out; - states[i+1][83] <== and[363][i].out; - and[364][i] = AND(); - and[364][i].a <== states[i][76]; - states[i+1][84] <== and[364][i].out; - and[365][i] = AND(); - and[365][i].a <== states[i][84]; - and[365][i].b <== eq[3][i].out; - states[i+1][85] <== and[365][i].out; - and[366][i] = AND(); - and[366][i].a <== states[i][85]; - and[366][i].b <== eq[5][i].out; - states[i+1][86] <== and[366][i].out; - and[367][i] = AND(); - and[367][i].a <== states[i][86]; - states[i+1][87] <== and[367][i].out; - and[368][i] = AND(); - and[368][i].a <== states[i][87]; - and[368][i].b <== eq[3][i].out; - states[i+1][88] <== and[368][i].out; - and[369][i] = AND(); - and[369][i].a <== states[i][88]; - and[369][i].b <== eq[5][i].out; - states[i+1][89] <== and[369][i].out; - lt[54][i] = LessEqThan(8); - lt[54][i].in[0] <== 1; - lt[54][i].in[1] <== in[i]; - lt[55][i] = LessEqThan(8); - lt[55][i].in[0] <== in[i]; - lt[55][i].in[1] <== 46; - and[370][i] = AND(); - and[370][i].a <== lt[54][i].out; - and[370][i].b <== lt[55][i].out; - eq[83][i] = IsEqual(); - eq[83][i].in[0] <== in[i]; - eq[83][i].in[1] <== 48; - eq[84][i] = IsEqual(); - eq[84][i].in[0] <== in[i]; - eq[84][i].in[1] <== 49; - eq[85][i] = IsEqual(); - eq[85][i].in[0] <== in[i]; - eq[85][i].in[1] <== 50; - eq[86][i] = IsEqual(); - eq[86][i].in[0] <== in[i]; - eq[86][i].in[1] <== 52; - eq[87][i] = IsEqual(); - eq[87][i].in[0] <== in[i]; - eq[87][i].in[1] <== 53; - eq[88][i] = IsEqual(); - eq[88][i].in[0] <== in[i]; - eq[88][i].in[1] <== 54; - eq[89][i] = IsEqual(); - eq[89][i].in[0] <== in[i]; - eq[89][i].in[1] <== 55; - eq[90][i] = IsEqual(); - eq[90][i].in[0] <== in[i]; - eq[90][i].in[1] <== 56; - eq[91][i] = IsEqual(); - eq[91][i].in[0] <== in[i]; - eq[91][i].in[1] <== 57; - eq[92][i] = IsEqual(); - eq[92][i].in[0] <== in[i]; - eq[92][i].in[1] <== 58; - eq[93][i] = IsEqual(); - eq[93][i].in[0] <== in[i]; - eq[93][i].in[1] <== 59; - and[371][i] = AND(); - and[371][i].a <== states[i][76]; - multi_or[47][i] = MultiOR(15); - multi_or[47][i].in[0] <== and[370][i].out; - multi_or[47][i].in[1] <== and[333][i].out; - multi_or[47][i].in[2] <== eq[83][i].out; - multi_or[47][i].in[3] <== eq[84][i].out; - multi_or[47][i].in[4] <== eq[85][i].out; - multi_or[47][i].in[5] <== eq[8][i].out; - multi_or[47][i].in[6] <== eq[86][i].out; - multi_or[47][i].in[7] <== eq[87][i].out; - multi_or[47][i].in[8] <== eq[88][i].out; - multi_or[47][i].in[9] <== eq[89][i].out; - multi_or[47][i].in[10] <== eq[90][i].out; - multi_or[47][i].in[11] <== eq[91][i].out; - multi_or[47][i].in[12] <== eq[92][i].out; - multi_or[47][i].in[13] <== eq[93][i].out; - multi_or[47][i].in[14] <== eq[1][i].out; - and[371][i].b <== multi_or[47][i].out; - and[372][i] = AND(); - and[372][i].a <== states[i][86]; - and[372][i].b <== multi_or[47][i].out; - and[373][i] = AND(); - and[373][i].a <== states[i][89]; - and[373][i].b <== multi_or[47][i].out; - and[374][i] = AND(); - and[374][i].a <== states[i][90]; - and[374][i].b <== multi_or[47][i].out; - and[375][i] = AND(); - and[375][i].a <== states[i][91]; - and[375][i].b <== and[42][i].out; - multi_or[48][i] = MultiOR(5); - multi_or[48][i].in[0] <== and[371][i].out; - multi_or[48][i].in[1] <== and[372][i].out; - multi_or[48][i].in[2] <== and[373][i].out; - multi_or[48][i].in[3] <== and[374][i].out; - multi_or[48][i].in[4] <== and[375][i].out; - states[i+1][90] <== multi_or[48][i].out; - and[376][i] = AND(); - and[376][i].a <== states[i][76]; - and[376][i].b <== and[88][i].out; - and[377][i] = AND(); - and[377][i].a <== states[i][86]; - and[377][i].b <== and[88][i].out; - and[378][i] = AND(); - and[378][i].a <== states[i][89]; - and[378][i].b <== and[88][i].out; - and[379][i] = AND(); - and[379][i].a <== states[i][90]; - and[379][i].b <== and[88][i].out; - and[380][i] = AND(); - and[380][i].a <== states[i][92]; - and[380][i].b <== and[90][i].out; - and[381][i] = AND(); - and[381][i].a <== states[i][93]; - and[381][i].b <== and[42][i].out; - and[382][i] = AND(); - and[382][i].a <== states[i][94]; - and[382][i].b <== and[93][i].out; - multi_or[49][i] = MultiOR(7); - multi_or[49][i].in[0] <== and[376][i].out; - multi_or[49][i].in[1] <== and[377][i].out; - multi_or[49][i].in[2] <== and[378][i].out; - multi_or[49][i].in[3] <== and[379][i].out; - multi_or[49][i].in[4] <== and[380][i].out; - multi_or[49][i].in[5] <== and[381][i].out; - multi_or[49][i].in[6] <== and[382][i].out; - states[i+1][91] <== multi_or[49][i].out; - and[383][i] = AND(); - and[383][i].a <== states[i][76]; - and[383][i].b <== eq[42][i].out; - and[384][i] = AND(); - and[384][i].a <== states[i][86]; - and[384][i].b <== eq[42][i].out; - and[385][i] = AND(); - and[385][i].a <== states[i][89]; - and[385][i].b <== eq[42][i].out; - and[386][i] = AND(); - and[386][i].a <== states[i][90]; - and[386][i].b <== eq[42][i].out; - multi_or[50][i] = MultiOR(4); - multi_or[50][i].in[0] <== and[383][i].out; - multi_or[50][i].in[1] <== and[384][i].out; - multi_or[50][i].in[2] <== and[385][i].out; - multi_or[50][i].in[3] <== and[386][i].out; - states[i+1][92] <== multi_or[50][i].out; - and[387][i] = AND(); - and[387][i].a <== states[i][76]; - and[387][i].b <== multi_or[25][i].out; - and[388][i] = AND(); - and[388][i].a <== states[i][86]; - and[388][i].b <== multi_or[25][i].out; - and[389][i] = AND(); - and[389][i].a <== states[i][89]; - and[389][i].b <== multi_or[25][i].out; - and[390][i] = AND(); - and[390][i].a <== states[i][90]; - and[390][i].b <== multi_or[25][i].out; - and[391][i] = AND(); - and[391][i].a <== states[i][95]; - and[391][i].b <== and[145][i].out; - and[392][i] = AND(); - and[392][i].a <== states[i][96]; - and[392][i].b <== and[42][i].out; - and[393][i] = AND(); - and[393][i].a <== states[i][97]; - and[393][i].b <== multi_or[26][i].out; - multi_or[51][i] = MultiOR(7); - multi_or[51][i].in[0] <== and[387][i].out; - multi_or[51][i].in[1] <== and[388][i].out; - multi_or[51][i].in[2] <== and[389][i].out; - multi_or[51][i].in[3] <== and[390][i].out; - multi_or[51][i].in[4] <== and[391][i].out; - multi_or[51][i].in[5] <== and[392][i].out; - multi_or[51][i].in[6] <== and[393][i].out; - states[i+1][93] <== multi_or[51][i].out; - and[394][i] = AND(); - and[394][i].a <== states[i][76]; - and[394][i].b <== eq[73][i].out; - and[395][i] = AND(); - and[395][i].a <== states[i][86]; - and[395][i].b <== eq[73][i].out; - and[396][i] = AND(); - and[396][i].a <== states[i][89]; - and[396][i].b <== eq[73][i].out; - and[397][i] = AND(); - and[397][i].a <== states[i][90]; - and[397][i].b <== eq[73][i].out; - multi_or[52][i] = MultiOR(4); - multi_or[52][i].in[0] <== and[394][i].out; - multi_or[52][i].in[1] <== and[395][i].out; - multi_or[52][i].in[2] <== and[396][i].out; - multi_or[52][i].in[3] <== and[397][i].out; - states[i+1][94] <== multi_or[52][i].out; - and[398][i] = AND(); - and[398][i].a <== states[i][76]; - and[398][i].b <== eq[74][i].out; - and[399][i] = AND(); - and[399][i].a <== states[i][86]; - and[399][i].b <== eq[74][i].out; - and[400][i] = AND(); - and[400][i].a <== states[i][89]; - and[400][i].b <== eq[74][i].out; - and[401][i] = AND(); - and[401][i].a <== states[i][90]; - and[401][i].b <== eq[74][i].out; - multi_or[53][i] = MultiOR(4); - multi_or[53][i].in[0] <== and[398][i].out; - multi_or[53][i].in[1] <== and[399][i].out; - multi_or[53][i].in[2] <== and[400][i].out; - multi_or[53][i].in[3] <== and[401][i].out; - states[i+1][95] <== multi_or[53][i].out; - and[402][i] = AND(); - and[402][i].a <== states[i][76]; - and[402][i].b <== multi_or[30][i].out; - and[403][i] = AND(); - and[403][i].a <== states[i][86]; - and[403][i].b <== multi_or[30][i].out; - and[404][i] = AND(); - and[404][i].a <== states[i][89]; - and[404][i].b <== multi_or[30][i].out; - and[405][i] = AND(); - and[405][i].a <== states[i][90]; - and[405][i].b <== multi_or[30][i].out; - multi_or[54][i] = MultiOR(4); - multi_or[54][i].in[0] <== and[402][i].out; - multi_or[54][i].in[1] <== and[403][i].out; - multi_or[54][i].in[2] <== and[404][i].out; - multi_or[54][i].in[3] <== and[405][i].out; - states[i+1][96] <== multi_or[54][i].out; - and[406][i] = AND(); - and[406][i].a <== states[i][76]; - and[406][i].b <== eq[78][i].out; - and[407][i] = AND(); - and[407][i].a <== states[i][86]; - and[407][i].b <== eq[78][i].out; - and[408][i] = AND(); - and[408][i].a <== states[i][89]; - and[408][i].b <== eq[78][i].out; - and[409][i] = AND(); - and[409][i].a <== states[i][90]; - and[409][i].b <== eq[78][i].out; - multi_or[55][i] = MultiOR(4); - multi_or[55][i].in[0] <== and[406][i].out; - multi_or[55][i].in[1] <== and[407][i].out; - multi_or[55][i].in[2] <== and[408][i].out; - multi_or[55][i].in[3] <== and[409][i].out; - states[i+1][97] <== multi_or[55][i].out; - and[410][i] = AND(); - and[410][i].a <== states[i][90]; - and[410][i].b <== eq[0][i].out; - states[i+1][98] <== and[410][i].out; - eq[94][i] = IsEqual(); - eq[94][i].in[0] <== in[i]; - eq[94][i].in[1] <== 47; - and[411][i] = AND(); - and[411][i].a <== states[i][98]; - and[411][i].b <== eq[94][i].out; - and[412][i] = AND(); - and[412][i].a <== states[i][107]; - and[412][i].b <== eq[94][i].out; - multi_or[56][i] = MultiOR(2); - multi_or[56][i].in[0] <== and[411][i].out; - multi_or[56][i].in[1] <== and[412][i].out; - states[i+1][99] <== multi_or[56][i].out; - and[413][i] = AND(); - and[413][i].a <== states[i][98]; - and[413][i].b <== eq[1][i].out; - states[i+1][100] <== and[413][i].out; - and[414][i] = AND(); - and[414][i].a <== states[i][99]; - and[414][i].b <== eq[1][i].out; - states[i+1][101] <== and[414][i].out; - and[415][i] = AND(); - and[415][i].a <== states[i][99]; - and[415][i].b <== eq[2][i].out; - and[416][i] = AND(); - and[416][i].a <== states[i][108]; - and[416][i].b <== eq[2][i].out; - multi_or[57][i] = MultiOR(2); - multi_or[57][i].in[0] <== and[415][i].out; - multi_or[57][i].in[1] <== and[416][i].out; - states[i+1][102] <== multi_or[57][i].out; - and[417][i] = AND(); - and[417][i].a <== states[i][100]; - and[417][i].b <== eq[3][i].out; - states[i+1][103] <== and[417][i].out; - and[418][i] = AND(); - and[418][i].a <== states[i][101]; - and[418][i].b <== eq[3][i].out; - states[i+1][104] <== and[418][i].out; - and[419][i] = AND(); - and[419][i].a <== states[i][102]; - and[419][i].b <== eq[1][i].out; - states[i+1][105] <== and[419][i].out; - and[420][i] = AND(); - and[420][i].a <== states[i][102]; - and[420][i].b <== eq[4][i].out; - and[421][i] = AND(); - and[421][i].a <== states[i][112]; - and[421][i].b <== eq[4][i].out; - multi_or[58][i] = MultiOR(2); - multi_or[58][i].in[0] <== and[420][i].out; - multi_or[58][i].in[1] <== and[421][i].out; - states[i+1][106] <== multi_or[58][i].out; - and[422][i] = AND(); - and[422][i].a <== states[i][103]; - and[422][i].b <== eq[5][i].out; - states[i+1][107] <== and[422][i].out; - and[423][i] = AND(); - and[423][i].a <== states[i][104]; - and[423][i].b <== eq[5][i].out; - states[i+1][108] <== and[423][i].out; - and[424][i] = AND(); - and[424][i].a <== states[i][105]; - and[424][i].b <== eq[3][i].out; - states[i+1][109] <== and[424][i].out; - and[425][i] = AND(); - and[425][i].a <== states[i][106]; - and[425][i].b <== eq[1][i].out; - states[i+1][110] <== and[425][i].out; - and[426][i] = AND(); - and[426][i].a <== states[i][106]; - and[426][i].b <== eq[6][i].out; - and[427][i] = AND(); - and[427][i].a <== states[i][116]; - and[427][i].b <== eq[6][i].out; - multi_or[59][i] = MultiOR(2); - multi_or[59][i].in[0] <== and[426][i].out; - multi_or[59][i].in[1] <== and[427][i].out; - states[i+1][111] <== multi_or[59][i].out; - and[428][i] = AND(); - and[428][i].a <== states[i][109]; - and[428][i].b <== eq[5][i].out; - states[i+1][112] <== and[428][i].out; - and[429][i] = AND(); - and[429][i].a <== states[i][110]; - and[429][i].b <== eq[3][i].out; - states[i+1][113] <== and[429][i].out; - and[430][i] = AND(); - and[430][i].a <== states[i][111]; - and[430][i].b <== eq[1][i].out; - states[i+1][114] <== and[430][i].out; - and[431][i] = AND(); - and[431][i].a <== states[i][111]; - and[431][i].b <== eq[82][i].out; - and[432][i] = AND(); - and[432][i].a <== states[i][118]; - and[432][i].b <== eq[82][i].out; - multi_or[60][i] = MultiOR(2); - multi_or[60][i].in[0] <== and[431][i].out; - multi_or[60][i].in[1] <== and[432][i].out; - states[i+1][115] <== multi_or[60][i].out; - and[433][i] = AND(); - and[433][i].a <== states[i][113]; - and[433][i].b <== eq[5][i].out; - states[i+1][116] <== and[433][i].out; - and[434][i] = AND(); - and[434][i].a <== states[i][114]; - and[434][i].b <== eq[3][i].out; - states[i+1][117] <== and[434][i].out; - and[435][i] = AND(); - and[435][i].a <== states[i][117]; - and[435][i].b <== eq[5][i].out; - states[i+1][118] <== and[435][i].out; - from_zero_enabled[i] <== MultiNOR(118)([states_tmp[i+1][1], states[i+1][2], states[i+1][3], states[i+1][4], states[i+1][5], states[i+1][6], states[i+1][7], states[i+1][8], states[i+1][9], states[i+1][10], states[i+1][11], states[i+1][12], states[i+1][13], states[i+1][14], states[i+1][15], states[i+1][16], states[i+1][17], states[i+1][18], states[i+1][19], states[i+1][20], states[i+1][21], states[i+1][22], states[i+1][23], states[i+1][24], states[i+1][25], states[i+1][26], states[i+1][27], states[i+1][28], states[i+1][29], states[i+1][30], states[i+1][31], states[i+1][32], states[i+1][33], states[i+1][34], states[i+1][35], states[i+1][36], states[i+1][37], states[i+1][38], states[i+1][39], states[i+1][40], states[i+1][41], states[i+1][42], states[i+1][43], states[i+1][44], states[i+1][45], states[i+1][46], states[i+1][47], states[i+1][48], states[i+1][49], states[i+1][50], states[i+1][51], states[i+1][52], states[i+1][53], states[i+1][54], states[i+1][55], states[i+1][56], states[i+1][57], states[i+1][58], states[i+1][59], states[i+1][60], states[i+1][61], states[i+1][62], states[i+1][63], states[i+1][64], states[i+1][65], states[i+1][66], states[i+1][67], states[i+1][68], states[i+1][69], states[i+1][70], states[i+1][71], states[i+1][72], states[i+1][73], states[i+1][74], states[i+1][75], states[i+1][76], states[i+1][77], states[i+1][78], states[i+1][79], states[i+1][80], states[i+1][81], states[i+1][82], states[i+1][83], states[i+1][84], states[i+1][85], states[i+1][86], states[i+1][87], states[i+1][88], states[i+1][89], states[i+1][90], states[i+1][91], states[i+1][92], states[i+1][93], states[i+1][94], states[i+1][95], states[i+1][96], states[i+1][97], states[i+1][98], states[i+1][99], states[i+1][100], states[i+1][101], states[i+1][102], states[i+1][103], states[i+1][104], states[i+1][105], states[i+1][106], states[i+1][107], states[i+1][108], states[i+1][109], states[i+1][110], states[i+1][111], states[i+1][112], states[i+1][113], states[i+1][114], states[i+1][115], states[i+1][116], states[i+1][117], states[i+1][118]]); + and[166][i].a <== states[i][54]; + and[166][i].b <== eq[69][i].out; + states[i+1][55] <== and[166][i].out; + from_zero_enabled[i] <== MultiNOR(55)([states_tmp[i+1][1], states[i+1][2], states[i+1][3], states[i+1][4], states[i+1][5], states[i+1][6], states[i+1][7], states[i+1][8], states[i+1][9], states[i+1][10], states[i+1][11], states[i+1][12], states[i+1][13], states[i+1][14], states[i+1][15], states[i+1][16], states[i+1][17], states[i+1][18], states[i+1][19], states[i+1][20], states[i+1][21], states[i+1][22], states[i+1][23], states[i+1][24], states[i+1][25], states[i+1][26], states[i+1][27], states[i+1][28], states[i+1][29], states[i+1][30], states[i+1][31], states[i+1][32], states[i+1][33], states[i+1][34], states[i+1][35], states[i+1][36], states[i+1][37], states[i+1][38], states[i+1][39], states[i+1][40], states[i+1][41], states[i+1][42], states[i+1][43], states[i+1][44], states[i+1][45], states[i+1][46], states[i+1][47], states[i+1][48], states[i+1][49], states[i+1][50], states[i+1][51], states[i+1][52], states[i+1][53], states[i+1][54], states[i+1][55]]); states[i+1][1] <== MultiOR(2)([states_tmp[i+1][1], from_zero_enabled[i] * and[0][i].out]); state_changed[i].in[0] <== states[i+1][1]; state_changed[i].in[1] <== states[i+1][2]; @@ -2654,130 +1314,51 @@ template CommandRegex(msg_bytes) { state_changed[i].in[52] <== states[i+1][53]; state_changed[i].in[53] <== states[i+1][54]; state_changed[i].in[54] <== states[i+1][55]; - state_changed[i].in[55] <== states[i+1][56]; - state_changed[i].in[56] <== states[i+1][57]; - state_changed[i].in[57] <== states[i+1][58]; - state_changed[i].in[58] <== states[i+1][59]; - state_changed[i].in[59] <== states[i+1][60]; - state_changed[i].in[60] <== states[i+1][61]; - state_changed[i].in[61] <== states[i+1][62]; - state_changed[i].in[62] <== states[i+1][63]; - state_changed[i].in[63] <== states[i+1][64]; - state_changed[i].in[64] <== states[i+1][65]; - state_changed[i].in[65] <== states[i+1][66]; - state_changed[i].in[66] <== states[i+1][67]; - state_changed[i].in[67] <== states[i+1][68]; - state_changed[i].in[68] <== states[i+1][69]; - state_changed[i].in[69] <== states[i+1][70]; - state_changed[i].in[70] <== states[i+1][71]; - state_changed[i].in[71] <== states[i+1][72]; - state_changed[i].in[72] <== states[i+1][73]; - state_changed[i].in[73] <== states[i+1][74]; - state_changed[i].in[74] <== states[i+1][75]; - state_changed[i].in[75] <== states[i+1][76]; - state_changed[i].in[76] <== states[i+1][77]; - state_changed[i].in[77] <== states[i+1][78]; - state_changed[i].in[78] <== states[i+1][79]; - state_changed[i].in[79] <== states[i+1][80]; - state_changed[i].in[80] <== states[i+1][81]; - state_changed[i].in[81] <== states[i+1][82]; - state_changed[i].in[82] <== states[i+1][83]; - state_changed[i].in[83] <== states[i+1][84]; - state_changed[i].in[84] <== states[i+1][85]; - state_changed[i].in[85] <== states[i+1][86]; - state_changed[i].in[86] <== states[i+1][87]; - state_changed[i].in[87] <== states[i+1][88]; - state_changed[i].in[88] <== states[i+1][89]; - state_changed[i].in[89] <== states[i+1][90]; - state_changed[i].in[90] <== states[i+1][91]; - state_changed[i].in[91] <== states[i+1][92]; - state_changed[i].in[92] <== states[i+1][93]; - state_changed[i].in[93] <== states[i+1][94]; - state_changed[i].in[94] <== states[i+1][95]; - state_changed[i].in[95] <== states[i+1][96]; - state_changed[i].in[96] <== states[i+1][97]; - state_changed[i].in[97] <== states[i+1][98]; - state_changed[i].in[98] <== states[i+1][99]; - state_changed[i].in[99] <== states[i+1][100]; - state_changed[i].in[100] <== states[i+1][101]; - state_changed[i].in[101] <== states[i+1][102]; - state_changed[i].in[102] <== states[i+1][103]; - state_changed[i].in[103] <== states[i+1][104]; - state_changed[i].in[104] <== states[i+1][105]; - state_changed[i].in[105] <== states[i+1][106]; - state_changed[i].in[106] <== states[i+1][107]; - state_changed[i].in[107] <== states[i+1][108]; - state_changed[i].in[108] <== states[i+1][109]; - state_changed[i].in[109] <== states[i+1][110]; - state_changed[i].in[110] <== states[i+1][111]; - state_changed[i].in[111] <== states[i+1][112]; - state_changed[i].in[112] <== states[i+1][113]; - state_changed[i].in[113] <== states[i+1][114]; - state_changed[i].in[114] <== states[i+1][115]; - state_changed[i].in[115] <== states[i+1][116]; - state_changed[i].in[116] <== states[i+1][117]; - state_changed[i].in[117] <== states[i+1][118]; } component is_accepted = MultiOR(num_bytes+1); for (var i = 0; i <= num_bytes; i++) { - is_accepted.in[i] <== states[i][115]; + is_accepted.in[i] <== states[i][55]; } out <== is_accepted.out; signal is_consecutive[msg_bytes+1][3]; is_consecutive[msg_bytes][2] <== 0; for (var i = 0; i < msg_bytes; i++) { - is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][115] * (1 - is_consecutive[msg_bytes-i][2]) + is_consecutive[msg_bytes-i][2]; + is_consecutive[msg_bytes-1-i][0] <== states[num_bytes-i][55] * (1 - is_consecutive[msg_bytes-i][2]) + is_consecutive[msg_bytes-i][2]; is_consecutive[msg_bytes-1-i][1] <== state_changed[msg_bytes-i].out * is_consecutive[msg_bytes-1-i][0]; - is_consecutive[msg_bytes-1-i][2] <== ORAnd()([(1 - from_zero_enabled[msg_bytes-i+1]), states[num_bytes-i][115], is_consecutive[msg_bytes-1-i][1]]); + is_consecutive[msg_bytes-1-i][2] <== ORAnd()([(1 - from_zero_enabled[msg_bytes-i+1]), states[num_bytes-i][55], is_consecutive[msg_bytes-1-i][1]]); } - // substrings calculated: [{(76, 90), (76, 91), (76, 92), (76, 93), (76, 94), (76, 95), (76, 96), (76, 97), (86, 90), (86, 91), (86, 92), (86, 93), (86, 94), (86, 95), (86, 96), (86, 97), (89, 90), (89, 91), (89, 92), (89, 93), (89, 94), (89, 95), (89, 96), (89, 97), (90, 90), (90, 91), (90, 92), (90, 93), (90, 94), (90, 95), (90, 96), (90, 97), (91, 90), (92, 91), (93, 91), (94, 91), (95, 93), (96, 93), (97, 93)}] - signal prev_states0[39][msg_bytes]; + // substrings calculated: [{(34, 42), (34, 43), (34, 44), (34, 45), (34, 46), (34, 47), (34, 48), (34, 49), (42, 42), (42, 43), (42, 44), (42, 45), (42, 46), (42, 47), (42, 48), (42, 49), (43, 42), (44, 43), (45, 43), (46, 43), (47, 45), (48, 45), (49, 45)}] + signal prev_states0[23][msg_bytes]; signal is_substr0[msg_bytes]; signal is_reveal0[msg_bytes]; signal output reveal0[msg_bytes]; for (var i = 0; i < msg_bytes; i++) { - // the 0-th substring transitions: [(76, 90), (76, 91), (76, 92), (76, 93), (76, 94), (76, 95), (76, 96), (76, 97), (86, 90), (86, 91), (86, 92), (86, 93), (86, 94), (86, 95), (86, 96), (86, 97), (89, 90), (89, 91), (89, 92), (89, 93), (89, 94), (89, 95), (89, 96), (89, 97), (90, 90), (90, 91), (90, 92), (90, 93), (90, 94), (90, 95), (90, 96), (90, 97), (91, 90), (92, 91), (93, 91), (94, 91), (95, 93), (96, 93), (97, 93)] - prev_states0[0][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; - prev_states0[1][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; - prev_states0[2][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; - prev_states0[3][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; - prev_states0[4][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; - prev_states0[5][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; - prev_states0[6][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; - prev_states0[7][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][76]; - prev_states0[8][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; - prev_states0[9][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; - prev_states0[10][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; - prev_states0[11][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; - prev_states0[12][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; - prev_states0[13][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; - prev_states0[14][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; - prev_states0[15][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][86]; - prev_states0[16][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; - prev_states0[17][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; - prev_states0[18][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; - prev_states0[19][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; - prev_states0[20][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; - prev_states0[21][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; - prev_states0[22][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; - prev_states0[23][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][89]; - prev_states0[24][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; - prev_states0[25][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; - prev_states0[26][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; - prev_states0[27][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; - prev_states0[28][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; - prev_states0[29][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; - prev_states0[30][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; - prev_states0[31][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][90]; - prev_states0[32][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][91]; - prev_states0[33][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][92]; - prev_states0[34][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][93]; - prev_states0[35][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][94]; - prev_states0[36][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][95]; - prev_states0[37][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][96]; - prev_states0[38][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][97]; - is_substr0[i] <== MultiOR(39)([prev_states0[0][i] * states[i+2][90], prev_states0[1][i] * states[i+2][91], prev_states0[2][i] * states[i+2][92], prev_states0[3][i] * states[i+2][93], prev_states0[4][i] * states[i+2][94], prev_states0[5][i] * states[i+2][95], prev_states0[6][i] * states[i+2][96], prev_states0[7][i] * states[i+2][97], prev_states0[8][i] * states[i+2][90], prev_states0[9][i] * states[i+2][91], prev_states0[10][i] * states[i+2][92], prev_states0[11][i] * states[i+2][93], prev_states0[12][i] * states[i+2][94], prev_states0[13][i] * states[i+2][95], prev_states0[14][i] * states[i+2][96], prev_states0[15][i] * states[i+2][97], prev_states0[16][i] * states[i+2][90], prev_states0[17][i] * states[i+2][91], prev_states0[18][i] * states[i+2][92], prev_states0[19][i] * states[i+2][93], prev_states0[20][i] * states[i+2][94], prev_states0[21][i] * states[i+2][95], prev_states0[22][i] * states[i+2][96], prev_states0[23][i] * states[i+2][97], prev_states0[24][i] * states[i+2][90], prev_states0[25][i] * states[i+2][91], prev_states0[26][i] * states[i+2][92], prev_states0[27][i] * states[i+2][93], prev_states0[28][i] * states[i+2][94], prev_states0[29][i] * states[i+2][95], prev_states0[30][i] * states[i+2][96], prev_states0[31][i] * states[i+2][97], prev_states0[32][i] * states[i+2][90], prev_states0[33][i] * states[i+2][91], prev_states0[34][i] * states[i+2][91], prev_states0[35][i] * states[i+2][91], prev_states0[36][i] * states[i+2][93], prev_states0[37][i] * states[i+2][93], prev_states0[38][i] * states[i+2][93]]); + // the 0-th substring transitions: [(34, 42), (34, 43), (34, 44), (34, 45), (34, 46), (34, 47), (34, 48), (34, 49), (42, 42), (42, 43), (42, 44), (42, 45), (42, 46), (42, 47), (42, 48), (42, 49), (43, 42), (44, 43), (45, 43), (46, 43), (47, 45), (48, 45), (49, 45)] + prev_states0[0][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][34]; + prev_states0[1][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][34]; + prev_states0[2][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][34]; + prev_states0[3][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][34]; + prev_states0[4][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][34]; + prev_states0[5][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][34]; + prev_states0[6][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][34]; + prev_states0[7][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][34]; + prev_states0[8][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][42]; + prev_states0[9][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][42]; + prev_states0[10][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][42]; + prev_states0[11][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][42]; + prev_states0[12][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][42]; + prev_states0[13][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][42]; + prev_states0[14][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][42]; + prev_states0[15][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][42]; + prev_states0[16][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][43]; + prev_states0[17][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][44]; + prev_states0[18][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][45]; + prev_states0[19][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][46]; + prev_states0[20][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][47]; + prev_states0[21][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][48]; + prev_states0[22][i] <== (1 - from_zero_enabled[i+1]) * states[i+1][49]; + is_substr0[i] <== MultiOR(23)([prev_states0[0][i] * states[i+2][42], prev_states0[1][i] * states[i+2][43], prev_states0[2][i] * states[i+2][44], prev_states0[3][i] * states[i+2][45], prev_states0[4][i] * states[i+2][46], prev_states0[5][i] * states[i+2][47], prev_states0[6][i] * states[i+2][48], prev_states0[7][i] * states[i+2][49], prev_states0[8][i] * states[i+2][42], prev_states0[9][i] * states[i+2][43], prev_states0[10][i] * states[i+2][44], prev_states0[11][i] * states[i+2][45], prev_states0[12][i] * states[i+2][46], prev_states0[13][i] * states[i+2][47], prev_states0[14][i] * states[i+2][48], prev_states0[15][i] * states[i+2][49], prev_states0[16][i] * states[i+2][42], prev_states0[17][i] * states[i+2][43], prev_states0[18][i] * states[i+2][43], prev_states0[19][i] * states[i+2][43], prev_states0[20][i] * states[i+2][45], prev_states0[21][i] * states[i+2][45], prev_states0[22][i] * states[i+2][45]]); is_reveal0[i] <== MultiAND(3)([out, is_substr0[i], is_consecutive[i][2]]); reveal0[i] <== in[i+1] * is_reveal0[i]; } From 4fa904dbcede909c24b8a0e782cd15b749da5e1f Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Wed, 4 Sep 2024 09:04:46 +0530 Subject: [PATCH 024/121] chore: update circuit test --- .../tests/email_auth_with_body_parsing_with_qp_encoding.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts index 1686df7e..a97c2186 100644 --- a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts +++ b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts @@ -230,7 +230,7 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { maxHeaderLength: 640, maxBodyLength: 768, ignoreBodyHashCheck: false, - shaPrecomputeSelector: '
', + shaPrecomputeSelector: '(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?"(=\r\n)?[^"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^"]*(=\r\n)?"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?([^<>/]+)(<(=\r\n)?/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>(=\r\n)?)', }); const witness = await circuit.calculateWitness(circuitInputsRelevant); await circuit.checkConstraints(witness); From 3f62a9b2a511a2df4a7b7bbdecdb3040786d7cba Mon Sep 17 00:00:00 2001 From: shreyas-londhe Date: Wed, 4 Sep 2024 12:25:36 +0530 Subject: [PATCH 025/121] chore: update relayer-uitls dep --- packages/circuits/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/circuits/package.json b/packages/circuits/package.json index f97701e6..5fa21037 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -13,7 +13,7 @@ "dependencies": { "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.3.4", + "@zk-email/relayer-utils": "^0.3.5", "commander": "^11.0.0", "snarkjs": "^0.7.0" }, From dca6793e4eade7cbba0c9f7516768d4b9c22339d Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Wed, 4 Sep 2024 19:53:50 +0900 Subject: [PATCH 026/121] Update verifier --- .../contracts/src/utils/Groth16Verifier.sol | 148 +++++++++--------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/packages/contracts/src/utils/Groth16Verifier.sol b/packages/contracts/src/utils/Groth16Verifier.sol index 519cf27e..2423204a 100644 --- a/packages/contracts/src/utils/Groth16Verifier.sol +++ b/packages/contracts/src/utils/Groth16Verifier.sol @@ -37,116 +37,116 @@ contract Groth16Verifier { uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 14137599133423807135782490399584092377749091501298939597920866162944520244436; - uint256 constant deltax2 = 14978007254868208603199787958301705165537192974609940615923845103163843289642; - uint256 constant deltay1 = 20866926135988308729900029756061807139052115776449961128367516123973492874132; - uint256 constant deltay2 = 13313063679389223211741428584465992043666285070547834947574090177964352791211; + uint256 constant deltax1 = 4858829669817347093182793857775974191320149144941367900620918889248420221405; + uint256 constant deltax2 = 2349268651909297333656812175507747333482815372948808934398780108401386690052; + uint256 constant deltay1 = 7694909852690402669806436882407880044159855145256384757904321211496345411627; + uint256 constant deltay2 = 13049872237347108980489027279484885483262009497487624719762629191589932117577; - uint256 constant IC0x = 5195936601868887585212421372510227978271676935057973899956702156349203234222; - uint256 constant IC0y = 7962666133599308700300916998348077443104178691470750683750290264787523050083; + uint256 constant IC0x = 4211770379362138903856219862840433796980213258757522697832886980405220081220; + uint256 constant IC0y = 16262585275919937778121864217428161249107463864673038031276191032927839035906; - uint256 constant IC1x = 3742958340223569504265649722106845322935941488002511232315317901779710961348; - uint256 constant IC1y = 17830086392700490461575614924542539921010019218267138065309167838118767673071; + uint256 constant IC1x = 7099677506678218566365066000867791810072476519608078822828837000682196003379; + uint256 constant IC1y = 1769237770256153753400309038867357975549596116377652985313792522430343288331; - uint256 constant IC2x = 4332752895886212961294524900538769962072739040734849994651204657950683289368; - uint256 constant IC2y = 1377131541785679015417232044137700801378123208892271570382657073684395420024; + uint256 constant IC2x = 5989178861683444195999731678542399733494487460212710973544093878608710847435; + uint256 constant IC2y = 10156246898993882066916603426190751095589234851486847103233948255970437390810; - uint256 constant IC3x = 16378292231478499838092155231627156354691178980041169284687330191005695577919; - uint256 constant IC3y = 17984842151588713416158803141980876218634444020891506138402480465525181344342; + uint256 constant IC3x = 8701085534366120999121767803730000480108589548341934333709782694649634498138; + uint256 constant IC3y = 20207904803535365628311317895287771329626458055937586966862287833631465980028; - uint256 constant IC4x = 11965323634630493035329899963690158132995308612106355950740136591993893219420; - uint256 constant IC4y = 9036580198334173839201781041185265082225960680796419311264598509854480156749; + uint256 constant IC4x = 19257046993352497958438805347329633592317088606922904557692449945390128748116; + uint256 constant IC4y = 5642717832394244570923095827287647199707184086427776423070140911486420942150; - uint256 constant IC5x = 8459630029068528580429553108101440945373189351254431332719199991450558544610; - uint256 constant IC5y = 13651627208666641596882636276693872905868719669569331130223221844756480706355; + uint256 constant IC5x = 6604323904530459929048657334218164572603930719021236138541907309311551582537; + uint256 constant IC5y = 667334202447374705138407118596023814372319062185658187750378063436264762785; - uint256 constant IC6x = 11418680074014215462237476921106744160987769937545607863613880530479435852793; - uint256 constant IC6y = 16741190989512051286515154593161715196784599987136091819768098700099951966060; + uint256 constant IC6x = 11535229849645627262504107788901033303442605130322605553360243142789060219891; + uint256 constant IC6y = 1753637515299924092253195578151263987316263848401197118330774620194785401452; - uint256 constant IC7x = 13831043129703500407338686026967233166168634089065511597932358351098797730621; - uint256 constant IC7y = 19654592342690178826154705309997596268116769282480108200974219537036779371791; + uint256 constant IC7x = 12498900101086841522232364634108467559129266406240189524513481987584483665932; + uint256 constant IC7y = 6522787544636188304951805297375626750156218692922889853302930148319905013996; - uint256 constant IC8x = 12659402812760536946587000061651522239448406097114769091067522676195029124036; - uint256 constant IC8y = 21366009070877925176882055259475055305247055854906963167825248279397450107409; + uint256 constant IC8x = 4480135903096772346095767872562588741670853664386331507867635466927934834572; + uint256 constant IC8y = 9740988249152422840657218460324840065260226415481576126599811593594715176614; - uint256 constant IC9x = 11453150531242067834578895014844696195314287671155062571621601525155787106768; - uint256 constant IC9y = 13537796031408580209437745696367565845966373090615194634642039101343542355153; + uint256 constant IC9x = 13047200366114718711781016004799503316506956688819476978254555611043342693901; + uint256 constant IC9y = 21327932921959593729230545468282812265758180044612564454867095866299630965437; - uint256 constant IC10x = 20093354799903715012012153551878914128034578543732120460093003674569621900678; - uint256 constant IC10y = 661654072208849854990960058973836491179251267828702406201676324115522183987; + uint256 constant IC10x = 11376960835268614350741468735798253461118575948160086341424615959754701304513; + uint256 constant IC10y = 15597725160474274737554011477863236677670609244381748129499328040573769169072; - uint256 constant IC11x = 2199538106454983378702155262750677597934025323095042816965655834581602546305; - uint256 constant IC11y = 938804879776828512825404167032359904154808938369573736543158236082744779065; + uint256 constant IC11x = 11897676789685363392905629453099957141626538123954346927380010313347510977576; + uint256 constant IC11y = 14976898926642513604420099948648410196260761766527012733905356150374916695226; - uint256 constant IC12x = 13649643871438615401325195027458534071402773850754937857802795986898955350643; - uint256 constant IC12y = 17385455189083877001780749863496820018757924419367993355210000166538058509504; + uint256 constant IC12x = 10705479672629199296499184819365013568112407645583263601648436909575260989231; + uint256 constant IC12y = 12390312497516174890706591689640434215359848536333797411488857638700234635063; - uint256 constant IC13x = 3919806397462020476924320698720612586325131068555439014510154499929415231546; - uint256 constant IC13y = 6950962750979275347308936684073542743916967713183550555287096414703303875072; + uint256 constant IC13x = 10425206092609858366454385791401502105148449847917106110284639721308273423342; + uint256 constant IC13y = 18242461427611975897422440915025510015679040781015534582773251010854996692185; - uint256 constant IC14x = 21617074324876578460531149615625632094727390653686583753180981293116313336795; - uint256 constant IC14y = 18288151827607067102645837618524429433655012118476234601055198996044031270225; + uint256 constant IC14x = 11621088052698567148182208253169607392578076249553939761613628597015195444595; + uint256 constant IC14y = 15119973346566563544001441321483642551077279944021367457728450526874312644840; - uint256 constant IC15x = 4000708925527443807227241537033307583003447845797803803332356328626248705382; - uint256 constant IC15y = 1154600183297897257070571574499276007915600103090707700994900568610839463180; + uint256 constant IC15x = 3694989447959615271598638846469075742941537980300757012006599339224930036765; + uint256 constant IC15y = 487178526024236410205400392361688163591688252491455525243046863091215985874; - uint256 constant IC16x = 11901100788061344866021032645161410354755351952030556105637534598729803434166; - uint256 constant IC16y = 16804802892568449193466174693644238516033464302901967260235961561237161720026; + uint256 constant IC16x = 16669637139480556591463812569837271645339702458271203139378127750199663899786; + uint256 constant IC16y = 11468847616135016970306428034890939119283893821736516621097778930694598034368; - uint256 constant IC17x = 586980697795044138033629480303267286923166292074979442828313193925002353539; - uint256 constant IC17y = 11395515205673918388736502540392075651362432388102325564755713826093996896765; + uint256 constant IC17x = 20646878988470168748773935413431912831865041056289307593368304388393650557271; + uint256 constant IC17y = 827193114932801528520304378867896633328368580526375365335905841178073708646; - uint256 constant IC18x = 21684800601451717499401579708297162716967255721349906661409841794723254042516; - uint256 constant IC18y = 7331868483392828521170991339808386563984066825046191241635252089006975585746; + uint256 constant IC18x = 4577222939682608116020745394835385625247892951593517505220683292410177815398; + uint256 constant IC18y = 10765337574159612429579250364168682791985126973462157564626769410830366049552; - uint256 constant IC19x = 21071894109390133818432992111016597167186471742446860545799328494730067371036; - uint256 constant IC19y = 2250746924642512539503116477183280832526559754318370335662599738970760735965; + uint256 constant IC19x = 16900579915364382782288431773098063012424588757284168821410602152939194020713; + uint256 constant IC19y = 11738154656092524268428495125430473218851117159241760691134137578260179802880; - uint256 constant IC20x = 11699852834269224235393200438108093155076792134835482044354663066791001331547; - uint256 constant IC20y = 7525060483340472166081962270247534971293407558771701860513236466676372605839; + uint256 constant IC20x = 11996832114473654168748629667567805718029100992596193520375384097594749180474; + uint256 constant IC20y = 12197415893184205400832380386631571921646216686696514881148128824205876592633; - uint256 constant IC21x = 13333287753863763025811168578371672801299227240537901308851864510325527226990; - uint256 constant IC21y = 20724330577948787851354022778185584810491007685540005337623531623343955873208; + uint256 constant IC21x = 15435816395263292431589577655854586379711723538286423592496598199352674678507; + uint256 constant IC21y = 3956826533992471850057897747896273349387738205446854556285072199021656279013; - uint256 constant IC22x = 13369259828518535278412305903662476453129352590581315212761565315929926869744; - uint256 constant IC22y = 20684227524142403196331960093377205173124833362046724169978464210156587312666; + uint256 constant IC22x = 2369786813850488318339333825292479727059461567046452298062937914114006512850; + uint256 constant IC22y = 8702809128002581488065613436002218443246042081672702355390958016356405185715; - uint256 constant IC23x = 10149427005480696708705641408410624852074762916352315357866716257764403959452; - uint256 constant IC23y = 1832744442234417278002382253284380678688397697648853103439247404860773988913; + uint256 constant IC23x = 12544917895975488002718979866746556718640527177184601331286778090675734160803; + uint256 constant IC23y = 20762606037448349006426374611439470865657289814864923932382439595956154228516; - uint256 constant IC24x = 3238148721388181813909444794632491849221750829570437445443493977964140908904; - uint256 constant IC24y = 12233471704075818623166919848035666804013719612676696733435515734260544369112; + uint256 constant IC24x = 18070509509074045298484741399301403321599290579411825491326589798309140657770; + uint256 constant IC24y = 14908226954766198674998803772409345388914316691588832258957223752963822069525; - uint256 constant IC25x = 200568091563451069021824567798180732022741817480404781322352122251371029319; - uint256 constant IC25y = 15968861848667517612536228852892590805607891756149176795583414595017493159240; + uint256 constant IC25x = 1455377095269715554036588252557915396492615334772309291658268748963880447163; + uint256 constant IC25y = 21695770302288876875103069192766492099443844872634715589406822596784910309225; - uint256 constant IC26x = 7490905222606166621539734222169901612455935470396929579767614624709598347027; - uint256 constant IC26y = 13589782990411027629285738142493427660936202498516751386142336953724617631041; + uint256 constant IC26x = 18613219484310502521758988950271293547469078219382742873978803855363453705478; + uint256 constant IC26y = 7419340280200382320924952279013159868401557816307192454458858038789820660463; - uint256 constant IC27x = 10439372252188652023854930400256109919428790553015141301690987392583603819070; - uint256 constant IC27y = 19645803372269710308802977570944089640204889280197417980290219376283875276427; + uint256 constant IC27x = 18221722127089340543801871525007420346953045418995248323716795830848226217684; + uint256 constant IC27y = 4518866934267970863421444289696546796417801156895763030898263144973675489073; - uint256 constant IC28x = 4233175821966351360135101547096990171483511734573884288134490380124888438507; - uint256 constant IC28y = 9168539599977681140669648043037625242577522004096295050291178007562663505044; + uint256 constant IC28x = 8713740537842015757942886815311011147495846836132469742940507937777153910750; + uint256 constant IC28y = 507759461462870120720184674526204638315084668933834919940607138736119655185; - uint256 constant IC29x = 17965415543572427008316038629737097163843488210247795863797767551914431062732; - uint256 constant IC29y = 10022518030566331837515422454623442021051179479186636421545476748781258842331; + uint256 constant IC29x = 283302323093706523579313567957122665840911228396951676438535928093564133804; + uint256 constant IC29y = 1681450395436167902493762433691773009029447527073836310022859931574279357369; - uint256 constant IC30x = 16378790344935617687712615346664685876579757390713337666593356471997796161017; - uint256 constant IC30y = 67087458735409640505180328942607635982826830406801168778526050991167929457; + uint256 constant IC30x = 16950838007218899572417821069113886241538367930894435961520140881634945913229; + uint256 constant IC30y = 10410906553155915588034406693304643554694784994338863360414506234348420922348; - uint256 constant IC31x = 18787438292886868094803768863007679727944933879676129674529468477986797983883; - uint256 constant IC31y = 9179663164408240683510141538256241224071171501322620226008520057824024561209; + uint256 constant IC31x = 15417816420600085986651328121013448812960638931149808993527680134568703989148; + uint256 constant IC31y = 9484856347328911531029755263457734804606312906741899150934772578024062114576; - uint256 constant IC32x = 14050482524564003571938652642078944787042443917427102971495774411991650117059; - uint256 constant IC32y = 10866596210798953641577421873214410091458533938602431334494585211834598482309; + uint256 constant IC32x = 11858766527829566429424160488629201945623249625611951541306072004276901038428; + uint256 constant IC32y = 4007102117738373297633201497667781324069297849570621583473924119854284231236; - uint256 constant IC33x = 20241331693940333034832945020019302228846150232143935552741654484387312060214; - uint256 constant IC33y = 10534185341170028606981516372307427513289433068554450644906839468082521965303; + uint256 constant IC33x = 12559118066557596997926577412374612657226056310267908347444905822043727890778; + uint256 constant IC33y = 2553701655642396735890628014783420975893274653453737050745275619913519841358; - uint256 constant IC34x = 19479517211831911662095291764442113728434510877930437280064725446574700160265; - uint256 constant IC34y = 3943207262523423297047778027342789058321444964686369874431308251582045263338; + uint256 constant IC34x = 16444904695757501831607070919219388667670309184517024943507682426550207959491; + uint256 constant IC34y = 5427016083642355586995705553257426712615569886823313935372042927851221733966; // Memory data From d8eb9204b00c8714891a8109268546f4cbbc870c Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Thu, 5 Sep 2024 00:54:42 +0900 Subject: [PATCH 027/121] Change the max header/body sizes in the body-parsing circuits. --- packages/circuits/src/email_auth_with_body_parsing.circom | 2 +- .../src/email_auth_with_body_parsing_with_qp_encoding.circom | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/circuits/src/email_auth_with_body_parsing.circom b/packages/circuits/src/email_auth_with_body_parsing.circom index 242166a1..d35db440 100644 --- a/packages/circuits/src/email_auth_with_body_parsing.circom +++ b/packages/circuits/src/email_auth_with_body_parsing.circom @@ -2,4 +2,4 @@ pragma circom 2.1.6; include "./email_auth_template.circom"; -component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 605, 0, 0); \ No newline at end of file +component main = EmailAuthWithBodyParsing(121, 17, 1024, 8192, 605, 0, 0); \ No newline at end of file diff --git a/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom b/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom index 336eaf10..ec86ce7a 100644 --- a/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom +++ b/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom @@ -2,4 +2,4 @@ pragma circom 2.1.6; include "./email_auth_template.circom"; -component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 605, 0, 1); \ No newline at end of file +component main = EmailAuthWithBodyParsing(121, 17, 1024, 8192, 605, 0, 1); \ No newline at end of file From 97094f9d01dfa6cb88f1fb7421c44f86d8a3429b Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Thu, 5 Sep 2024 02:07:57 +0900 Subject: [PATCH 028/121] Add test circuits for body parsing --- .../circuits/test_email_auth_with_body_parsing.circom | 5 +++++ ...t_email_auth_with_body_parsing_with_qp_encoding.circom | 5 +++++ .../circuits/tests/email_auth_with_body_parsing.test.ts | 8 ++++---- .../email_auth_with_body_parsing_with_qp_encoding.test.ts | 8 ++++---- 4 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 packages/circuits/tests/circuits/test_email_auth_with_body_parsing.circom create mode 100644 packages/circuits/tests/circuits/test_email_auth_with_body_parsing_with_qp_encoding.circom diff --git a/packages/circuits/tests/circuits/test_email_auth_with_body_parsing.circom b/packages/circuits/tests/circuits/test_email_auth_with_body_parsing.circom new file mode 100644 index 00000000..0f0fe634 --- /dev/null +++ b/packages/circuits/tests/circuits/test_email_auth_with_body_parsing.circom @@ -0,0 +1,5 @@ +pragma circom 2.1.6; + +include "../../src/email_auth_template.circom"; + +component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 605, 0, 0); \ No newline at end of file diff --git a/packages/circuits/tests/circuits/test_email_auth_with_body_parsing_with_qp_encoding.circom b/packages/circuits/tests/circuits/test_email_auth_with_body_parsing_with_qp_encoding.circom new file mode 100644 index 00000000..9e38853d --- /dev/null +++ b/packages/circuits/tests/circuits/test_email_auth_with_body_parsing_with_qp_encoding.circom @@ -0,0 +1,5 @@ +pragma circom 2.1.6; + +include "../../src/email_auth_template.circom"; + +component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 605, 0, 1); \ No newline at end of file diff --git a/packages/circuits/tests/email_auth_with_body_parsing.test.ts b/packages/circuits/tests/email_auth_with_body_parsing.test.ts index f1156b64..ba157e37 100644 --- a/packages/circuits/tests/email_auth_with_body_parsing.test.ts +++ b/packages/circuits/tests/email_auth_with_body_parsing.test.ts @@ -16,7 +16,7 @@ describe("Email Auth With Body Parsing", () => { recompile: true, }; circuit = await wasm_tester( - path.join(__dirname, "../src/email_auth_with_body_parsing.circom"), + path.join(__dirname, "./circuits/test_email_auth_with_body_parsing.circom"), option ); }); @@ -85,7 +85,7 @@ describe("Email Auth With Body Parsing", () => { expect(0n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 ] ); }); @@ -152,7 +152,7 @@ describe("Email Auth With Body Parsing", () => { expect(0n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 ] ); }); @@ -220,7 +220,7 @@ describe("Email Auth With Body Parsing", () => { ); expect(0n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 ] ); }); diff --git a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts index a97c2186..30de45ab 100644 --- a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts +++ b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts @@ -18,7 +18,7 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { circuit = await wasm_tester( path.join( __dirname, - "../src/email_auth_with_body_parsing_with_qp_encoding.circom" + "./circuits/test_email_auth_with_body_parsing_with_qp_encoding.circom" ), option ); @@ -142,7 +142,7 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { expect(1n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 ] ); }); @@ -209,7 +209,7 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { expect(1n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 ] ); }); @@ -277,7 +277,7 @@ describe("Email Auth With Body Parsing (QP Encoded)", () => { expect(1n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 ] ); }); From c5f4bb54d50e5707bc6feb2c5b4ea874196cdf76 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Fri, 6 Sep 2024 00:51:25 +0900 Subject: [PATCH 029/121] Update verifier --- packages/circuits/package.json | 4 +- packages/circuits/scripts/dev-setup.ts | 19 ++- packages/circuits/scripts/gen_input.ts | 4 +- .../src/email_auth_with_body_parsing.circom | 2 +- ..._with_body_parsing_with_qp_encoding.circom | 2 +- .../contracts/src/utils/Groth16Verifier.sol | 148 +++++++++--------- 6 files changed, 95 insertions(+), 84 deletions(-) diff --git a/packages/circuits/package.json b/packages/circuits/package.json index 5fa21037..7e84d67d 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -5,7 +5,7 @@ "scripts": { "build": "mkdir -p build && circom src/email_auth.circom --r1cs --wasm --sym -l ../../node_modules -o ./build", "build-body": "mkdir -p build && circom src/email_auth_with_body_parsing_with_qp_encoding.circom --r1cs --wasm --sym -l ../../node_modules -o ./build", - "dev-setup": "NODE_OPTIONS=--max_old_space_size=8192 npx ts-node scripts/dev-setup.ts --output ./build", + "dev-setup": "NODE_OPTIONS=--max_old_space_size=16384 npx ts-node scripts/dev-setup.ts --output ./build", "gen-input": "NODE_OPTIONS=--max_old_space_size=8192 npx ts-node scripts/gen_input.ts", "verify-proofs": "NODE_OPTIONS=--max_old_space_size=8192 npx ts-node scripts/verify_proofs.ts", "test": "NODE_OPTIONS=--max_old_space_size=8192 jest" @@ -42,4 +42,4 @@ ] ] } -} +} \ No newline at end of file diff --git a/packages/circuits/scripts/dev-setup.ts b/packages/circuits/scripts/dev-setup.ts index eed4a613..de0c7175 100644 --- a/packages/circuits/scripts/dev-setup.ts +++ b/packages/circuits/scripts/dev-setup.ts @@ -41,8 +41,12 @@ if (ZKEY_BEACON == null) { ZKEY_BEACON = "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"; } -const phase1Url = +let phase1Url = "https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_22.ptau"; +if (args.body) { + phase1Url = + "https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_23.ptau"; +} // const buildDir = path.join(__dirname, "../build"); // const phase1Path = path.join(buildDir, "powersOfTau28_hez_final_21.ptau"); // const r1cPath = path.join(buildDir, "wallet.r1cs"); @@ -136,12 +140,14 @@ async function generateKeys( async function exec() { const buildDir = args.output; - const phase1Path = path.join(buildDir, "powersOfTau28_hez_final_22.ptau"); - await downloadPhase1(phase1Path); - log("✓ Phase 1:", phase1Path); if (!args.body) { + const phase1Path = path.join(buildDir, "powersOfTau28_hez_final_22.ptau"); + + await downloadPhase1(phase1Path); + log("✓ Phase 1:", phase1Path); + const emailAuthR1csPath = path.join(buildDir, "email_auth.r1cs"); if (!fs.existsSync(emailAuthR1csPath)) { throw new Error(`${emailAuthR1csPath} does not exist.`); @@ -149,6 +155,11 @@ async function exec() { await generateKeys(phase1Path, emailAuthR1csPath, path.join(buildDir, "email_auth.zkey"), path.join(buildDir, "email_auth.vkey"), path.join(buildDir, "Groth16Verifier.sol")); log("✓ Keys for email auth circuit generated"); } else { + const phase1Path = path.join(buildDir, "powersOfTau28_hez_final_23.ptau"); + + await downloadPhase1(phase1Path); + log("✓ Phase 1:", phase1Path); + const emailAuthR1csPath = path.join(buildDir, "email_auth_with_body_parsing_with_qp_encoding.r1cs"); if (!fs.existsSync(emailAuthR1csPath)) { throw new Error(`${emailAuthR1csPath} does not exist.`); diff --git a/packages/circuits/scripts/gen_input.ts b/packages/circuits/scripts/gen_input.ts index 899ea05d..5b8f1501 100644 --- a/packages/circuits/scripts/gen_input.ts +++ b/packages/circuits/scripts/gen_input.ts @@ -8,7 +8,7 @@ import { program } from "commander"; import fs from "fs"; import { promisify } from "util"; -import { genEmailAuthInput } from "../helpers/email_auth"; +import { genEmailCircuitInput } from "../helpers/email_auth"; import path from "path"; const snarkjs = require("snarkjs"); @@ -44,7 +44,7 @@ async function generate() { log("Generating Inputs for:", args); - const circuitInputs = await genEmailAuthInput(args.emailFile, args.accountCode); + const circuitInputs = await genEmailCircuitInput(args.emailFile, args.accountCode); log("\n\nGenerated Inputs:", circuitInputs, "\n\n"); await promisify(fs.writeFile)(args.inputFile, JSON.stringify(circuitInputs, null, 2)); diff --git a/packages/circuits/src/email_auth_with_body_parsing.circom b/packages/circuits/src/email_auth_with_body_parsing.circom index d35db440..cd549a22 100644 --- a/packages/circuits/src/email_auth_with_body_parsing.circom +++ b/packages/circuits/src/email_auth_with_body_parsing.circom @@ -2,4 +2,4 @@ pragma circom 2.1.6; include "./email_auth_template.circom"; -component main = EmailAuthWithBodyParsing(121, 17, 1024, 8192, 605, 0, 0); \ No newline at end of file +component main = EmailAuthWithBodyParsing(121, 17, 1024, 1024, 605, 0, 0); \ No newline at end of file diff --git a/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom b/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom index ec86ce7a..2e651a1b 100644 --- a/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom +++ b/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom @@ -2,4 +2,4 @@ pragma circom 2.1.6; include "./email_auth_template.circom"; -component main = EmailAuthWithBodyParsing(121, 17, 1024, 8192, 605, 0, 1); \ No newline at end of file +component main = EmailAuthWithBodyParsing(121, 17, 1024, 1024, 605, 0, 1); \ No newline at end of file diff --git a/packages/contracts/src/utils/Groth16Verifier.sol b/packages/contracts/src/utils/Groth16Verifier.sol index 2423204a..84d3ced7 100644 --- a/packages/contracts/src/utils/Groth16Verifier.sol +++ b/packages/contracts/src/utils/Groth16Verifier.sol @@ -37,116 +37,116 @@ contract Groth16Verifier { uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 4858829669817347093182793857775974191320149144941367900620918889248420221405; - uint256 constant deltax2 = 2349268651909297333656812175507747333482815372948808934398780108401386690052; - uint256 constant deltay1 = 7694909852690402669806436882407880044159855145256384757904321211496345411627; - uint256 constant deltay2 = 13049872237347108980489027279484885483262009497487624719762629191589932117577; + uint256 constant deltax1 = 520994677997493400810773541476499788644902082984396453075685762761831850120; + uint256 constant deltax2 = 10213897956116323293360574495863850733565743032313310303301962890191828600579; + uint256 constant deltay1 = 7932164237875706492467150825847531456461165832347520966415283522471937964900; + uint256 constant deltay2 = 13933167949481980812622491915190180689983098052228504440538951968850456401091; - uint256 constant IC0x = 4211770379362138903856219862840433796980213258757522697832886980405220081220; - uint256 constant IC0y = 16262585275919937778121864217428161249107463864673038031276191032927839035906; + uint256 constant IC0x = 5535234085311902579901349478459196637795058221120958134445592343488246156733; + uint256 constant IC0y = 5306640240432430234979242614873688760288740315547161616274789884917660992367; - uint256 constant IC1x = 7099677506678218566365066000867791810072476519608078822828837000682196003379; - uint256 constant IC1y = 1769237770256153753400309038867357975549596116377652985313792522430343288331; + uint256 constant IC1x = 10707387490009252629078273089029959904307706408726467155680696001386854048915; + uint256 constant IC1y = 17653533518649258839749460334216534095963029303372459441511113120126665109653; - uint256 constant IC2x = 5989178861683444195999731678542399733494487460212710973544093878608710847435; - uint256 constant IC2y = 10156246898993882066916603426190751095589234851486847103233948255970437390810; + uint256 constant IC2x = 20865571486499188594003814476515099918525806346210086833881258772408663191533; + uint256 constant IC2y = 7888240421702647837386220931474009495401756148617371230939296514314837098271; - uint256 constant IC3x = 8701085534366120999121767803730000480108589548341934333709782694649634498138; - uint256 constant IC3y = 20207904803535365628311317895287771329626458055937586966862287833631465980028; + uint256 constant IC3x = 1912978194609077207430131695891867170745002253126750956906023142956794841865; + uint256 constant IC3y = 17615941814906629303790964184866269246906472609406726939478790210268313990051; - uint256 constant IC4x = 19257046993352497958438805347329633592317088606922904557692449945390128748116; - uint256 constant IC4y = 5642717832394244570923095827287647199707184086427776423070140911486420942150; + uint256 constant IC4x = 15066418251539359853074143581365946179824576559935306245174822608350324474776; + uint256 constant IC4y = 3268372113574542796802111569975146953310662150883456386537997506424333670939; - uint256 constant IC5x = 6604323904530459929048657334218164572603930719021236138541907309311551582537; - uint256 constant IC5y = 667334202447374705138407118596023814372319062185658187750378063436264762785; + uint256 constant IC5x = 16726903819494555062907147643613770035747444680904544904305313872617709937814; + uint256 constant IC5y = 17101225626470597533777593163737774333478931604126018373298094394038436070638; - uint256 constant IC6x = 11535229849645627262504107788901033303442605130322605553360243142789060219891; - uint256 constant IC6y = 1753637515299924092253195578151263987316263848401197118330774620194785401452; + uint256 constant IC6x = 20641928936490067347238549514729636898746687294162031430805590421560903783440; + uint256 constant IC6y = 67121451455228913817899520547955848577485738949760740559721896890970176103; - uint256 constant IC7x = 12498900101086841522232364634108467559129266406240189524513481987584483665932; - uint256 constant IC7y = 6522787544636188304951805297375626750156218692922889853302930148319905013996; + uint256 constant IC7x = 14545357897180104829942737321629647336974601349904876305377785895976088498628; + uint256 constant IC7y = 16314295394308016823245804523460668622871621620058982289202172672703214642909; - uint256 constant IC8x = 4480135903096772346095767872562588741670853664386331507867635466927934834572; - uint256 constant IC8y = 9740988249152422840657218460324840065260226415481576126599811593594715176614; + uint256 constant IC8x = 21739153088746313904366793933727782582174946747904879487285317254557443015329; + uint256 constant IC8y = 3132175803297520185172383705548796916566539464602625887509031362173771022843; - uint256 constant IC9x = 13047200366114718711781016004799503316506956688819476978254555611043342693901; - uint256 constant IC9y = 21327932921959593729230545468282812265758180044612564454867095866299630965437; + uint256 constant IC9x = 20333233803298528081912583132659619517672056679176472634300802350468027326361; + uint256 constant IC9y = 6238837794343377502421946404928002513039151091738403488064287245988205748593; - uint256 constant IC10x = 11376960835268614350741468735798253461118575948160086341424615959754701304513; - uint256 constant IC10y = 15597725160474274737554011477863236677670609244381748129499328040573769169072; + uint256 constant IC10x = 16418874123357333544592669082833232850459535832174384729993255430764462500486; + uint256 constant IC10y = 21771971202968985066744191573424980335377073332855742387685123535002522571529; - uint256 constant IC11x = 11897676789685363392905629453099957141626538123954346927380010313347510977576; - uint256 constant IC11y = 14976898926642513604420099948648410196260761766527012733905356150374916695226; + uint256 constant IC11x = 19451975215864606845692411747435064359921385769371233821650301822958164252383; + uint256 constant IC11y = 20892514595722901078388943250566322962503399436888984708776669059327181439790; - uint256 constant IC12x = 10705479672629199296499184819365013568112407645583263601648436909575260989231; - uint256 constant IC12y = 12390312497516174890706591689640434215359848536333797411488857638700234635063; + uint256 constant IC12x = 7890932830092388862341624941690789312256479754725115142819338325966740669428; + uint256 constant IC12y = 4418832493543398820840947134519317894746836913806654901909239755962388809991; - uint256 constant IC13x = 10425206092609858366454385791401502105148449847917106110284639721308273423342; - uint256 constant IC13y = 18242461427611975897422440915025510015679040781015534582773251010854996692185; + uint256 constant IC13x = 8199473712814016100135467002253188985688335051507321176911775440880532334952; + uint256 constant IC13y = 15997818842062211202600134971063758566999644777722172606469491329666812258276; - uint256 constant IC14x = 11621088052698567148182208253169607392578076249553939761613628597015195444595; - uint256 constant IC14y = 15119973346566563544001441321483642551077279944021367457728450526874312644840; + uint256 constant IC14x = 12137522381148387733238329761055359894311504591070198713455315089652636842402; + uint256 constant IC14y = 21339188004338495042416918774038965889032101950904198621697204175535425843091; - uint256 constant IC15x = 3694989447959615271598638846469075742941537980300757012006599339224930036765; - uint256 constant IC15y = 487178526024236410205400392361688163591688252491455525243046863091215985874; + uint256 constant IC15x = 20499263784776697905943622542054972660913496529317877469532325036659142860841; + uint256 constant IC15y = 11428736355199483131940447330380125032711949052439215155046658645463458617674; - uint256 constant IC16x = 16669637139480556591463812569837271645339702458271203139378127750199663899786; - uint256 constant IC16y = 11468847616135016970306428034890939119283893821736516621097778930694598034368; + uint256 constant IC16x = 5754299204496299424940297228286983528858894010778459654161035126221861884425; + uint256 constant IC16y = 184143361306450555375946116665530361251584344793605929804900169497536069657; - uint256 constant IC17x = 20646878988470168748773935413431912831865041056289307593368304388393650557271; - uint256 constant IC17y = 827193114932801528520304378867896633328368580526375365335905841178073708646; + uint256 constant IC17x = 6863685095405518858940222663610976520118803865048723755871419028593531099958; + uint256 constant IC17y = 18102099448859799403953336894017457656590279241400870825068223761138751757204; - uint256 constant IC18x = 4577222939682608116020745394835385625247892951593517505220683292410177815398; - uint256 constant IC18y = 10765337574159612429579250364168682791985126973462157564626769410830366049552; + uint256 constant IC18x = 11617180898926442769507234462139371394680677212983320064407531026440672878535; + uint256 constant IC18y = 4231987035195694511291113860396316866846277265956849978459149363401736899419; - uint256 constant IC19x = 16900579915364382782288431773098063012424588757284168821410602152939194020713; - uint256 constant IC19y = 11738154656092524268428495125430473218851117159241760691134137578260179802880; + uint256 constant IC19x = 6338405922510297847509581085618085787266710988385331069423772530751893351108; + uint256 constant IC19y = 2369188132617549234166848605509335807620667833570812871717711881712251941471; - uint256 constant IC20x = 11996832114473654168748629667567805718029100992596193520375384097594749180474; - uint256 constant IC20y = 12197415893184205400832380386631571921646216686696514881148128824205876592633; + uint256 constant IC20x = 6534724304493884898998457959752744402731711456639277994605971968266824841921; + uint256 constant IC20y = 3616930696544290755224333216672259977980824937811778199173736509869170686624; - uint256 constant IC21x = 15435816395263292431589577655854586379711723538286423592496598199352674678507; - uint256 constant IC21y = 3956826533992471850057897747896273349387738205446854556285072199021656279013; + uint256 constant IC21x = 18296109485859597664201013922077450611537275721380521453297622562810889903055; + uint256 constant IC21y = 3895545879384074505865915948837152152498358964611960941429309095904181030693; - uint256 constant IC22x = 2369786813850488318339333825292479727059461567046452298062937914114006512850; - uint256 constant IC22y = 8702809128002581488065613436002218443246042081672702355390958016356405185715; + uint256 constant IC22x = 12343813894528681582898501974195928908758133920463632788058140152731464749914; + uint256 constant IC22y = 21505758529614139837798769683411075306857597005036383220173003789253857347751; - uint256 constant IC23x = 12544917895975488002718979866746556718640527177184601331286778090675734160803; - uint256 constant IC23y = 20762606037448349006426374611439470865657289814864923932382439595956154228516; + uint256 constant IC23x = 16230461810715823239242025482008567032302510218301798998030587563164759203923; + uint256 constant IC23y = 1994949152609869198152052650904921912838643069265165983919780834335733459441; - uint256 constant IC24x = 18070509509074045298484741399301403321599290579411825491326589798309140657770; - uint256 constant IC24y = 14908226954766198674998803772409345388914316691588832258957223752963822069525; + uint256 constant IC24x = 373995982353912590050571385234870501485812926774804412495284185340492728591; + uint256 constant IC24y = 4424414072575513799911234230042788376840811362954861538886070866583770853757; - uint256 constant IC25x = 1455377095269715554036588252557915396492615334772309291658268748963880447163; - uint256 constant IC25y = 21695770302288876875103069192766492099443844872634715589406822596784910309225; + uint256 constant IC25x = 73053181031153871276946499443822334078747902352960726679539712950424139587; + uint256 constant IC25y = 1540570167066699022838327597833448980761202822749917678465275227142577692420; - uint256 constant IC26x = 18613219484310502521758988950271293547469078219382742873978803855363453705478; - uint256 constant IC26y = 7419340280200382320924952279013159868401557816307192454458858038789820660463; + uint256 constant IC26x = 19743666564083954842724375605301868007217803605683850153936265256536005058028; + uint256 constant IC26y = 17989815625617579036436769970865806048561975460718195347202285390279820435349; - uint256 constant IC27x = 18221722127089340543801871525007420346953045418995248323716795830848226217684; - uint256 constant IC27y = 4518866934267970863421444289696546796417801156895763030898263144973675489073; + uint256 constant IC27x = 8021544724659208314956854536191758170410161794829262652377062879718582077619; + uint256 constant IC27y = 11242343205078067027061957056593092382351538151124811098324850161004134673555; - uint256 constant IC28x = 8713740537842015757942886815311011147495846836132469742940507937777153910750; - uint256 constant IC28y = 507759461462870120720184674526204638315084668933834919940607138736119655185; + uint256 constant IC28x = 3078234746564587714000443808454353377587938001919200323959521327347201776344; + uint256 constant IC28y = 2745006783235117142840024866060647109576786923760899534870847030757937709480; - uint256 constant IC29x = 283302323093706523579313567957122665840911228396951676438535928093564133804; - uint256 constant IC29y = 1681450395436167902493762433691773009029447527073836310022859931574279357369; + uint256 constant IC29x = 5964844476592478242407630507799027172948004079052748175556332403023505609276; + uint256 constant IC29y = 12768841436519508981792953013446512028720534352691237119399120037998541137224; - uint256 constant IC30x = 16950838007218899572417821069113886241538367930894435961520140881634945913229; - uint256 constant IC30y = 10410906553155915588034406693304643554694784994338863360414506234348420922348; + uint256 constant IC30x = 15371609663317589294806761513526368989695520686639615266578243336031459611909; + uint256 constant IC30y = 16994646314587748959724789317702812017993403087486552388242926535433658915883; - uint256 constant IC31x = 15417816420600085986651328121013448812960638931149808993527680134568703989148; - uint256 constant IC31y = 9484856347328911531029755263457734804606312906741899150934772578024062114576; + uint256 constant IC31x = 6683739596768676873248624858087923536398042926812221220245863544486923422711; + uint256 constant IC31y = 12457051898274801033654726559510059327583138828424088437950360209133530872938; - uint256 constant IC32x = 11858766527829566429424160488629201945623249625611951541306072004276901038428; - uint256 constant IC32y = 4007102117738373297633201497667781324069297849570621583473924119854284231236; + uint256 constant IC32x = 12960094561130886505165854876806731618571707898820633243029947918452735526807; + uint256 constant IC32y = 6820833146511263887962056926524443259150994889983748875463240028627107473405; - uint256 constant IC33x = 12559118066557596997926577412374612657226056310267908347444905822043727890778; - uint256 constant IC33y = 2553701655642396735890628014783420975893274653453737050745275619913519841358; + uint256 constant IC33x = 996044632338712992107340240713239518089208404641712342335139731510181571935; + uint256 constant IC33y = 273204942495896233059800495345764298864994985906625498267135262620807809339; - uint256 constant IC34x = 16444904695757501831607070919219388667670309184517024943507682426550207959491; - uint256 constant IC34y = 5427016083642355586995705553257426712615569886823313935372042927851221733966; + uint256 constant IC34x = 1813777432174456228797740790983800618055554859202869474902366329763076454717; + uint256 constant IC34y = 18263062241351175416183473322099225631153099284041729083414647404711496873274; // Memory data From 648720ab84bb041fd479079f2e4983543a3f52bf Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Fri, 6 Sep 2024 18:50:38 +0900 Subject: [PATCH 030/121] Fixing integration test --- packages/circuits/scripts/gen_input.ts | 49 ++++++++++++++++++----- packages/contracts/test/Integration.t.sol | 18 ++++----- 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/packages/circuits/scripts/gen_input.ts b/packages/circuits/scripts/gen_input.ts index 5b8f1501..4ade8349 100644 --- a/packages/circuits/scripts/gen_input.ts +++ b/packages/circuits/scripts/gen_input.ts @@ -26,6 +26,7 @@ program "Path of a json file to write the generated input" ) .option("--silent", "No console logs") + .option("--body", "Enable body parsing") .option("--prove", "Also generate proof"); program.parse(); @@ -42,21 +43,47 @@ async function generate() { throw new Error("--input file path arg must end with .json"); } - log("Generating Inputs for:", args); + if (!args.body) { + log("Generating Inputs for:", args); - const circuitInputs = await genEmailCircuitInput(args.emailFile, args.accountCode); - log("\n\nGenerated Inputs:", circuitInputs, "\n\n"); + const circuitInputs = await genEmailCircuitInput(args.emailFile, args.accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true + }); + log("\n\nGenerated Inputs:", circuitInputs, "\n\n"); - await promisify(fs.writeFile)(args.inputFile, JSON.stringify(circuitInputs, null, 2)); + await promisify(fs.writeFile)(args.inputFile, JSON.stringify(circuitInputs, null, 2)); - log("Inputs written to", args.inputFile); + log("Inputs written to", args.inputFile); - if (args.prove) { - const dir = path.dirname(args.inputFile); - const { proof, publicSignals } = await snarkjs.groth16.fullProve(circuitInputs, path.join(dir, "email_auth.wasm"), path.join(dir, "email_auth.zkey"), console); - await promisify(fs.writeFile)(path.join(dir, "email_auth_proof.json"), JSON.stringify(proof, null, 2)); - await promisify(fs.writeFile)(path.join(dir, "email_auth_public.json"), JSON.stringify(publicSignals, null, 2)); - log("✓ Proof for email auth circuit generated"); + if (args.prove) { + const dir = path.dirname(args.inputFile); + const { proof, publicSignals } = await snarkjs.groth16.fullProve(circuitInputs, path.join(dir, "email_auth.wasm"), path.join(dir, "email_auth.zkey"), console); + await promisify(fs.writeFile)(path.join(dir, "email_auth_proof.json"), JSON.stringify(proof, null, 2)); + await promisify(fs.writeFile)(path.join(dir, "email_auth_public.json"), JSON.stringify(publicSignals, null, 2)); + log("✓ Proof for email auth circuit generated"); + } + } else { + log("Generating Inputs for:", args); + + const { subject_idx, ...circuitInputs } = await genEmailCircuitInput(args.emailFile, args.accountCode, { + maxHeaderLength: 1024, + maxBodyLength: 1024, + ignoreBodyHashCheck: false, + }); + log("\n\nGenerated Inputs:", circuitInputs, "\n\n"); + + await promisify(fs.writeFile)(args.inputFile, JSON.stringify(circuitInputs, null, 2)); + + log("Inputs written to", args.inputFile); + + if (args.prove) { + const dir = path.dirname(args.inputFile); + const { proof, publicSignals } = await snarkjs.groth16.fullProve(circuitInputs, path.join(dir, "email_auth_with_body_parsing_with_qp_encoding.wasm"), path.join(dir, "email_auth_with_body_parsing_with_qp_encoding.zkey"), console); + await promisify(fs.writeFile)(path.join(dir, "email_auth_with_body_parsing_with_qp_encoding_proof.json"), JSON.stringify(proof, null, 2)); + await promisify(fs.writeFile)(path.join(dir, "email_auth_with_body_parsing_with_qp_encoding_public.json"), JSON.stringify(publicSignals, null, 2)); + log("✓ Proof for email auth circuit generated"); + } } process.exit(0); } diff --git a/packages/contracts/test/Integration.t.sol b/packages/contracts/test/Integration.t.sol index f02f3a91..35ca040d 100644 --- a/packages/contracts/test/Integration.t.sol +++ b/packages/contracts/test/Integration.t.sol @@ -149,7 +149,7 @@ contract IntegrationTest is Test { } else { assertEq( address(simpleWallet), - 0x18ABd76E471dB6a75A307bf4dD53ceA89A975B1A + 0x0C06688e61C06466E2a5C6fE4E15c359260a33f3 ); } address simpleWalletOwner = simpleWallet.owner(); @@ -172,7 +172,7 @@ contract IntegrationTest is Test { string memory publicInputFile = vm.readFile( string.concat( vm.projectRoot(), - "/test/build_integration/email_auth_public.json" + "/test/build_integration/email_auth_with_body_parsing_with_qp_encoding_public.json" ) ); string[] memory pubSignals = abi.decode( @@ -189,7 +189,7 @@ contract IntegrationTest is Test { .maskedSubject = "Accept guardian request for 0x05A78D3dB903a58B5FA373E07e5044B95B12aec4"; } else { emailProof - .maskedSubject = "Accept guardian request for 0x18ABd76E471dB6a75A307bf4dD53ceA89A975B1A"; + .maskedSubject = "Accept guardian request for 0x0C06688e61C06466E2a5C6fE4E15c359260a33f3"; } emailProof.emailNullifier = bytes32(vm.parseUint(pubSignals[10])); emailProof.accountSalt = bytes32(vm.parseUint(pubSignals[32])); @@ -198,7 +198,7 @@ contract IntegrationTest is Test { emailProof.proof = proofToBytes( string.concat( vm.projectRoot(), - "/test/build_integration/email_auth_proof.json" + "/test/build_integration/email_auth_with_body_parsing_with_qp_encoding_proof.json" ) ); @@ -259,7 +259,7 @@ contract IntegrationTest is Test { publicInputFile = vm.readFile( string.concat( vm.projectRoot(), - "/test/build_integration/email_auth_public.json" + "/test/build_integration/email_auth_with_body_parsing_with_qp_encoding_public.json" ) ); pubSignals = abi.decode(vm.parseJson(publicInputFile), (string[])); @@ -268,14 +268,14 @@ contract IntegrationTest is Test { emailProof.domainName = "gmail.com"; emailProof.publicKeyHash = bytes32(vm.parseUint(pubSignals[9])); emailProof.timestamp = vm.parseUint(pubSignals[11]); - + // 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 is account 9 if (isZksync) { emailProof - .maskedSubject = "Set the new signer of 0x05A78D3dB903a58B5FA373E07e5044B95B12aec4 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; + .maskedSubject = "Set the new signer of 0x05A78D3dB903a58B5FA373E07e5044B95B12aec4 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; } else { emailProof - .maskedSubject = "Set the new signer of 0x18ABd76E471dB6a75A307bf4dD53ceA89A975B1A to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; + .maskedSubject = "Set the new signer of 0x0C06688e61C06466E2a5C6fE4E15c359260a33f3 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; } emailProof.emailNullifier = bytes32(vm.parseUint(pubSignals[10])); @@ -288,7 +288,7 @@ contract IntegrationTest is Test { emailProof.proof = proofToBytes( string.concat( vm.projectRoot(), - "/test/build_integration/email_auth_proof.json" + "/test/build_integration/email_auth_with_body_parsing_with_qp_encoding_proof.json" ) ); From 703ce4edd248b2ab77c3a5b1027f99f74c5037a8 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Fri, 6 Sep 2024 22:47:51 +0900 Subject: [PATCH 031/121] Update emails for integration tests --- packages/circuits/scripts/gen_input.ts | 2 + .../contracts/test/emails/8453/accept.eml | 154 ++++++++++-------- .../contracts/test/emails/8453/recovery.eml | 151 +++++++++-------- 3 files changed, 165 insertions(+), 142 deletions(-) diff --git a/packages/circuits/scripts/gen_input.ts b/packages/circuits/scripts/gen_input.ts index 4ade8349..2135d56e 100644 --- a/packages/circuits/scripts/gen_input.ts +++ b/packages/circuits/scripts/gen_input.ts @@ -70,7 +70,9 @@ async function generate() { maxHeaderLength: 1024, maxBodyLength: 1024, ignoreBodyHashCheck: false, + // shaPrecomputeSelector: '(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?"(=\r\n)?[^"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^"]*(=\r\n)?"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?([^<>/]+)(<(=\r\n)?/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>(=\r\n)?)' }); + console.log(circuitInputs.padded_body.length); log("\n\nGenerated Inputs:", circuitInputs, "\n\n"); await promisify(fs.writeFile)(args.inputFile, JSON.stringify(circuitInputs, null, 2)); diff --git a/packages/contracts/test/emails/8453/accept.eml b/packages/contracts/test/emails/8453/accept.eml index b375f312..d0999703 100644 --- a/packages/contracts/test/emails/8453/accept.eml +++ b/packages/contracts/test/emails/8453/accept.eml @@ -1,90 +1,102 @@ -Delivered-To: rrelayerbob@gmail.com -Received: by 2002:a50:45c6:0:b0:264:9270:cc66 with SMTP id c6csp1350796ecu; - Mon, 12 Aug 2024 08:29:00 -0700 (PDT) -X-Received: by 2002:a05:6214:5701:b0:6bd:699c:59a with SMTP id 6a1803df08f44-6bf4f77408cmr8835936d6.19.1723476540630; - Mon, 12 Aug 2024 08:29:00 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1723476540; cv=none; +Delivered-To: suegamisora@gmail.com +Received: by 2002:a05:7011:c08e:b0:3e7:b7d5:224d with SMTP id jk14csp176375mdc; + Fri, 6 Sep 2024 06:22:18 -0700 (PDT) +X-Received: by 2002:a05:6a21:e8c:b0:1ce:d125:f8ef with SMTP id adf61e73a8af0-1ced125fa1dmr22928965637.51.1725628938102; + Fri, 06 Sep 2024 06:22:18 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725628938; cv=none; d=google.com; s=arc-20160816; - b=XdhAnSyVPNhLrcDkiFa14s5Ye+7nIVIoAZBrqep75GixiY6xhliTD29zzw41KvPHsQ - I9ZFk4IdAkNtD2PjJQ4urzKkvzU+S42rzKZCU8/91LvIoJbcUHMpQCuySQTGI+v8zDQc - DRsfTo1Gv2QmOkZhjb7kjgLh/ps7hn0BYXKru1JQToe55qfcFQ8HWWQo6CwLphwFhI+0 - 6c6aRCEcXDymNNYFMEOn8C/mKcvhs5gzSSwktfEZISHLYfAjz3mHP1h3sTnrN3TnfjGP - win5ATBLMi+5eVyKl6gN8ZYn0SwoIX86iK3GrfNcbJsO85rHD+MNzXjfvDzjI20Uq+F7 - aeEA== + b=C0Uiaaz8s45V/DXrIf+eFa4AWhHTg5mCaWt9mHGH2ha/Mf9T3mOjAfXQupd3v9o4uZ + nM//fJTtwnrJqSJyy2A9gFRBB/MoT5hglqI8eaQWtb1uXeeXyEBT9JH3N24nN6YO03e4 + Bn+ZI2Z+yLKrQL6Dh6Qswk8FSylsNTIbyKwXof/UorI/izBx20713GSa30Bus45Dm3nn + GqcqjJ5M6JHbfd4qvAZbjNV8DmbFkJ8+qWRuLN44Pd28B4iy3ItexEuM9vRYjeCLhpoG + 3voeOq9PZnAEuDonth7nYHkPWXXGCInenlCpmfetxWa7iKmjiSTn3MkeV9wqI/1e/i8j + ztvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; - h=to:subject:message-id:date:from:mime-version:dkim-signature; - bh=Ha/3DDJ/u01tNH7woB7N10UkCTfbfA/y6SNGNbQZrno=; - fh=OYPr0JdXtRRlM3Htj/E6+khbD9huvtdqkRTmPoW0wko=; - b=mlpmuieLw84UB2iPZrDZeTHtIjSLX2bFQ7uVjcuSqdCeT0Ra8rKHub22VqEDagz6Hh - iQ0OTqs1Pytijcw0g1sHn0O3fw6sQZRTXDRkqtnct6HH5drcJGkd4jjpr9Pym1CQaxnC - SRL48K32C0g/zTL9uCXAWe+qBRlMYd02xg3JLsqBR3PvG2ADLFCnKLnTVudOTc8QUNAQ - hK8xa7nN47mIPV+2p2kv00aJmusOGc4UmDlfafYP5+t6KqJJ1abySEfEu6UQtsc+9boS - RAzuxHHgc4jiEpSakQciy4BKFA3DGJsua8fcIgEy1pnDCCfdqVfgeDpuoqsXE4YsRGcr - pO/A==; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=U/hETzVqi/RggWbN6N7AaudJ+V7s62JjqcrItueD+SE=; + fh=r9ZW45D/4i7BIl/4UeFGrkYKwbplztqhOVKfbV+WD3I=; + b=RTSYWdGdudJMP0NxrGFgLGVbFLNFjIEL4VPVdyD4hU7Kg25XSPOwMusUrVZLZj1Ci2 + hGyjpt2BlLveWpZCfbgTFr+8HfktTW+sGeyyRD6KaF7sLsxHBowYgyXGKZEz+ivdJtpK + +nXCHVDc3WvWkrsJNk/9JPS/AMusv8ur5gYBwC9e7zxrozaHiuPO9OPU2iGMT8ZJ2T02 + p/HABL627ar6r2jZxYWCXwyidYvhvz6e9NphTM5GMXtKixOH0+qMFXq0TmRdFZtnzOKF + L93aSnigdJIGAuNEIFKqb8C1HFsZhv2mQx4UdFE9Duar/tdJ8R4itvBVC6hH9tEq2cnc + Xd0w==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=kIs11UJs; - spf=pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emailwalletrelayer987@gmail.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=Zn5YD8bw; + spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com -Return-Path: +Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id 6a1803df08f44-6bd82e687b4sor32101386d6.6.2024.08.12.08.29.00 - for + by mx.google.com with SMTPS id d2e1a72fcca58-718816aabbasor1473227b3a.5.2024.09.06.06.22.17 + for (Google Transport Security); - Mon, 12 Aug 2024 08:29:00 -0700 (PDT) -Received-SPF: pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; + Fri, 06 Sep 2024 06:22:18 -0700 (PDT) +Received-SPF: pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=kIs11UJs; - spf=pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emailwalletrelayer987@gmail.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=Zn5YD8bw; + spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1723476540; x=1724081340; dara=google.com; - h=to:subject:message-id:date:from:mime-version:from:to:cc:subject + d=gmail.com; s=20230601; t=1725628937; x=1726233737; dara=google.com; + h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=Ha/3DDJ/u01tNH7woB7N10UkCTfbfA/y6SNGNbQZrno=; - b=kIs11UJsGxLHYsxuMHUikbfKz4X+t4+pdLy8iy6luM0zplvFe24BecDYmohTiFPgLd - ydSOkbBiMJrfsCLqSQSL+La690rsmJz3hH2vWpXHCTxtq9IkOn539mD44EPyI0rpY2pX - +B8V5ppvlYb+PYVyEe1oKtdAw/9U3xgwF0FbBZOsXY9pcXlWe3LCkLHJHsnFThJqO4At - ZEmqakxkwBog3szCj+zStNc2TQKHfgTAIJ0IiC1Qcri8xHw9MZ9t7l8N7f2krGxg/i4q - mH+m5LgHwKiymhpRYpPh4pbXViyJt0ZPX+u8hVNYCu9fuTDw91FZ0h62kQCJU1Fo0gqn - CejQ== + bh=U/hETzVqi/RggWbN6N7AaudJ+V7s62JjqcrItueD+SE=; + b=Zn5YD8bwElKAckg4neNi2kXp1b3X7smPAWqq/Oq1xUlLjJpQtb9SE/3wF1X68Rm8Lf + hf5A3ELJ8nPRugtVtSRCSuMf4o8ULe65HNotlQbtsc0INdDXNBlWJNDnDwqbu+27t0uJ + y8sLbEuqgGF4TNnQJZMJ8vUJZ8qVoh0UXOa6ZWQjqmndohpwxNlTJ41hPKfeOw181GqT + Nq4Am6ag4IlZk7lsgAaWvULEbkAsMoQjk4kYX66WuafTbPjQGQ9il/+aPytPWrRX2/eW + gbgyHpCOV9qMovdPAx3NBWWHzW+6XRHdpt2jPLJR0BUIeQHFMaKg3rcguyzETk9qc2Ah + 4MRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1723476540; x=1724081340; - h=to:subject:message-id:date:from:mime-version:x-gm-message-state + d=1e100.net; s=20230601; t=1725628937; x=1726233737; + h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=Ha/3DDJ/u01tNH7woB7N10UkCTfbfA/y6SNGNbQZrno=; - b=dCAoi7QTorFaGLllgUbFtLy7SwjjfbmLv2b90AOFzOTDJwxKWuZcuRvIXtn+mNbkxr - R3DSQOVI4kyPn83avG5kJK9rQebgdluW8kRSqTTBGsewDkVoU++XlaH/5Fr4AycL+Jz2 - M4H29ErGv5YwfZVkVNchNrZ1wm9PzNmZDryNWfN8MVBSvCyz5rEzbSZYwfPKJ8jdNSpd - m5I4NQn0yaceCbnOvS+ymdLUfH/xsTUiDb12p5mFH1okiffoIH2kba51TERTFQ1cAXhT - 6x4oGqDLZ48Wa17J+Pebx22E4kc+qoT44rFbzLKx18UK7QvcDVY84a2rvDK/aHdl89nA - MFcA== -X-Gm-Message-State: AOJu0YxdgZ1gX+YYHJudxoob+1wT6ocah5PIbcqwrkCPA/V6E4p26Ebe - G3qU3UnP4g7Rw60WEroicxfHPklu7dQf0EY42VdDJY7ovlqVUmkTCk8otd8Qag0iY+gMCiaP/ab - 5oga2YGGxnm+5Z/FtzkFsnJunAyXQ -X-Google-Smtp-Source: AGHT+IGkhUwt1MpumPRZRv36hsu/nmBtHu3hbsTgn0LxixNgewuPT/XesalvK0ODiL5JhlA73CIktfloJw2rJAZnXDI= -X-Received: by 2002:a05:6214:4906:b0:6b0:6ad8:ebd8 with SMTP id - 6a1803df08f44-6bf4f644182mr6446666d6.7.1723476539846; Mon, 12 Aug 2024 - 08:28:59 -0700 (PDT) + bh=U/hETzVqi/RggWbN6N7AaudJ+V7s62JjqcrItueD+SE=; + b=G6GBE4hN7llTSkiuOBoxhrEngL5wkI4ueW8jdPaDU95H0oZTDM6JLAXnRQImvhtU0w + slkuBX/GeRu8S13I0zb+OoatYgIIKelJc4A2KlT/P4gL+4jIJ6AqKpJJRKLuHyXk/JOH + U5X7HYOff95ZgjNhKU5fGt4hGxmrsFT6YbD4+EqkyOSCqIGcsDK3IuiwY+3pKWJoqGJv + UHuMmHTnttx0bByfrxyEMsSoBtokafkxVyBTeB3pm2/ROEbBf1DbfnQUrkVKaZea49tU + q8XOL8iGQHa2ryJQEIe75FtX80rtIYSrx+fmVuSmkTU/qEzOXyERWsaRovKw2hTyF1+m + i3iQ== +X-Gm-Message-State: AOJu0Yx3lbc0RipKC+OMeuNv8FIPDUwGpfPoIeB6Vr1arRKhB8A4F2M9 + 1MaG/v5US/X9/i66lFjWmRHFRPzh6UPt2UxSj5mvLwuYkGQrmYJEpQS3pg== +X-Google-Smtp-Source: AGHT+IHOoL6WU+9j0Nj9M5rytPIYrSUIFFYhKdyafbbrZrRUrbeYMT+b4sNoZe4+99M+t90YuA2pCw== +X-Received: by 2002:a05:6a20:d80b:b0:1ca:ccd0:1bf6 with SMTP id adf61e73a8af0-1cce0ffe3cemr28636292637.8.1725628937058; + Fri, 06 Sep 2024 06:22:17 -0700 (PDT) +Return-Path: +Received: from SoraMacBook-4.local ([86.48.13.220]) + by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-718295770a4sm1560089b3a.214.2024.09.06.06.22.15 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Fri, 06 Sep 2024 06:22:16 -0700 (PDT) +Message-ID: <66db0208.050a0220.1a717f.5b19@mx.google.com> +Date: Fri, 06 Sep 2024 06:22:16 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============8229076081096717965==" MIME-Version: 1.0 -From: "emailwallet.relayer.2" -Date: Tue, 13 Aug 2024 00:28:48 +0900 -Message-ID: -Subject: Accept guardian request for 0x18ABd76E471dB6a75A307bf4dD53ceA89A975B1A - Code 1162ebff40918afe5305e68396f0283eb675901d0387f97d21928d423aaa0b54 -To: rrelayerbob@gmail.com -Content-Type: multipart/alternative; boundary="000000000000efbca3061f7e2677" +From: emaiwallet.alice@gmail.com +To: suegamisora@gmail.com +Subject: Email Account Recovery Test1 ---000000000000efbca3061f7e2677 -Content-Type: text/plain; charset="UTF-8" - - - ---000000000000efbca3061f7e2677 -Content-Type: text/html; charset="UTF-8" +--===============8229076081096717965== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 -

---000000000000efbca3061f7e2677-- + + +

Hello!

+

This is a test email with a basic HTML body.

+
+
Accept guardian request for 0x0C06688e61C06466E= +2a5C6fE4E15c359260a33f3 Code 1162ebff40918afe5305e68396f0283eb675901d0387f9= +7d21928d423aaa0b54
+
+ + + =20 +--===============8229076081096717965==-- diff --git a/packages/contracts/test/emails/8453/recovery.eml b/packages/contracts/test/emails/8453/recovery.eml index 863f6dc3..9de65414 100644 --- a/packages/contracts/test/emails/8453/recovery.eml +++ b/packages/contracts/test/emails/8453/recovery.eml @@ -1,90 +1,99 @@ -Delivered-To: rrelayerbob@gmail.com -Received: by 2002:a50:45c6:0:b0:264:9270:cc66 with SMTP id c6csp1352251ecu; - Mon, 12 Aug 2024 08:31:27 -0700 (PDT) -X-Received: by 2002:a05:6830:4408:b0:70c:92ee:5662 with SMTP id 46e09a7af769-70c9387b99amr648568a34.8.1723476687515; - Mon, 12 Aug 2024 08:31:27 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1723476687; cv=none; +Delivered-To: suegamisora@gmail.com +Received: by 2002:a05:7011:c08e:b0:3e7:b7d5:224d with SMTP id jk14csp159606mdc; + Fri, 6 Sep 2024 05:58:53 -0700 (PDT) +X-Received: by 2002:a17:90a:f493:b0:2da:5edd:c165 with SMTP id 98e67ed59e1d1-2dad50e8866mr2983558a91.30.1725627533524; + Fri, 06 Sep 2024 05:58:53 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725627533; cv=none; d=google.com; s=arc-20160816; - b=xyFntJJHcC6779isyMw1J3xYUdUTrZj6/MD+AekQSj09itt/i+0IEe/XFInOCFPtfC - igMeUXTqS8Thl3QFJzG7sxCMmxZy2/0WHllfJIEXBH+sX9lt/yh9eYc8Feqa+7c2fZB7 - qM5Rks4YQgxQY0clMnABdbLtR/tZt491WjLlUCKXn5tzdJjxmUUm/ttQIc6bJ/YwRRH3 - aBSRPeOMk4vbZ2sNpMbqYBWnVWx4t3xV2CREHYYxR69lWgOvGnYu77K55b0UEwxbJfaI - QN1Q1A3ianXG3ueN59RblMwEZ4ZwMtuKcJGXSEEqi1jaFU5DAD2EJ96jO3/XAeH900SA - 8A/w== + b=CvcfzEez2XqfdAi1gSNVDsai5L+eC45M1Tm1J7LpbY9DmL2hPIz9iMw2SnI9OcuJrz + 6AV396u3AFrEIe4+TvNh0zWKtfshZ5e9qMfy4MkHs4NOgOWjlIfxsMGuFBLKZRgz1rB1 + lETbcuSgKU2rbeBf6bVObOyDspkx0SC5l5pVjD7ZeFLtqSmV/4VSJ1sHFGOJO57hTQdk + w1jbgPK0Kqtnkn7G3/YWKMAQNLLuI/FicFXaKxZ0anNTqHLilLTPANaPowXR37ADB8sV + eNGpA6H3x/xOHIOIGyg9K/3JKYBVeIp5qftBx4ZP5kJi2O1HM2gDZV5inNLznf+emGBf + tgCw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; - h=to:subject:message-id:date:from:mime-version:dkim-signature; - bh=8AoOgkh5aveFE/RKYa/E9QhApLnE3oSdwb+kORlfNsE=; - fh=OYPr0JdXtRRlM3Htj/E6+khbD9huvtdqkRTmPoW0wko=; - b=vR60Lc7tUDCe6GlR1SaaaWoAOGTdwNgkMnWjgKAGE9WpB74aE3EQtjogiEZ+tRxYub - 9RyptryjBvulXUfCmr6+YyBKUkQl9mGBNSGIP+JsmTeIC9UA/KN3kcrxG6zSHvbCjb5y - 7hXv0VM+ZQStzE8OBcliGaEqZ7NMDVSCBi/WuJ1cHkrGkQ+EcNA4RyzG1mx3iXmTyiro - WKp6c7Wt+t3tSxHM+INFVtu66IZw+Sygh3RE4nxMZlJDufoskGODe3Q2eb2jDEHjXs0k - TOJnmu6jun3rwnSN4BT8s12h/2s8Q+NUQRsWd+jbDxzSPtbrV8ovR2tC/QhcgwfKlPC0 - LfFA==; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=DrlIDYFXq4Xkunvl9Rd7BT+pP8lPrin0oJpm7SItjZY=; + fh=r9ZW45D/4i7BIl/4UeFGrkYKwbplztqhOVKfbV+WD3I=; + b=pVSNnwsGkeSF82EogR6UzUtP9/G7I2lBWnfcwxdqxWXGb38PGsiu6BQspNcj4DgqiY + e614p4rGjiTfPNyxtlLPhA5UsL6aX5RlG0JxPz79Dev3u4n92M0a/ExJcWFw+DwQAwZq + lL0xGIv2jbl2Ypn4oRJraxqknNoB8J69G8cud6PF4z2gM9WpvGMWb2CU+7b8W2aFpKj/ + RdUDMmzXJs7bnLePY8idFjdcJgSaeAusYuDXr8tRlDgxD2VJaGT8j4TaT70NZFr3yzw8 + emmMItgsWiYsL6IxopzwN7xM5Wzkx+dUZAZNnL7ZLgg0odoIGzI4KcB9OyaP3n4XgJQJ + XZJQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=gKy07eeB; - spf=pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emailwalletrelayer987@gmail.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=ZIADuFKw; + spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com -Return-Path: +Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id 46e09a7af769-70c7b81de58sor2626987a34.8.2024.08.12.08.31.27 - for + by mx.google.com with SMTPS id 98e67ed59e1d1-2d881a867f0sor6191671a91.3.2024.09.06.05.58.53 + for (Google Transport Security); - Mon, 12 Aug 2024 08:31:27 -0700 (PDT) -Received-SPF: pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; + Fri, 06 Sep 2024 05:58:53 -0700 (PDT) +Received-SPF: pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=gKy07eeB; - spf=pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emailwalletrelayer987@gmail.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=ZIADuFKw; + spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1723476687; x=1724081487; dara=google.com; - h=to:subject:message-id:date:from:mime-version:from:to:cc:subject + d=gmail.com; s=20230601; t=1725627533; x=1726232333; dara=google.com; + h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=8AoOgkh5aveFE/RKYa/E9QhApLnE3oSdwb+kORlfNsE=; - b=gKy07eeB8zGt9GomoXrr52dA1L7KPoEumb8M29aBNkLnOzQUlc0rcNrUvpIn8DJIFu - 1Yu+MHQ5+zvkXRoQ/Ll/oxWJmNWUWraM4dxGzuSN6Bxm34dto33ud2LlrdGYHpbLIofW - WVrs8/FHVxuXPXn3c8MNmNrP92pPLZY/Snt0ZJN7wbEo5dWn/dGcSTwoyRiD35OiGs0+ - HmJvfuXKfTMrU3R+Xkr5HJ/GBWRB/jZ6e9bcxgydHpS86O/NEY5hu8XQqMBrYZ5uldrg - tO1yLvvScJz7mX/90BpgLa1oqxjeKe4x64QHoSi3J8oPO6vs2XLa1ISBJiyaGsrnN+2o - hd+A== + bh=DrlIDYFXq4Xkunvl9Rd7BT+pP8lPrin0oJpm7SItjZY=; + b=ZIADuFKwlc1qx6Cx1zV58lzjoQ1R2dlCBSJgUi2FvfjzNvPM1vTv8I/uy18UHb1pM2 + tJ7zX3lOOzNm7gmOglJbxHfcBgKB1GMnlSkB+7K1Wvt7ZhnvVFGI7XPMglB76EPCoZ54 + TGC6yTaL33kn3HbqEeIzq5uDKtbM+twgrzNhMqGzlgxqCJXA87g7yXWbEjwQ7kIR9Qy5 + BTaZVWwzoREPnLXrK/psVn6g3LIVxWwuJZQ0Oo09KYwkrm1ecL1hnn0r/Yveij9rgsam + rdIz/V8eTAPSoPAT5YSGZf1nnM2wHoEErOchhtzCmNQwSwIpc9zC6oOtOFDumwv9R0Ts + dezg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1723476687; x=1724081487; - h=to:subject:message-id:date:from:mime-version:x-gm-message-state + d=1e100.net; s=20230601; t=1725627533; x=1726232333; + h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=8AoOgkh5aveFE/RKYa/E9QhApLnE3oSdwb+kORlfNsE=; - b=XpgaLQCJ0Q/aSykYyZ3fQKX3arVzLTzTId0UVYrhOxFAomoOZEPlLh+jPONYVoIj5a - PZGZX1KUgKOn/kqLoQ4quqioSTyc2skjXlWr3cXxhF8KBBfAY1Vbc2cU97yvEBQu3YI2 - uZywVvv0hVxoJ5qOG3xaKrR+oR944lJ32LTH+Tw2KrfeKeOJLydGqHboyOeGrk+DXLB8 - Q69OiawyqGPOxw0cMfijOujWODZjCZTV/+RXiWE6vCOaaA2AZ5qMff1NAJqKKNJoBjhS - ggz1gozz7ZlA5xZtlIojvVmua+ewqkU8li8p0gf0nEBI+Z1qMwGN1zKWYsj4v9/kRLS/ - mJ9w== -X-Gm-Message-State: AOJu0YxJZZYzpg/M0lvPwHgVJLl9H9fOiX7CMDHOh7dNC1G9yefXKIIe - MVIVdB1WUtmnClgXm3c6X9F/HVDiTnNzfpCn2onA1oJTyB39TiB850yprfG7nJ8R2F5yC6wETMC - qzZnn0A8tHDNqNDUZQsFSpVd34YhG -X-Google-Smtp-Source: AGHT+IFwR7MEX2BF64JNUYLXAMt0FJw2nC6yUoxcjpx+oLfHvzJ7PGy7PJjinstDbKPuBkbLsnnR0tY91gm8tWzmnLU= -X-Received: by 2002:a05:6830:270b:b0:70b:4408:d3b8 with SMTP id - 46e09a7af769-70c9399c346mr498498a34.33.1723476686792; Mon, 12 Aug 2024 - 08:31:26 -0700 (PDT) + bh=DrlIDYFXq4Xkunvl9Rd7BT+pP8lPrin0oJpm7SItjZY=; + b=hv7xOCnf0/enA5sjTI7kRbPiZs3i022h3gZqjB2ZOxBizcmG2i1q8hwFbOF4QMat/C + +RH2dbSXDgotTYtW6N7KuOhfnZKmRdVoqCAJf0edtiWrmfGzuVj5AH+MmjMy44Ul1y0S + smMbLF9fZGGLwTG00T3Rc9DwckjVH/6eRdZDy/rVTDErUwJEyqpAq7K98XS3BkOyasHk + Np4urGsAo/tYZUaB04hmUXU7owimsVGEvcd5QMoWb1AsXrAfhk8b6PPcoMqYE1JEKS1m + XPSUvABdat2cSPXIvShlDECcWpkn7lgYezIcqJz1oJEN9FJlF2nwKdo2vfO5neb+CgsI + G3Ew== +X-Gm-Message-State: AOJu0YwjI4piJzZk8oDJxfjrgs6z5TekuCfYW2QCiep9abLg8gLz/Ce7 + RNvJq0rPLFTT9uadziQg15KNnzHQTjco7oKZ+vSk4S5hnHs7EFr2gSEhGA== +X-Google-Smtp-Source: AGHT+IH5kxd4nty3erTMUev68T7WU9wJ9Znll+6ocA65zbt10ynNIbSe9/bGdpevmHnsTFmLrteU/w== +X-Received: by 2002:a17:90b:388b:b0:2cb:5112:740 with SMTP id 98e67ed59e1d1-2dad50e87a8mr2840497a91.26.1725627532409; + Fri, 06 Sep 2024 05:58:52 -0700 (PDT) +Return-Path: +Received: from SoraMacBook-4.local ([86.48.13.220]) + by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2dadc0513ecsm1469996a91.28.2024.09.06.05.58.51 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Fri, 06 Sep 2024 05:58:51 -0700 (PDT) +Message-ID: <66dafc8b.170a0220.77e46.3639@mx.google.com> +Date: Fri, 06 Sep 2024 05:58:51 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============8065783076708843615==" MIME-Version: 1.0 -From: "emailwallet.relayer.2" -Date: Tue, 13 Aug 2024 00:31:15 +0900 -Message-ID: -Subject: Set the new signer of 0x18ABd76E471dB6a75A307bf4dD53ceA89A975B1A to - 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 Code 1162ebff40918afe5305e68396f0283eb675901d0387f97d21928d423aaa0b54 -To: rrelayerbob@gmail.com -Content-Type: multipart/alternative; boundary="000000000000b1f747061f7e2f2e" +From: emaiwallet.alice@gmail.com +To: suegamisora@gmail.com +Subject: Email Account Recovery Test2 ---000000000000b1f747061f7e2f2e -Content-Type: text/plain; charset="UTF-8" - - - ---000000000000b1f747061f7e2f2e -Content-Type: text/html; charset="UTF-8" +--===============8065783076708843615== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 -

---000000000000b1f747061f7e2f2e-- + + +

Hello!

+

This is a test email with a basic HTML body.

+
Set the new signer of 0x0C06688e61C06466E2a5C6f= +E4E15c359260a33f3 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
=20 + + + =20 +--===============8065783076708843615==-- From 6edbe7a33bd7fdfaee866f9fd17f79300ff1cea6 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Fri, 6 Sep 2024 22:57:32 +0900 Subject: [PATCH 032/121] Update yarn.lock --- packages/circuits/scripts/gen_input.ts | 2 +- yarn.lock | 57 ++++++++++++-------------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/packages/circuits/scripts/gen_input.ts b/packages/circuits/scripts/gen_input.ts index 2135d56e..66350409 100644 --- a/packages/circuits/scripts/gen_input.ts +++ b/packages/circuits/scripts/gen_input.ts @@ -70,7 +70,7 @@ async function generate() { maxHeaderLength: 1024, maxBodyLength: 1024, ignoreBodyHashCheck: false, - // shaPrecomputeSelector: '(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?"(=\r\n)?[^"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^"]*(=\r\n)?"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?([^<>/]+)(<(=\r\n)?/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>(=\r\n)?)' + shaPrecomputeSelector: '(
]*>)' }); console.log(circuitInputs.padded_body.length); log("\n\nGenerated Inputs:", circuitInputs, "\n\n"); diff --git a/yarn.lock b/yarn.lock index 3d6add43..a5e491b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1779,9 +1779,9 @@ pretty-format "^29.0.0" "@types/node@*": - version "22.5.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.2.tgz#e42344429702e69e28c839a7e16a8262a8086793" - integrity sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg== + version "22.5.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8" + integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg== dependencies: undici-types "~6.19.2" @@ -1818,19 +1818,19 @@ "@openzeppelin/contracts" "^5.0.0" dotenv "^16.3.1" -"@zk-email/relayer-utils@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@zk-email/relayer-utils/-/relayer-utils-0.3.0.tgz#789acca5de52fbc056bfca5d248638c5b0cddc33" - integrity sha512-j555Fgx5BL6comQQe3i+Iqa5i7hR5IyqqNkqwe7xzyJNpXkZEC1Nw3UNXqH1CY3W/nYLR3UyUUWzK4c3zXEjWA== +"@zk-email/relayer-utils@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@zk-email/relayer-utils/-/relayer-utils-0.3.5.tgz#1306001d39c489dfff65a974e037d97976c37a63" + integrity sha512-Z2IN6DZvjPlALT0J1phWqljvqGzNxCs7l0VCWUpjJsAmzsozi9/EF8wVWmOGi41THgv5vxwlnnnzs/cHJjeGcA== dependencies: "@mapbox/node-pre-gyp" "^1.0" cargo-cp-artifact "^0.1" node-pre-gyp-github "https://github.com/ultamatt/node-pre-gyp-github.git" "@zk-email/zk-regex-circom@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@zk-email/zk-regex-circom/-/zk-regex-circom-2.1.0.tgz#cc2f1d93fb130a9f8ac88114d3559a296df97538" - integrity sha512-Ayq0Hk4m7w1UHPPx2c5bUWLdKUPnuK62AZFOyiIvA7x4NgRyvjxe+S4D5KFH5FIz4PgEnXVxgscSSbe5p/GCvQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@zk-email/zk-regex-circom/-/zk-regex-circom-2.1.1.tgz#e4f41fd873905d27dd05a9f07613717be4b2e5d1" + integrity sha512-tuU2Kb08fwYkAPDemL8RRvLTEKNGyUt2odYr5awkVKGCZGCV1hxIy/wke6+2fIOR8Lu82MnXVtdBk+G3gRZLbg== dependencies: commander "^11.0.0" snarkjs "^0.7.0" @@ -2241,9 +2241,9 @@ camelcase@^6.0.0, camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001646: - version "1.0.30001655" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f" - integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg== + version "1.0.30001658" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz#b5f7be8ac748a049ab06aa1cf7a1408d83f074ec" + integrity sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw== cargo-cp-artifact@^0.1: version "0.1.9" @@ -2520,11 +2520,11 @@ debug@3.1.0: ms "2.0.0" debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.1.0: version "3.2.7" @@ -2611,9 +2611,9 @@ ejs@^3.1.10, ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.5.4: - version "1.5.13" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" - integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== + version "1.5.16" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.16.tgz#125b6777774dbd4287aa86ab181cc880f4a5fb47" + integrity sha512-2gQpi2WYobXmz2q23FrOBYTLcI1O/P4heW3eqX+ldmPVDQELRqhiebV380EhlGG12NtnX1qbK/FHpN0ba+7bLA== elliptic@6.5.4: version "6.5.4" @@ -2921,7 +2921,7 @@ for-each@^0.3.3: "forge-std@https://github.com/foundry-rs/forge-std": version "1.9.2" - resolved "https://github.com/foundry-rs/forge-std#4695fac44b2934aaa6d7150e2eaf0256fdc566a7" + resolved "https://github.com/foundry-rs/forge-std#1ce7535a517406b9aec7ea1ea27c1b41376f712c" fs-minipass@^2.0.0: version "2.1.0" @@ -4004,11 +4004,6 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" @@ -4051,9 +4046,9 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -"node-pre-gyp-github@https://github.com/ultamatt/node-pre-gyp-github.git": +"node-pre-gyp-github@git+https://github.com/ultamatt/node-pre-gyp-github.git": version "1.4.3" - resolved "https://github.com/ultamatt/node-pre-gyp-github.git#e4961827f77751489bc8d4760a0479f3f985f34f" + resolved "git+https://github.com/ultamatt/node-pre-gyp-github.git#e4961827f77751489bc8d4760a0479f3f985f34f" dependencies: "@octokit/rest" "^15.9.5" commander "^2.17.0" @@ -4230,9 +4225,9 @@ pathval@^1.1.1: integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" From b51d63562218b901884b14cb2ccf75ccda6382f3 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Fri, 6 Sep 2024 23:13:42 +0900 Subject: [PATCH 033/121] Fix scripts and email for integration test --- packages/contracts/test/bin/accept.sh | 3 +- packages/contracts/test/bin/recovery.sh | 3 +- .../contracts/test/emails/8453/recovery.eml | 107 +++++++++--------- 3 files changed, 59 insertions(+), 54 deletions(-) diff --git a/packages/contracts/test/bin/accept.sh b/packages/contracts/test/bin/accept.sh index a952045a..86792f4e 100755 --- a/packages/contracts/test/bin/accept.sh +++ b/packages/contracts/test/bin/accept.sh @@ -10,5 +10,6 @@ yarn workspace @zk-email/ether-email-auth-circom gen-input \ --email-file $EMAIL_FILE_PATH \ --account-code $ACCOUNT_CODE \ --input-file $INPUT_FILE \ - --prove + --prove \ + --body exit 0 \ No newline at end of file diff --git a/packages/contracts/test/bin/recovery.sh b/packages/contracts/test/bin/recovery.sh index d212762b..fe3eda69 100755 --- a/packages/contracts/test/bin/recovery.sh +++ b/packages/contracts/test/bin/recovery.sh @@ -10,5 +10,6 @@ yarn workspace @zk-email/ether-email-auth-circom gen-input \ --email-file $EMAIL_FILE_PATH \ --account-code $ACCOUNT_CODE \ --input-file $INPUT_FILE \ - --prove + --prove \ + --body exit 0 \ No newline at end of file diff --git a/packages/contracts/test/emails/8453/recovery.eml b/packages/contracts/test/emails/8453/recovery.eml index 9de65414..f0622b1c 100644 --- a/packages/contracts/test/emails/8453/recovery.eml +++ b/packages/contracts/test/emails/8453/recovery.eml @@ -1,86 +1,86 @@ Delivered-To: suegamisora@gmail.com -Received: by 2002:a05:7011:c08e:b0:3e7:b7d5:224d with SMTP id jk14csp159606mdc; - Fri, 6 Sep 2024 05:58:53 -0700 (PDT) -X-Received: by 2002:a17:90a:f493:b0:2da:5edd:c165 with SMTP id 98e67ed59e1d1-2dad50e8866mr2983558a91.30.1725627533524; - Fri, 06 Sep 2024 05:58:53 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725627533; cv=none; +Received: by 2002:a05:7011:c08e:b0:3e7:b7d5:224d with SMTP id jk14csp204212mdc; + Fri, 6 Sep 2024 07:06:34 -0700 (PDT) +X-Received: by 2002:a05:6a21:398:b0:1c4:818c:299d with SMTP id adf61e73a8af0-1cf1d0ac38bmr3164598637.11.1725631594162; + Fri, 06 Sep 2024 07:06:34 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725631594; cv=none; d=google.com; s=arc-20160816; - b=CvcfzEez2XqfdAi1gSNVDsai5L+eC45M1Tm1J7LpbY9DmL2hPIz9iMw2SnI9OcuJrz - 6AV396u3AFrEIe4+TvNh0zWKtfshZ5e9qMfy4MkHs4NOgOWjlIfxsMGuFBLKZRgz1rB1 - lETbcuSgKU2rbeBf6bVObOyDspkx0SC5l5pVjD7ZeFLtqSmV/4VSJ1sHFGOJO57hTQdk - w1jbgPK0Kqtnkn7G3/YWKMAQNLLuI/FicFXaKxZ0anNTqHLilLTPANaPowXR37ADB8sV - eNGpA6H3x/xOHIOIGyg9K/3JKYBVeIp5qftBx4ZP5kJi2O1HM2gDZV5inNLznf+emGBf - tgCw== + b=neyIDnwOb09Q6yKRPBUtpnN45/12pMr3qQ0Ud7Id5y6LqmE8P2V17VsAGcZySyIIGW + t03BA5DAjwjHj7DfcG6UFS3dPG1JXP7rJ1FcgsZG/IWmUpbAOmFqRGQ0wAV6UjUAn9Gy + Y6UMnJihuGH3AuC27UfyEChfZfw/pV3yxuy4vZYmk8VdrPrOUE9IUpJQWgE04hV9DnPw + y4kGR/9Znyz7HXgSgZ1VX7yQP1t4+HdrhXYcGwJ+IZ2ZG0Ex8gQjcAsP1kx342qLVkJN + JWpT2jhQN5cA/SzgaIL7qTizwFyr853x26JfVFhZOygMd093+eHeAKWF5NQjrNL5Fa8O + kqlg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=subject:to:from:mime-version:date:message-id:dkim-signature; - bh=DrlIDYFXq4Xkunvl9Rd7BT+pP8lPrin0oJpm7SItjZY=; + bh=+En5H5Kcpi9ycUXdozwu24rETB0V0u4ugKt6BTYwkcQ=; fh=r9ZW45D/4i7BIl/4UeFGrkYKwbplztqhOVKfbV+WD3I=; - b=pVSNnwsGkeSF82EogR6UzUtP9/G7I2lBWnfcwxdqxWXGb38PGsiu6BQspNcj4DgqiY - e614p4rGjiTfPNyxtlLPhA5UsL6aX5RlG0JxPz79Dev3u4n92M0a/ExJcWFw+DwQAwZq - lL0xGIv2jbl2Ypn4oRJraxqknNoB8J69G8cud6PF4z2gM9WpvGMWb2CU+7b8W2aFpKj/ - RdUDMmzXJs7bnLePY8idFjdcJgSaeAusYuDXr8tRlDgxD2VJaGT8j4TaT70NZFr3yzw8 - emmMItgsWiYsL6IxopzwN7xM5Wzkx+dUZAZNnL7ZLgg0odoIGzI4KcB9OyaP3n4XgJQJ - XZJQ==; + b=Ex8YqvfNz7m0MkfOHsGjAyPMi7ZzFESOJWMUDur1Wam3nxJ1cKjKqpFjUU39UX/V/y + Jw/62HLuaEVVFEk3KTxOrMfuHL8SBbJjZMWz1M9IR2ZMxHSABInPkJSGyG1tOu6GiZhh + yqBiQ9e0S+VQIrp/eZlBCLg1+HE/5VDvU/ZLi0yWD0/QZbR0qzLItdLzKGKYIHr7EmGt + AzhSAckGDHoJZ8vz19o2AifwkUKR+FddkQQ5c8oUdwXviquQdjjx09qr2+0t6KfcKtYV + Sl7kHujnUH6wuvSJbGQYBREvaTVChE342enIpT1v1FvjuBiVE2QddVSup/VFjQk+T62H + sj2Q==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=ZIADuFKw; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=WywB1xXZ; spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id 98e67ed59e1d1-2d881a867f0sor6191671a91.3.2024.09.06.05.58.53 + by mx.google.com with SMTPS id d2e1a72fcca58-715e55abe12sor13266300b3a.5.2024.09.06.07.06.34 for (Google Transport Security); - Fri, 06 Sep 2024 05:58:53 -0700 (PDT) + Fri, 06 Sep 2024 07:06:34 -0700 (PDT) Received-SPF: pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=ZIADuFKw; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=WywB1xXZ; spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725627533; x=1726232333; dara=google.com; + d=gmail.com; s=20230601; t=1725631593; x=1726236393; dara=google.com; h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=DrlIDYFXq4Xkunvl9Rd7BT+pP8lPrin0oJpm7SItjZY=; - b=ZIADuFKwlc1qx6Cx1zV58lzjoQ1R2dlCBSJgUi2FvfjzNvPM1vTv8I/uy18UHb1pM2 - tJ7zX3lOOzNm7gmOglJbxHfcBgKB1GMnlSkB+7K1Wvt7ZhnvVFGI7XPMglB76EPCoZ54 - TGC6yTaL33kn3HbqEeIzq5uDKtbM+twgrzNhMqGzlgxqCJXA87g7yXWbEjwQ7kIR9Qy5 - BTaZVWwzoREPnLXrK/psVn6g3LIVxWwuJZQ0Oo09KYwkrm1ecL1hnn0r/Yveij9rgsam - rdIz/V8eTAPSoPAT5YSGZf1nnM2wHoEErOchhtzCmNQwSwIpc9zC6oOtOFDumwv9R0Ts - dezg== + bh=+En5H5Kcpi9ycUXdozwu24rETB0V0u4ugKt6BTYwkcQ=; + b=WywB1xXZCLm8cOOVfPhl2kruueWi4gv4RLHnFp0W9LKIwGgUjBfseAZ/kOcxFfB75f + zL6u50Xt8+P34InxQBZ7OSMAcF3RKs325DTmAVbHG7JWMTu37k65t6/Jx/IQypK5Gjku + lI6SVtdL/09Q3kam8+9av0q9Yk2PUJhNoUsk3ehoorTrdbOMdvouk06jhzkXGQSwJCqB + 6wjf2dPocmVZKH7QRK6l3KhDEKW1wOb2jrAq2kI+TcsRss5YqFh0v/erXcZcDaJpIZsC + u3+Mz6+o/8K5s3cqn/x371LuOr65oarNylYSsQA8/dg9T0PJ6wvUUgpJY+Jy/uz3PIm3 + U7LQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725627533; x=1726232333; + d=1e100.net; s=20230601; t=1725631593; x=1726236393; h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=DrlIDYFXq4Xkunvl9Rd7BT+pP8lPrin0oJpm7SItjZY=; - b=hv7xOCnf0/enA5sjTI7kRbPiZs3i022h3gZqjB2ZOxBizcmG2i1q8hwFbOF4QMat/C - +RH2dbSXDgotTYtW6N7KuOhfnZKmRdVoqCAJf0edtiWrmfGzuVj5AH+MmjMy44Ul1y0S - smMbLF9fZGGLwTG00T3Rc9DwckjVH/6eRdZDy/rVTDErUwJEyqpAq7K98XS3BkOyasHk - Np4urGsAo/tYZUaB04hmUXU7owimsVGEvcd5QMoWb1AsXrAfhk8b6PPcoMqYE1JEKS1m - XPSUvABdat2cSPXIvShlDECcWpkn7lgYezIcqJz1oJEN9FJlF2nwKdo2vfO5neb+CgsI - G3Ew== -X-Gm-Message-State: AOJu0YwjI4piJzZk8oDJxfjrgs6z5TekuCfYW2QCiep9abLg8gLz/Ce7 - RNvJq0rPLFTT9uadziQg15KNnzHQTjco7oKZ+vSk4S5hnHs7EFr2gSEhGA== -X-Google-Smtp-Source: AGHT+IH5kxd4nty3erTMUev68T7WU9wJ9Znll+6ocA65zbt10ynNIbSe9/bGdpevmHnsTFmLrteU/w== -X-Received: by 2002:a17:90b:388b:b0:2cb:5112:740 with SMTP id 98e67ed59e1d1-2dad50e87a8mr2840497a91.26.1725627532409; - Fri, 06 Sep 2024 05:58:52 -0700 (PDT) + bh=+En5H5Kcpi9ycUXdozwu24rETB0V0u4ugKt6BTYwkcQ=; + b=bBbSG2jjtoOllwizKkiuKkUS7AXrRzvSSKnrxWoZO2dYJHRfJjUYd6kQ8XjQgJYS3m + eZr57zXGS/G7cMgLDMVm+sGkoBo5iV7Tk90P+x9siUw6Brwxk+1ruCo/pf5kz4GE+Ja4 + kp7oll0yFX/dE5NQNJQzjrsqpiSLcZBwuE3iT2sEXtZoCWjEuzgIPrUln2/j8Ggda1oW + KMIfvxbTMZcLHSixd6mGivJjYXA1XGH3JcHK4gKAisI6qg9yXYH7m5jxjmv6IznDs9XS + rpDy6hOlnXbGfVBuLmUof1oU2dR9QXaiHQLODOGaKuRrjLGct/p3LsARnyVe+T1VAZYe + 6mrA== +X-Gm-Message-State: AOJu0Yzv29u77x2u/C79smZesVRXqC7rtg64pBOWUSNLMwHl5hYAzypR + 63JXpRqVsZiuTdbP0vm/O2UuKnziesKo1QIWLR37JwxyN6lAAJgsALL/eg== +X-Google-Smtp-Source: AGHT+IEK+LRrIsxXjaaMlPKWOhcGBo+ENzGR0Ye63iYyYL191jCIv7dpWYLMZsS9PezP/GYaKJZRYg== +X-Received: by 2002:a05:6a21:6b86:b0:1c6:a576:4252 with SMTP id adf61e73a8af0-1cf1d059ce8mr2470747637.8.1725631592736; + Fri, 06 Sep 2024 07:06:32 -0700 (PDT) Return-Path: Received: from SoraMacBook-4.local ([86.48.13.220]) - by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2dadc0513ecsm1469996a91.28.2024.09.06.05.58.51 + by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7d4fbda7b67sm4879875a12.72.2024.09.06.07.06.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Fri, 06 Sep 2024 05:58:51 -0700 (PDT) -Message-ID: <66dafc8b.170a0220.77e46.3639@mx.google.com> -Date: Fri, 06 Sep 2024 05:58:51 -0700 (PDT) -Content-Type: multipart/alternative; boundary="===============8065783076708843615==" + Fri, 06 Sep 2024 07:06:31 -0700 (PDT) +Message-ID: <66db0c67.630a0220.483ad.1969@mx.google.com> +Date: Fri, 06 Sep 2024 07:06:31 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============2549133918967816067==" MIME-Version: 1.0 From: emaiwallet.alice@gmail.com To: suegamisora@gmail.com -Subject: Email Account Recovery Test2 +Subject: Email Account Recovery Test1 ---===============8065783076708843615== +--===============2549133918967816067== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable @@ -91,9 +91,12 @@ Content-Type: text/html; charset=utf-8

Hello!

This is a test email with a basic HTML body.

+
Set the new signer of 0x0C06688e61C06466E2a5C6f= -E4E15c359260a33f3 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
=20 +=3D +E4E15c359260a33f3 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
+
=20 ---===============8065783076708843615==-- +--===============2549133918967816067==-- From 0566f142e2351036120dc65bb49e84db6d5a1277 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Fri, 6 Sep 2024 20:51:31 +0530 Subject: [PATCH 034/121] chore: update circuit test --- Cargo.lock | 2 +- packages/circuits/package.json | 4 +- .../test_email_auth_with_body_parsing.circom | 2 +- ..._with_body_parsing_with_qp_encoding.circom | 5 - .../email_auth_with_body_parsing.test.ts | 263 +++++++++++++++- ...with_body_parsing_with_qp_encoding.test.ts | 284 ------------------ .../eml_templates/acceptance_request.html | 4 +- packages/relayer/src/core.rs | 6 +- 8 files changed, 271 insertions(+), 299 deletions(-) delete mode 100644 packages/circuits/tests/circuits/test_email_auth_with_body_parsing_with_qp_encoding.circom delete mode 100644 packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts diff --git a/Cargo.lock b/Cargo.lock index ac6a1d8f..85266137 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4138,7 +4138,7 @@ dependencies = [ [[package]] name = "relayer-utils" -version = "0.3.4" +version = "0.3.6" dependencies = [ "anyhow", "base64 0.21.7", diff --git a/packages/circuits/package.json b/packages/circuits/package.json index 7e84d67d..2bc63094 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -13,7 +13,7 @@ "dependencies": { "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.3.5", + "@zk-email/relayer-utils": "^0.3.6", "commander": "^11.0.0", "snarkjs": "^0.7.0" }, @@ -42,4 +42,4 @@ ] ] } -} \ No newline at end of file +} diff --git a/packages/circuits/tests/circuits/test_email_auth_with_body_parsing.circom b/packages/circuits/tests/circuits/test_email_auth_with_body_parsing.circom index 0f0fe634..9e38853d 100644 --- a/packages/circuits/tests/circuits/test_email_auth_with_body_parsing.circom +++ b/packages/circuits/tests/circuits/test_email_auth_with_body_parsing.circom @@ -2,4 +2,4 @@ pragma circom 2.1.6; include "../../src/email_auth_template.circom"; -component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 605, 0, 0); \ No newline at end of file +component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 605, 0, 1); \ No newline at end of file diff --git a/packages/circuits/tests/circuits/test_email_auth_with_body_parsing_with_qp_encoding.circom b/packages/circuits/tests/circuits/test_email_auth_with_body_parsing_with_qp_encoding.circom deleted file mode 100644 index 9e38853d..00000000 --- a/packages/circuits/tests/circuits/test_email_auth_with_body_parsing_with_qp_encoding.circom +++ /dev/null @@ -1,5 +0,0 @@ -pragma circom 2.1.6; - -include "../../src/email_auth_template.circom"; - -component main = EmailAuthWithBodyParsing(121, 17, 640, 768, 605, 0, 1); \ No newline at end of file diff --git a/packages/circuits/tests/email_auth_with_body_parsing.test.ts b/packages/circuits/tests/email_auth_with_body_parsing.test.ts index ba157e37..319165d2 100644 --- a/packages/circuits/tests/email_auth_with_body_parsing.test.ts +++ b/packages/circuits/tests/email_auth_with_body_parsing.test.ts @@ -16,11 +16,272 @@ describe("Email Auth With Body Parsing", () => { recompile: true, }; circuit = await wasm_tester( - path.join(__dirname, "./circuits/test_email_auth_with_body_parsing.circom"), + path.join( + __dirname, + "./circuits/test_email_auth_with_body_parsing.circom" + ), option ); }); + // it("Verify a sent email whose from field has a non-English name", async () => { + // const emailFilePath = path.join( + // __dirname, + // "./emails/email_auth_with_body_parsing_test4.eml" + // ); + // const emailRaw = readFileSync(emailFilePath, "utf8"); + // const parsedEmail = await relayerUtils.parseEmail(emailRaw); + // console.log(parsedEmail.canonicalizedHeader); + // const accountCode = await relayerUtils.genAccountCode(); + // const circuitInputs = await genEmailAuthInput( + // emailFilePath, + // accountCode + // ); + // const witness = await circuit.calculateWitness(circuitInputs); + // await circuit.checkConstraints(witness); + // const domainName = "gmail.com"; + // const paddedDomain = relayerUtils.padString(domainName, 255); + // const domainFields = relayerUtils.bytes2Fields(paddedDomain); + // for (let idx = 0; idx < domainFields.length; ++idx) { + // expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + // } + // const expectedPubKeyHash = relayerUtils.publicKeyHash( + // parsedEmail.publicKey + // ); + // expect(BigInt(expectedPubKeyHash)).toEqual( + // witness[1 + domainFields.length] + // ); + // const expectedEmailNullifier = relayerUtils.emailNullifier( + // parsedEmail.signature + // ); + // expect(BigInt(expectedEmailNullifier)).toEqual( + // witness[1 + domainFields.length + 1] + // ); + // const timestamp = 1725334030n; + // expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + // const maskedSubject = "Send 1 ETH to "; + // const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); + // const maskedSubjectFields = + // relayerUtils.bytes2Fields(paddedMaskedSubject); + // for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { + // expect(BigInt(maskedSubjectFields[idx])).toEqual( + // witness[1 + domainFields.length + 3 + idx] + // ); + // } + // const fromAddr = "suegamisora@gmail.com"; + // const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + // expect(BigInt(accountSalt)).toEqual( + // witness[1 + domainFields.length + 3 + maskedSubjectFields.length] + // ); + // expect(0n).toEqual( + // witness[ + // 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + // ] + // ); + // }); + + it("Verify a sent email whose body has an email address and an invitation code", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test4.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725334030n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Send 0.12 ETH to "; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose body has an invitation code", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test5.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725334056n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = + "Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + + it("Verify a sent email whose body has an invitation code with sha precompute string", async () => { + const emailFilePath = path.join( + __dirname, + "./emails/email_auth_with_body_parsing_test5.eml" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + + const { subject_idx, ...circuitInputsRelevant } = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + shaPrecomputeSelector: '(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?"(=\r\n)?[^"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^"]*(=\r\n)?"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?([^<>/]+)(<(=\r\n)?/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>(=\r\n)?)', + }); + const witness = await circuit.calculateWitness(circuitInputsRelevant); + await circuit.checkConstraints(witness); + + const domainName = "gmail.com"; + const paddedDomain = relayerUtils.padString(domainName, 255); + const domainFields = relayerUtils.bytes2Fields(paddedDomain); + for (let idx = 0; idx < domainFields.length; ++idx) { + expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); + } + + const expectedPubKeyHash = relayerUtils.publicKeyHash( + parsedEmail.publicKey + ); + expect(BigInt(expectedPubKeyHash)).toEqual( + witness[1 + domainFields.length] + ); + + const expectedEmailNullifier = relayerUtils.emailNullifier( + parsedEmail.signature + ); + expect(BigInt(expectedEmailNullifier)).toEqual( + witness[1 + domainFields.length + 1] + ); + + const timestamp = 1725334056n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = + "Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; + const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); + const maskedCommandFields = + relayerUtils.bytes2Fields(paddedMaskedCommand); + for (let idx = 0; idx < maskedCommandFields.length; ++idx) { + expect(BigInt(maskedCommandFields[idx])).toEqual( + witness[1 + domainFields.length + 3 + idx] + ); + } + const fromAddr = "zkemail.relayer.test@gmail.com"; + const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); + expect(BigInt(accountSalt)).toEqual( + witness[1 + domainFields.length + 3 + maskedCommandFields.length] + ); + + expect(1n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + it("Verify a sent email whose body has an email address", async () => { const emailFilePath = path.join( __dirname, diff --git a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts b/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts deleted file mode 100644 index 30de45ab..00000000 --- a/packages/circuits/tests/email_auth_with_body_parsing_with_qp_encoding.test.ts +++ /dev/null @@ -1,284 +0,0 @@ -const circom_tester = require("circom_tester"); -const wasm_tester = circom_tester.wasm; -import * as path from "path"; -const relayerUtils = require("@zk-email/relayer-utils"); - -import { genEmailCircuitInput } from "../helpers/email_auth"; -import { readFileSync } from "fs"; - -jest.setTimeout(1440000); -describe("Email Auth With Body Parsing (QP Encoded)", () => { - let circuit; - beforeAll(async () => { - const option = { - include: path.join(__dirname, "../../../node_modules"), - output: path.join(__dirname, "../build"), - recompile: true, - }; - circuit = await wasm_tester( - path.join( - __dirname, - "./circuits/test_email_auth_with_body_parsing_with_qp_encoding.circom" - ), - option - ); - }); - - // it("Verify a sent email whose from field has a non-English name", async () => { - // const emailFilePath = path.join( - // __dirname, - // "./emails/email_auth_with_body_parsing_test4.eml" - // ); - // const emailRaw = readFileSync(emailFilePath, "utf8"); - // const parsedEmail = await relayerUtils.parseEmail(emailRaw); - // console.log(parsedEmail.canonicalizedHeader); - // const accountCode = await relayerUtils.genAccountCode(); - // const circuitInputs = await genEmailAuthInput( - // emailFilePath, - // accountCode - // ); - // const witness = await circuit.calculateWitness(circuitInputs); - // await circuit.checkConstraints(witness); - // const domainName = "gmail.com"; - // const paddedDomain = relayerUtils.padString(domainName, 255); - // const domainFields = relayerUtils.bytes2Fields(paddedDomain); - // for (let idx = 0; idx < domainFields.length; ++idx) { - // expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - // } - // const expectedPubKeyHash = relayerUtils.publicKeyHash( - // parsedEmail.publicKey - // ); - // expect(BigInt(expectedPubKeyHash)).toEqual( - // witness[1 + domainFields.length] - // ); - // const expectedEmailNullifier = relayerUtils.emailNullifier( - // parsedEmail.signature - // ); - // expect(BigInt(expectedEmailNullifier)).toEqual( - // witness[1 + domainFields.length + 1] - // ); - // const timestamp = 1725334030n; - // expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - // const maskedSubject = "Send 1 ETH to "; - // const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - // const maskedSubjectFields = - // relayerUtils.bytes2Fields(paddedMaskedSubject); - // for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { - // expect(BigInt(maskedSubjectFields[idx])).toEqual( - // witness[1 + domainFields.length + 3 + idx] - // ); - // } - // const fromAddr = "suegamisora@gmail.com"; - // const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - // expect(BigInt(accountSalt)).toEqual( - // witness[1 + domainFields.length + 3 + maskedSubjectFields.length] - // ); - // expect(0n).toEqual( - // witness[ - // 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 - // ] - // ); - // }); - - it("Verify a sent email whose body has an email address and an invitation code", async () => { - const emailFilePath = path.join( - __dirname, - "./emails/email_auth_with_body_parsing_test4.eml" - ); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - - const accountCode = - "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - - const { subject_idx, ...circuitInputsRelevant } = - await genEmailCircuitInput(emailFilePath, accountCode, { - maxHeaderLength: 640, - maxBodyLength: 768, - ignoreBodyHashCheck: false, - }); - const witness = await circuit.calculateWitness(circuitInputsRelevant); - await circuit.checkConstraints(witness); - - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - - const timestamp = 1725334030n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - - const maskedCommand = "Send 0.12 ETH to "; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); - const maskedCommandFields = - relayerUtils.bytes2Fields(paddedMaskedCommand); - for (let idx = 0; idx < maskedCommandFields.length; ++idx) { - expect(BigInt(maskedCommandFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - - const fromAddr = "zkemail.relayer.test@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedCommandFields.length] - ); - - expect(1n).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 - ] - ); - }); - - it("Verify a sent email whose body has an invitation code", async () => { - const emailFilePath = path.join( - __dirname, - "./emails/email_auth_with_body_parsing_test5.eml" - ); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - - const accountCode = - "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - - const { subject_idx, ...circuitInputsRelevant } = - await genEmailCircuitInput(emailFilePath, accountCode, { - maxHeaderLength: 640, - maxBodyLength: 768, - ignoreBodyHashCheck: false, - }); - const witness = await circuit.calculateWitness(circuitInputsRelevant); - await circuit.checkConstraints(witness); - - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - - const timestamp = 1725334056n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - - const maskedCommand = - "Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); - const maskedCommandFields = - relayerUtils.bytes2Fields(paddedMaskedCommand); - for (let idx = 0; idx < maskedCommandFields.length; ++idx) { - expect(BigInt(maskedCommandFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "zkemail.relayer.test@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedCommandFields.length] - ); - - expect(1n).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 - ] - ); - }); - - it("Verify a sent email whose body has an invitation code with sha precompute string", async () => { - const emailFilePath = path.join( - __dirname, - "./emails/email_auth_with_body_parsing_test5.eml" - ); - const emailRaw = readFileSync(emailFilePath, "utf8"); - const parsedEmail = await relayerUtils.parseEmail(emailRaw); - - const accountCode = - "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - - const { subject_idx, ...circuitInputsRelevant } = - await genEmailCircuitInput(emailFilePath, accountCode, { - maxHeaderLength: 640, - maxBodyLength: 768, - ignoreBodyHashCheck: false, - shaPrecomputeSelector: '(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?"(=\r\n)?[^"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^"]*(=\r\n)?"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?([^<>/]+)(<(=\r\n)?/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>(=\r\n)?)', - }); - const witness = await circuit.calculateWitness(circuitInputsRelevant); - await circuit.checkConstraints(witness); - - const domainName = "gmail.com"; - const paddedDomain = relayerUtils.padString(domainName, 255); - const domainFields = relayerUtils.bytes2Fields(paddedDomain); - for (let idx = 0; idx < domainFields.length; ++idx) { - expect(BigInt(domainFields[idx])).toEqual(witness[1 + idx]); - } - - const expectedPubKeyHash = relayerUtils.publicKeyHash( - parsedEmail.publicKey - ); - expect(BigInt(expectedPubKeyHash)).toEqual( - witness[1 + domainFields.length] - ); - - const expectedEmailNullifier = relayerUtils.emailNullifier( - parsedEmail.signature - ); - expect(BigInt(expectedEmailNullifier)).toEqual( - witness[1 + domainFields.length + 1] - ); - - const timestamp = 1725334056n; - expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); - - const maskedCommand = - "Accept guardian request for 0x04884491560f38342C56E26BDD0fEAbb68E2d2FC"; - const paddedMaskedCommand = relayerUtils.padString(maskedCommand, 605); - const maskedCommandFields = - relayerUtils.bytes2Fields(paddedMaskedCommand); - for (let idx = 0; idx < maskedCommandFields.length; ++idx) { - expect(BigInt(maskedCommandFields[idx])).toEqual( - witness[1 + domainFields.length + 3 + idx] - ); - } - const fromAddr = "zkemail.relayer.test@gmail.com"; - const accountSalt = relayerUtils.accountSalt(fromAddr, accountCode); - expect(BigInt(accountSalt)).toEqual( - witness[1 + domainFields.length + 3 + maskedCommandFields.length] - ); - - expect(1n).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedCommandFields.length + 1 - ] - ); - }); -}); diff --git a/packages/relayer/eml_templates/acceptance_request.html b/packages/relayer/eml_templates/acceptance_request.html index 0620e55d..da2e4356 100644 --- a/packages/relayer/eml_templates/acceptance_request.html +++ b/packages/relayer/eml_templates/acceptance_request.html @@ -166,8 +166,7 @@ margin-bottom: 15px; " > - You have received an guardian request from the wallet address {{walletAddress}}. -
{{command}}
. + You have received an guardian request from the wallet address {{walletAddress}}. Reply "Confirm" to this email to accept the request.
Your request ID is #{{requestId}}. @@ -415,5 +414,6 @@   +
{{command}}
diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 10750c60..36c08eae 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -11,7 +11,7 @@ use ethers::{ use relayer_utils::{extract_substr_idxes, generate_email_circuit_input, EmailCircuitParams, LOG}; const DOMAIN_FIELDS: usize = 9; -const SUBJECT_FIELDS: usize = 9; +const SUBJECT_FIELDS: usize = 20; const EMAIL_ADDR_FIELDS: usize = 9; pub async fn handle_email(email: String) -> Result { @@ -116,7 +116,7 @@ pub async fn handle_email(email: String) -> Result { &AccountCode::from(hex_to_field(&format!("0x{}", &account_code_str))?), Some(EmailCircuitParams { max_header_length: Some(1024), - max_body_length: Some(5020), + max_body_length: Some(1024), sha_precompute_selector: Some(SHA_PRECOMPUTE_SELECTOR.to_string()), ignore_body_hash_check: Some(false), }), @@ -146,7 +146,7 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), subject_params: command_params_encoded, - skiped_subject_prefix: skipped_command_prefix.into(), + skiped_subject_prefix: 0.into(), proof: email_proof.clone(), }; From fbd3844a9102fee704bbfb94aac54b260e399fb0 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Sat, 7 Sep 2024 00:58:45 +0900 Subject: [PATCH 035/121] Integration test worked --- .../contracts/test/emails/8453/recovery.eml | 103 +++++++++--------- 1 file changed, 51 insertions(+), 52 deletions(-) diff --git a/packages/contracts/test/emails/8453/recovery.eml b/packages/contracts/test/emails/8453/recovery.eml index f0622b1c..b192a23f 100644 --- a/packages/contracts/test/emails/8453/recovery.eml +++ b/packages/contracts/test/emails/8453/recovery.eml @@ -1,86 +1,86 @@ Delivered-To: suegamisora@gmail.com -Received: by 2002:a05:7011:c08e:b0:3e7:b7d5:224d with SMTP id jk14csp204212mdc; - Fri, 6 Sep 2024 07:06:34 -0700 (PDT) -X-Received: by 2002:a05:6a21:398:b0:1c4:818c:299d with SMTP id adf61e73a8af0-1cf1d0ac38bmr3164598637.11.1725631594162; - Fri, 06 Sep 2024 07:06:34 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725631594; cv=none; +Received: by 2002:a05:7011:c08e:b0:3e7:b7d5:224d with SMTP id jk14csp271764mdc; + Fri, 6 Sep 2024 08:50:39 -0700 (PDT) +X-Received: by 2002:a17:903:32cf:b0:205:68a4:b2d9 with SMTP id d9443c01a7336-206f05afdffmr38516325ad.48.1725637839417; + Fri, 06 Sep 2024 08:50:39 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725637839; cv=none; d=google.com; s=arc-20160816; - b=neyIDnwOb09Q6yKRPBUtpnN45/12pMr3qQ0Ud7Id5y6LqmE8P2V17VsAGcZySyIIGW - t03BA5DAjwjHj7DfcG6UFS3dPG1JXP7rJ1FcgsZG/IWmUpbAOmFqRGQ0wAV6UjUAn9Gy - Y6UMnJihuGH3AuC27UfyEChfZfw/pV3yxuy4vZYmk8VdrPrOUE9IUpJQWgE04hV9DnPw - y4kGR/9Znyz7HXgSgZ1VX7yQP1t4+HdrhXYcGwJ+IZ2ZG0Ex8gQjcAsP1kx342qLVkJN - JWpT2jhQN5cA/SzgaIL7qTizwFyr853x26JfVFhZOygMd093+eHeAKWF5NQjrNL5Fa8O - kqlg== + b=swnmCCO5fnfNvudit2Hp8Be43saZpYn8oi7H0GNNVB5PqC8YSj2xleA/Pf59nU09lv + 7rDjCoHHeAhJlOtMJicYVv5q6EgBefmVQIpeUfMAQKYGHJjLgy/1rudbeSYF0HoBohJt + q7xboOzgfAftztF3oqtYxmKtT4qTfCARDLWXc3w/dRY+45a+/rYGFXvow54XvFaQV/zo + qT19dc9jytkoROUp8tSnJ55PA5qI2RSR74bBuG74HCG9FsGJGzSudJusFa3CEoi1VBh+ + JxNn2/Pt/3erStuTPK7mRMMBV/FXJ/fPEkY541QFZs/pcwYcrCab/5jkk3yIrifaGnnu + /ZpQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=subject:to:from:mime-version:date:message-id:dkim-signature; - bh=+En5H5Kcpi9ycUXdozwu24rETB0V0u4ugKt6BTYwkcQ=; + bh=r7rF/jG1IIgCj5l2v1qn74V4v31Wj5mEk1ZeR+AbNFM=; fh=r9ZW45D/4i7BIl/4UeFGrkYKwbplztqhOVKfbV+WD3I=; - b=Ex8YqvfNz7m0MkfOHsGjAyPMi7ZzFESOJWMUDur1Wam3nxJ1cKjKqpFjUU39UX/V/y - Jw/62HLuaEVVFEk3KTxOrMfuHL8SBbJjZMWz1M9IR2ZMxHSABInPkJSGyG1tOu6GiZhh - yqBiQ9e0S+VQIrp/eZlBCLg1+HE/5VDvU/ZLi0yWD0/QZbR0qzLItdLzKGKYIHr7EmGt - AzhSAckGDHoJZ8vz19o2AifwkUKR+FddkQQ5c8oUdwXviquQdjjx09qr2+0t6KfcKtYV - Sl7kHujnUH6wuvSJbGQYBREvaTVChE342enIpT1v1FvjuBiVE2QddVSup/VFjQk+T62H - sj2Q==; + b=O2BjkV3K6AsqDUL1M+z2g2jZxwZHFDn0VR2ocFHjf2dSGTxaWyJJrF4F1J6Ivn0xqu + 6wfXVj2vlm5SqvyJA5zySLuN/fMhqnNwWTtNC07JHVfWIQOurGVD6ADXb02wT3UrdRsX + Gi5Hnx7VWkVTN6tpnv9xUjQMGAcmz9OF2axehZBqYZiyVss31tDWucKgP3e4/zAd2KH3 + ohjL81q8uCWeQqteH87rdDapZpvvuTwddZ0wJIrXeru4qkkNYzf6kcQ3UiQnfpH8yjTA + P1b7JdnX2dZzok/UR10vrTt0Guw7GsesbiUF2TjffIkYl6NLGDy7VTR/nSwTEW34Ipu6 + UURQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=WywB1xXZ; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=Y9Hw3mvz; spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id d2e1a72fcca58-715e55abe12sor13266300b3a.5.2024.09.06.07.06.34 + by mx.google.com with SMTPS id d9443c01a7336-2068b78ea4asor83051425ad.12.2024.09.06.08.50.39 for (Google Transport Security); - Fri, 06 Sep 2024 07:06:34 -0700 (PDT) + Fri, 06 Sep 2024 08:50:39 -0700 (PDT) Received-SPF: pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=WywB1xXZ; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=Y9Hw3mvz; spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725631593; x=1726236393; dara=google.com; + d=gmail.com; s=20230601; t=1725637839; x=1726242639; dara=google.com; h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=+En5H5Kcpi9ycUXdozwu24rETB0V0u4ugKt6BTYwkcQ=; - b=WywB1xXZCLm8cOOVfPhl2kruueWi4gv4RLHnFp0W9LKIwGgUjBfseAZ/kOcxFfB75f - zL6u50Xt8+P34InxQBZ7OSMAcF3RKs325DTmAVbHG7JWMTu37k65t6/Jx/IQypK5Gjku - lI6SVtdL/09Q3kam8+9av0q9Yk2PUJhNoUsk3ehoorTrdbOMdvouk06jhzkXGQSwJCqB - 6wjf2dPocmVZKH7QRK6l3KhDEKW1wOb2jrAq2kI+TcsRss5YqFh0v/erXcZcDaJpIZsC - u3+Mz6+o/8K5s3cqn/x371LuOr65oarNylYSsQA8/dg9T0PJ6wvUUgpJY+Jy/uz3PIm3 - U7LQ== + bh=r7rF/jG1IIgCj5l2v1qn74V4v31Wj5mEk1ZeR+AbNFM=; + b=Y9Hw3mvz57NZD2prFl2siJqbw22eRla3tVnCYYP77QkwEjFMOfQOpsfqcWwClSSqJs + 4AHdJY+0CKOmLjKExQ/hYc/syVVfcqA8n4b5oVDbfy06XDdMJpfckOrlRDZ+Cbm08tKU + z4MaFcbBSwZt0NggdYhRHJp6VOP/wkemzlwwUK/CCZ5IYOUInXxwfF2ldwIY55M3bEQI + 687rn5XD+jc7QjtPkjZLA3YAWSkwLMjywWNkl4LExMPEbreQyVxSCXlDriZXTn2qntOD + dwC4cicih5wRfknqNxIIYIshvZDIylhV3Jf7fCqolNLYjYl8DMkBMC2uffrjERfo9eya + FxAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725631593; x=1726236393; + d=1e100.net; s=20230601; t=1725637839; x=1726242639; h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=+En5H5Kcpi9ycUXdozwu24rETB0V0u4ugKt6BTYwkcQ=; - b=bBbSG2jjtoOllwizKkiuKkUS7AXrRzvSSKnrxWoZO2dYJHRfJjUYd6kQ8XjQgJYS3m - eZr57zXGS/G7cMgLDMVm+sGkoBo5iV7Tk90P+x9siUw6Brwxk+1ruCo/pf5kz4GE+Ja4 - kp7oll0yFX/dE5NQNJQzjrsqpiSLcZBwuE3iT2sEXtZoCWjEuzgIPrUln2/j8Ggda1oW - KMIfvxbTMZcLHSixd6mGivJjYXA1XGH3JcHK4gKAisI6qg9yXYH7m5jxjmv6IznDs9XS - rpDy6hOlnXbGfVBuLmUof1oU2dR9QXaiHQLODOGaKuRrjLGct/p3LsARnyVe+T1VAZYe - 6mrA== -X-Gm-Message-State: AOJu0Yzv29u77x2u/C79smZesVRXqC7rtg64pBOWUSNLMwHl5hYAzypR - 63JXpRqVsZiuTdbP0vm/O2UuKnziesKo1QIWLR37JwxyN6lAAJgsALL/eg== -X-Google-Smtp-Source: AGHT+IEK+LRrIsxXjaaMlPKWOhcGBo+ENzGR0Ye63iYyYL191jCIv7dpWYLMZsS9PezP/GYaKJZRYg== -X-Received: by 2002:a05:6a21:6b86:b0:1c6:a576:4252 with SMTP id adf61e73a8af0-1cf1d059ce8mr2470747637.8.1725631592736; - Fri, 06 Sep 2024 07:06:32 -0700 (PDT) + bh=r7rF/jG1IIgCj5l2v1qn74V4v31Wj5mEk1ZeR+AbNFM=; + b=JStPHuR05VmxJ83N4tvsRWcPd4/IyvjM8qzKsk7gg2yIIn9Olqzm5RcmdzleYNItt8 + eScfIq+znAjmEX6sYIV6XzSraNdCRBoznnki0A9deJf8wpWAenU+G+j2kHnqNL0K8ZvH + tsB+g111feWk6j7Pb7+UmZwEhzW+hUPWEn8W1Y0HZA18eDm+KT535aE1Cmsn7a2EIsP4 + S60k4YxLXb6gycUEzB9duvoz/eM7cKcuC44le3Lpr5ThO9kWtYq3kt7TFeGU/B3oPHwY + Dz2A7WJMEHG+OW+XQql3m2BP0WSqrOFQejpn23LqluJ85wlz2MReV6eKATMi7zCiOlPs + b4FQ== +X-Gm-Message-State: AOJu0YxGAo0UMdPPmSJTQYE+xTbAo/8Bn7mhXy4ldHlUCBmJ3d0AWyje + xUKE6H/Ann2vBJmbW8db1ON1EvCpd/JQXnxIhXD92H2v+1eavqiMbbn/vA== +X-Google-Smtp-Source: AGHT+IEp1etgXiS/CaTTDtadiWXBD4axZ2BtEKvIwz2SYeOko6Ts6ncVN2SHuqpZVrBMd2E5CwET6g== +X-Received: by 2002:a17:90b:4b11:b0:2d3:dd48:992c with SMTP id 98e67ed59e1d1-2dad504aa69mr3827499a91.23.1725637838520; + Fri, 06 Sep 2024 08:50:38 -0700 (PDT) Return-Path: Received: from SoraMacBook-4.local ([86.48.13.220]) - by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7d4fbda7b67sm4879875a12.72.2024.09.06.07.06.30 + by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2dadbfe45fbsm1753107a91.6.2024.09.06.08.50.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Fri, 06 Sep 2024 07:06:31 -0700 (PDT) -Message-ID: <66db0c67.630a0220.483ad.1969@mx.google.com> -Date: Fri, 06 Sep 2024 07:06:31 -0700 (PDT) -Content-Type: multipart/alternative; boundary="===============2549133918967816067==" + Fri, 06 Sep 2024 08:50:38 -0700 (PDT) +Message-ID: <66db24ce.170a0220.2673da.5f04@mx.google.com> +Date: Fri, 06 Sep 2024 08:50:38 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============0012875658589814522==" MIME-Version: 1.0 From: emaiwallet.alice@gmail.com To: suegamisora@gmail.com -Subject: Email Account Recovery Test1 +Subject: Email Account Recovery Test2 ---===============2549133918967816067== +--===============0012875658589814522== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable @@ -93,10 +93,9 @@ Content-Type: text/html; charset=utf-8

This is a test email with a basic HTML body.

Set the new signer of 0x0C06688e61C06466E2a5C6f= -=3D E4E15c359260a33f3 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
=20 ---===============2549133918967816067==-- +--===============0012875658589814522==-- From d2f59da7ec5b9d64d3498d05494a662bfa39a84d Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Fri, 6 Sep 2024 16:23:59 +0000 Subject: [PATCH 036/121] fix: body parsing test --- Cargo.lock | 2 +- .../email_auth_with_body_parsing.test.ts | 31 +++++++------------ yarn.lock | 8 ++--- 3 files changed, 17 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 85266137..d66ee7e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4138,7 +4138,7 @@ dependencies = [ [[package]] name = "relayer-utils" -version = "0.3.6" +version = "0.3.5" dependencies = [ "anyhow", "base64 0.21.7", diff --git a/packages/circuits/tests/email_auth_with_body_parsing.test.ts b/packages/circuits/tests/email_auth_with_body_parsing.test.ts index 319165d2..df9a8239 100644 --- a/packages/circuits/tests/email_auth_with_body_parsing.test.ts +++ b/packages/circuits/tests/email_auth_with_body_parsing.test.ts @@ -91,13 +91,13 @@ describe("Email Auth With Body Parsing", () => { const accountCode = "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - const { subject_idx, ...circuitInputsRelevant } = + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { maxHeaderLength: 640, maxBodyLength: 768, ignoreBodyHashCheck: false, }); - const witness = await circuit.calculateWitness(circuitInputsRelevant); + const witness = await circuit.calculateWitness(circuitInputs); await circuit.checkConstraints(witness); const domainName = "gmail.com"; @@ -158,13 +158,13 @@ describe("Email Auth With Body Parsing", () => { const accountCode = "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - const { subject_idx, ...circuitInputsRelevant } = + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { maxHeaderLength: 640, maxBodyLength: 768, ignoreBodyHashCheck: false, }); - const witness = await circuit.calculateWitness(circuitInputsRelevant); + const witness = await circuit.calculateWitness(circuitInputs); await circuit.checkConstraints(witness); const domainName = "gmail.com"; @@ -225,14 +225,14 @@ describe("Email Auth With Body Parsing", () => { const accountCode = "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - const { subject_idx, ...circuitInputsRelevant } = + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { maxHeaderLength: 640, maxBodyLength: 768, ignoreBodyHashCheck: false, shaPrecomputeSelector: '(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?"(=\r\n)?[^"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^"]*(=\r\n)?"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?([^<>/]+)(<(=\r\n)?/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>(=\r\n)?)', }); - const witness = await circuit.calculateWitness(circuitInputsRelevant); + const witness = await circuit.calculateWitness(circuitInputs); await circuit.checkConstraints(witness); const domainName = "gmail.com"; @@ -293,15 +293,13 @@ describe("Email Auth With Body Parsing", () => { const accountCode = await relayerUtils.genAccountCode(); - const { subject_idx, ...circuitInputsRelevant } = + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { maxHeaderLength: 640, maxBodyLength: 768, ignoreBodyHashCheck: false, }); - circuitInputsRelevant.padded_cleaned_body = - circuitInputsRelevant.padded_body; - const witness = await circuit.calculateWitness(circuitInputsRelevant); + const witness = await circuit.calculateWitness(circuitInputs); await circuit.checkConstraints(witness); const domainName = "gmail.com"; @@ -360,15 +358,13 @@ describe("Email Auth With Body Parsing", () => { const parsedEmail = await relayerUtils.parseEmail(emailRaw); const accountCode = await relayerUtils.genAccountCode(); - const { subject_idx, ...circuitInputsRelevant } = + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { maxHeaderLength: 640, maxBodyLength: 768, ignoreBodyHashCheck: false, }); - circuitInputsRelevant.padded_cleaned_body = - circuitInputsRelevant.padded_body; - const witness = await circuit.calculateWitness(circuitInputsRelevant); + const witness = await circuit.calculateWitness(circuitInputs); await circuit.checkConstraints(witness); const domainName = "gmail.com"; @@ -428,16 +424,13 @@ describe("Email Auth With Body Parsing", () => { const accountCode = await relayerUtils.genAccountCode(); - const { subject_idx, ...circuitInputsRelevant } = + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { maxHeaderLength: 640, maxBodyLength: 768, ignoreBodyHashCheck: false, }); - circuitInputsRelevant.padded_cleaned_body = - circuitInputsRelevant.padded_body; - - const witness = await circuit.calculateWitness(circuitInputsRelevant); + const witness = await circuit.calculateWitness(circuitInputs); await circuit.checkConstraints(witness); const domainName = "gmail.com"; diff --git a/yarn.lock b/yarn.lock index a5e491b7..dd845b0b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1818,10 +1818,10 @@ "@openzeppelin/contracts" "^5.0.0" dotenv "^16.3.1" -"@zk-email/relayer-utils@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@zk-email/relayer-utils/-/relayer-utils-0.3.5.tgz#1306001d39c489dfff65a974e037d97976c37a63" - integrity sha512-Z2IN6DZvjPlALT0J1phWqljvqGzNxCs7l0VCWUpjJsAmzsozi9/EF8wVWmOGi41THgv5vxwlnnnzs/cHJjeGcA== +"@zk-email/relayer-utils@^0.3.6": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@zk-email/relayer-utils/-/relayer-utils-0.3.6.tgz#55d0109b57b7f19e2441c90a55ed8096dfdaefe4" + integrity sha512-j3xjcKmG2rMdwvg462s6QQ+CRr29mOT6uYq57rotg64c4UbvPWvhcuuJ7C7qc2wUl4bhShuBz1NoE8e2jkwHOw== dependencies: "@mapbox/node-pre-gyp" "^1.0" cargo-cp-artifact "^0.1" From 74c45570130d31b66ac811420486d85016b7961e Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sat, 7 Sep 2024 02:40:45 +0530 Subject: [PATCH 037/121] feat: complete flow --- Cargo.lock | 3 +- packages/circuits/package.json | 2 +- packages/relayer/Cargo.toml | 2 +- .../eml_templates/recovery_request.html | 1 + packages/relayer/src/core.rs | 209 ++++-------------- packages/relayer/src/database.rs | 1 - packages/relayer/src/modules/mail.rs | 7 +- .../src/modules/web_server/rest_api.rs | 18 +- .../relayer/src/utils/subject_templates.rs | 10 +- 9 files changed, 58 insertions(+), 195 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d66ee7e0..ef6274cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4138,7 +4138,8 @@ dependencies = [ [[package]] name = "relayer-utils" -version = "0.3.5" +version = "0.3.7" +source = "git+https://github.com/zkemail/relayer-utils.git#c9371a327fecb422f5e0f015ebca9199a06b658f" dependencies = [ "anyhow", "base64 0.21.7", diff --git a/packages/circuits/package.json b/packages/circuits/package.json index 2bc63094..964439a1 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -13,7 +13,7 @@ "dependencies": { "@zk-email/circuits": "^6.1.5", "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.3.6", + "@zk-email/relayer-utils": "^0.3.7", "commander": "^11.0.0", "snarkjs": "^0.7.0" }, diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 5a279ef4..7fac6c4e 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -24,7 +24,7 @@ serde_json = "1.0.68" tiny_http = "0.12.0" lettre = { version = "0.10.4", features = ["tokio1", "tokio1-native-tls"] } ethers = { version = "2.0.10", features = ["abigen"] } -relayer-utils = { path = "../../../relayer-utils" } +relayer-utils = { version = "0.3.7", git = "https://github.com/zkemail/relayer-utils.git" } futures = "0.3.28" sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } regex = "1.10.2" diff --git a/packages/relayer/eml_templates/recovery_request.html b/packages/relayer/eml_templates/recovery_request.html index efb9d9ae..0081a8a6 100644 --- a/packages/relayer/eml_templates/recovery_request.html +++ b/packages/relayer/eml_templates/recovery_request.html @@ -414,5 +414,6 @@   +
{{command}}
diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 36c08eae..10269361 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -20,7 +20,7 @@ pub async fn handle_email(email: String) -> Result { let guardian_email_addr = parsed_email.get_from_addr()?; let padded_from_addr = PaddedEmailAddr::from_email_addr(&guardian_email_addr); trace!(LOG, "From address: {}", guardian_email_addr); - let email_body = parsed_email.get_body()?; + let email_body = parsed_email.get_cleaned_body()?; let request_decomposed_def = serde_json::from_str(include_str!("./regex_json/request_def.json"))?; @@ -66,17 +66,17 @@ pub async fn handle_email(email: String) -> Result { .await?; if let Ok(invitation_code) = parsed_email.get_invitation_code(false) { - trace!(LOG, "Email with account code"); - - if account_code_str != invitation_code { - return Err(anyhow!( - "Stored account code is not equal to one in the email. Stored: {}, Email: {}", - account_code_str, - invitation_code - )); - } - if !request.is_for_recovery { + trace!(LOG, "Email with account code"); + + if account_code_str != invitation_code { + return Err(anyhow!( + "Stored account code is not equal to one in the email. Stored: {}, Email: {}", + account_code_str, + invitation_code + )); + } + let command_template = CLIENT .get_acceptance_subject_templates( &request.controller_eth_addr, @@ -84,19 +84,16 @@ pub async fn handle_email(email: String) -> Result { ) .await?; - let result = - extract_template_vals_and_skipped_subject_idx(&email_body, command_template); - let (command_params, skipped_command_prefix) = match result { - Ok((command_params, skipped_command_prefix)) => { - (command_params, skipped_command_prefix) - } - Err(e) => { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: format!("Invalid Subject, {}", e), - }); - } - }; + let command_params = + match extract_template_vals_from_command(&email_body, command_template) { + Ok(command_params) => command_params, + Err(e) => { + return Ok(EmailAuthEvent::Error { + email_addr: guardian_email_addr, + error: format!("Invalid Subject, {}", e), + }); + } + }; let command_params_encoded: Vec = command_params .iter() @@ -220,129 +217,10 @@ pub async fn handle_email(email: String) -> Result { Err(e) => Err(anyhow!("Failed to handle acceptance: {}", e)), } } else { - let command_template = CLIENT - .get_recovery_subject_templates(&request.controller_eth_addr, request.template_idx) - .await?; - - let result = - extract_template_vals_and_skipped_subject_idx(&email_body, command_template); - let (command_params, skipped_command_prefix) = match result { - Ok((command_params, skipped_command_prefix)) => { - (command_params, skipped_command_prefix) - } - Err(e) => { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: format!("Invalid Subject, {}", e), - }); - } - }; - - let command_params_encoded: Vec = command_params - .iter() - .map(|param| param.abi_encode(None).unwrap()) - .collect(); - - let tokens = vec![ - Token::Uint((*EMAIL_ACCOUNT_RECOVERY_VERSION_ID.get().unwrap()).into()), - Token::String("RECOVERY".to_string()), - Token::Uint(request.template_idx.into()), - ]; - - let template_id = keccak256(encode(&tokens)); - - let circuit_input = generate_email_circuit_input( - &email, - &AccountCode::from(hex_to_field(&format!("0x{}", &account_code_str))?), - None, - ) - .await?; - - let (proof, public_signals) = - generate_proof(&circuit_input, "email_auth", PROVER_ADDRESS.get().unwrap()).await?; - - let account_salt = u256_to_bytes32(&public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 3]); - let is_code_exist = public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); - let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; - - let email_proof = EmailProof { - proof: proof, - domain_name: parsed_email.get_email_domain()?, - public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), - timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_subject: masked_command, - email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), - account_salt, - is_code_exist, - }; - - let email_auth_msg = EmailAuthMsg { - template_id: template_id.into(), - subject_params: command_params_encoded, - skiped_subject_prefix: skipped_command_prefix.into(), - proof: email_proof.clone(), - }; - - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); - info!(LOG, "Request: {:?}", request); - - match CLIENT - .handle_recovery( - &request.controller_eth_addr, - email_auth_msg, - request.template_idx, - ) - .await - { - Ok(true) => { - let updated_request = Request { - account_eth_addr: request.account_eth_addr.clone(), - controller_eth_addr: request.controller_eth_addr.clone(), - guardian_email_addr: guardian_email_addr.clone(), - template_idx: request.template_idx, - is_for_recovery: request.is_for_recovery, - is_processed: true, - request_id: request.request_id, - is_success: Some(true), - email_nullifier: Some(field_to_hex( - &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), - )), - account_salt: Some(bytes32_to_hex(&account_salt)), - }; - - DB.update_request(&updated_request).await?; - - Ok(EmailAuthEvent::RecoverySuccess { - account_eth_addr: request.account_eth_addr, - guardian_email_addr, - request_id: request_id_u32, - }) - } - Ok(false) => { - let updated_request = Request { - account_eth_addr: request.account_eth_addr.clone(), - controller_eth_addr: request.controller_eth_addr.clone(), - guardian_email_addr: guardian_email_addr.clone(), - template_idx: request.template_idx, - is_for_recovery: request.is_for_recovery, - is_processed: true, - request_id: request.request_id, - is_success: Some(false), - email_nullifier: Some(field_to_hex( - &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), - )), - account_salt: Some(bytes32_to_hex(&account_salt)), - }; - - DB.update_request(&updated_request).await?; - - Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: "Failed to handle recovery".to_string(), - }) - } - Err(e) => Err(anyhow!("Failed to handle recovery: {}", e)), - } + return Ok(EmailAuthEvent::Error { + email_addr: guardian_email_addr, + error: "Account code found and for recovery".to_string(), + }); } } else { if request.is_for_recovery { @@ -350,19 +228,16 @@ pub async fn handle_email(email: String) -> Result { .get_recovery_subject_templates(&request.controller_eth_addr, request.template_idx) .await?; - let result = - extract_template_vals_and_skipped_subject_idx(&email_body, command_template); - let (command_params, skipped_command_prefix) = match result { - Ok((command_params, skipped_command_prefix)) => { - (command_params, skipped_command_prefix) - } - Err(e) => { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: format!("Invalid Subject, {}", e), - }); - } - }; + let command_params = + match extract_template_vals_from_command(&email_body, command_template) { + Ok(command_params) => command_params, + Err(e) => { + return Ok(EmailAuthEvent::Error { + email_addr: guardian_email_addr, + error: format!("Invalid Subject, {}", e), + }); + } + }; let command_params_encoded: Vec = command_params .iter() @@ -380,7 +255,12 @@ pub async fn handle_email(email: String) -> Result { let circuit_input = generate_email_circuit_input( &email, &AccountCode::from(hex_to_field(&format!("0x{}", &account_code_str))?), - None, + Some(EmailCircuitParams { + max_header_length: Some(1024), + max_body_length: Some(1024), + sha_precompute_selector: Some(SHA_PRECOMPUTE_SELECTOR.to_string()), + ignore_body_hash_check: Some(false), + }), ) .await?; @@ -405,13 +285,10 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), subject_params: command_params_encoded, - skiped_subject_prefix: skipped_command_prefix.into(), + skiped_subject_prefix: 0.into(), proof: email_proof.clone(), }; - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); - info!(LOG, "Request: {:?}", request); - match CLIENT .handle_recovery( &request.controller_eth_addr, @@ -472,7 +349,7 @@ pub async fn handle_email(email: String) -> Result { } else { return Ok(EmailAuthEvent::Error { email_addr: guardian_email_addr, - error: "No account code found".to_string(), + error: "No account code found and not for recovery".to_string(), }); } } diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs index 3d0499a8..acd74822 100644 --- a/packages/relayer/src/database.rs +++ b/packages/relayer/src/database.rs @@ -74,7 +74,6 @@ impl Database { } pub(crate) async fn get_credentials(&self, account_code: &str) -> Result> { - println!("account_code: {}", account_code); let row = sqlx::query("SELECT * FROM credentials WHERE account_code = $1") .bind(account_code) .fetch_optional(&self.db) diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs index 3cb110c5..0e0919e4 100644 --- a/packages/relayer/src/modules/mail.rs +++ b/packages/relayer/src/modules/mail.rs @@ -25,7 +25,7 @@ pub enum EmailAuthEvent { account_eth_addr: String, guardian_email_addr: String, request_id: u32, - subject: String, + command: String, }, AcceptanceSuccess { account_eth_addr: String, @@ -174,7 +174,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<()> { account_eth_addr, guardian_email_addr, request_id, - subject, + command, } => { let body_plain = format!( "You have received a recovery request from the wallet address {}. \ @@ -184,9 +184,12 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<()> { account_eth_addr, request_id ); + let subject = format!("Email Recovery: Recovery Request"); + let render_data = serde_json::json!({ "userEmailAddr": guardian_email_addr, "walletAddress": account_eth_addr, + "command": command, "requestId": request_id, }); let body_html = render_html("recovery_request.html", render_data).await?; diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 261a0bf4..7b2aa480 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -110,15 +110,11 @@ pub async fn request_status_api(payload: RequestStatusRequest) -> Result Response { - println!("Account Code: {:?}", payload.account_code); - let subject_template = CLIENT .get_acceptance_subject_templates(&payload.controller_eth_addr, payload.template_idx) .await .unwrap(); - println!("Subject template: {:?}", subject_template); - let subject_params = extract_template_vals(&payload.subject, subject_template); if subject_params.is_err() { @@ -139,12 +135,8 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response Response = // serde_json::from_str(include_str!("../../permitted_wallets.json")).unwrap(); @@ -204,8 +194,6 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response Response(); - println!("Request ID: {:?}", request_id); while let Ok(Some(request)) = DB.get_request(request_id).await { request_id = rand::thread_rng().gen::(); } let account_salt = calculate_account_salt(&payload.guardian_email_addr, &payload.account_code); - println!("Account Salt: {:?}", account_salt); if DB .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) @@ -502,7 +486,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), request_id, - subject: payload.subject.clone(), + command: payload.subject.clone(), }) .await .expect("Failed to send Recovery event"); diff --git a/packages/relayer/src/utils/subject_templates.rs b/packages/relayer/src/utils/subject_templates.rs index 621bb408..fbffde21 100644 --- a/packages/relayer/src/utils/subject_templates.rs +++ b/packages/relayer/src/utils/subject_templates.rs @@ -49,10 +49,10 @@ impl TemplateValue { } } -pub fn extract_template_vals_and_skipped_subject_idx( +pub fn extract_template_vals_from_command( input: &str, templates: Vec, -) -> Result<(Vec, usize), anyhow::Error> { +) -> Result, anyhow::Error> { // Convert the template to a regex pattern, escaping necessary characters and replacing placeholders let pattern = templates .iter() @@ -77,7 +77,7 @@ pub fn extract_template_vals_and_skipped_subject_idx( // Extract the values based on the matched pattern let current_input = &input[skipped_bytes..]; match extract_template_vals(current_input, templates) { - Ok(vals) => Ok((vals, skipped_bytes)), + Ok(vals) => Ok(vals), Err(e) => Err(e), } } else { @@ -151,9 +151,7 @@ pub fn extract_template_vals(input: &str, templates: Vec) -> Result().unwrap(); From cdf17ecc502449ec68c6c029a96546e2898eb1e8 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Sun, 8 Sep 2024 00:10:39 +0900 Subject: [PATCH 038/121] Replace subject with command. --- .../contracts/src/EmailAccountRecovery.sol | 183 +++++++++--------- packages/contracts/src/EmailAuth.sol | 104 +++++----- .../{SubjectUtils.sol => CommandUtils.sol} | 36 ++-- packages/contracts/src/utils/Verifier.sol | 4 +- .../contracts/test/DKIMRegistryUpgrade.t.sol | 10 +- .../contracts/test/EmailAccountRecovery.t.sol | 112 +++++------ ...mailAccountRecoveryForRejectRecovery.t.sol | 26 +-- packages/contracts/test/EmailAuth.t.sol | 120 ++++++------ .../EmailAuthWithUserOverrideableDkim.t.sol | 10 +- packages/contracts/test/Integration.t.sol | 26 +-- .../test/helpers/DeploymentHelper.sol | 8 +- .../test/helpers/RecoveryController.sol | 40 ++-- .../contracts/test/helpers/StructHelper.sol | 12 +- packages/prover/Dockerfile | 1 - 14 files changed, 345 insertions(+), 347 deletions(-) rename packages/contracts/src/libraries/{SubjectUtils.sol => CommandUtils.sol} (82%) diff --git a/packages/contracts/src/EmailAccountRecovery.sol b/packages/contracts/src/EmailAccountRecovery.sol index 5de05919..0fa61497 100644 --- a/packages/contracts/src/EmailAccountRecovery.sol +++ b/packages/contracts/src/EmailAccountRecovery.sol @@ -16,7 +16,8 @@ abstract contract EmailAccountRecovery { address public verifierAddr; address public dkimAddr; address public emailAuthImplementationAddr; - bytes32 public proxyBytecodeHash = 0x0100008338d33e12c716a5b695c6f7f4e526cf162a9378c0713eea5386c09951; + bytes32 public proxyBytecodeHash = + 0x0100008338d33e12c716a5b695c6f7f4e526cf162a9378c0713eea5386c09951; /// @notice Returns the address of the verifier contract. /// @dev This function is virtual and can be overridden by inheriting contracts. @@ -48,53 +49,53 @@ abstract contract EmailAccountRecovery { address recoveredAccount ) public view virtual returns (bool); - /// @notice Returns a two-dimensional array of strings representing the subject templates for an acceptance by a new guardian's. - /// @dev This function is virtual and should be implemented by inheriting contracts to define specific acceptance subject templates. - /// @return string[][] A two-dimensional array of strings, where each inner array represents a set of fixed strings and matchers for a subject template. - function acceptanceSubjectTemplates() + /// @notice Returns a two-dimensional array of strings representing the command templates for an acceptance by a new guardian's. + /// @dev This function is virtual and should be implemented by inheriting contracts to define specific acceptance command templates. + /// @return string[][] A two-dimensional array of strings, where each inner array represents a set of fixed strings and matchers for a command template. + function acceptanceCommandTemplates() public view virtual returns (string[][] memory); - /// @notice Returns a two-dimensional array of strings representing the subject templates for email recovery. - /// @dev This function is virtual and should be implemented by inheriting contracts to define specific recovery subject templates. - /// @return string[][] A two-dimensional array of strings, where each inner array represents a set of fixed strings and matchers for a subject template. - function recoverySubjectTemplates() + /// @notice Returns a two-dimensional array of strings representing the command templates for email recovery. + /// @dev This function is virtual and should be implemented by inheriting contracts to define specific recovery command templates. + /// @return string[][] A two-dimensional array of strings, where each inner array represents a set of fixed strings and matchers for a command template. + function recoveryCommandTemplates() public view virtual returns (string[][] memory); - /// @notice Extracts the account address to be recovered from the subject parameters of an acceptance email. - /// @dev This function is virtual and should be implemented by inheriting contracts to extract the account address from the subject parameters. - /// @param subjectParams The subject parameters of the acceptance email. - /// @param templateIdx The index of the acceptance subject template. - function extractRecoveredAccountFromAcceptanceSubject( - bytes[] memory subjectParams, + /// @notice Extracts the account address to be recovered from the command parameters of an acceptance email. + /// @dev This function is virtual and should be implemented by inheriting contracts to extract the account address from the command parameters. + /// @param commandParams The command parameters of the acceptance email. + /// @param templateIdx The index of the acceptance command template. + function extractRecoveredAccountFromAcceptanceCommand( + bytes[] memory commandParams, uint templateIdx ) public view virtual returns (address); - /// @notice Extracts the account address to be recovered from the subject parameters of a recovery email. - /// @dev This function is virtual and should be implemented by inheriting contracts to extract the account address from the subject parameters. - /// @param subjectParams The subject parameters of the recovery email. - /// @param templateIdx The index of the recovery subject template. - function extractRecoveredAccountFromRecoverySubject( - bytes[] memory subjectParams, + /// @notice Extracts the account address to be recovered from the command parameters of a recovery email. + /// @dev This function is virtual and should be implemented by inheriting contracts to extract the account address from the command parameters. + /// @param commandParams The command parameters of the recovery email. + /// @param templateIdx The index of the recovery command template. + function extractRecoveredAccountFromRecoveryCommand( + bytes[] memory commandParams, uint templateIdx ) public view virtual returns (address); function acceptGuardian( address guardian, uint templateIdx, - bytes[] memory subjectParams, + bytes[] memory commandParams, bytes32 emailNullifier ) internal virtual; function processRecovery( address guardian, uint templateIdx, - bytes[] memory subjectParams, + bytes[] memory commandParams, bytes32 emailNullifier ) internal virtual; @@ -127,9 +128,7 @@ abstract contract EmailAccountRecovery { L2ContractHelper.computeCreate2Address( address(this), accountSalt, - bytes32( - proxyBytecodeHash - ), + bytes32(proxyBytecodeHash), keccak256( abi.encode( emailAuthImplementation(), @@ -164,10 +163,10 @@ abstract contract EmailAccountRecovery { } } - /// @notice Calculates a unique subject template ID for an acceptance subject template using its index. + /// @notice Calculates a unique command template ID for an acceptance command template using its index. /// @dev Encodes the email account recovery version ID, "ACCEPTANCE", and the template index, /// then uses keccak256 to hash these values into a uint ID. - /// @param templateIdx The index of the acceptance subject template. + /// @param templateIdx The index of the acceptance command template. /// @return uint The computed uint ID. function computeAcceptanceTemplateId( uint templateIdx @@ -184,10 +183,10 @@ abstract contract EmailAccountRecovery { ); } - /// @notice Calculates a unique ID for a recovery subject template using its index. + /// @notice Calculates a unique ID for a recovery command template using its index. /// @dev Encodes the email account recovery version ID, "RECOVERY", and the template index, /// then uses keccak256 to hash these values into a uint256 ID. - /// @param templateIdx The index of the recovery subject template. + /// @param templateIdx The index of the recovery command template. /// @return uint The computed uint ID. function computeRecoveryTemplateId( uint templateIdx @@ -206,13 +205,13 @@ abstract contract EmailAccountRecovery { /// @notice Handles an acceptance by a new guardian. /// @dev This function validates the email auth message, deploys a new EmailAuth contract as a proxy if validations pass and initializes the contract. /// @param emailAuthMsg The email auth message for the email send from the guardian. - /// @param templateIdx The index of the subject template for acceptance, which should match with the subject in the given email auth message. + /// @param templateIdx The index of the command template for acceptance, which should match with the command in the given email auth message. function handleAcceptance( EmailAuthMsg memory emailAuthMsg, uint templateIdx ) external { - address recoveredAccount = extractRecoveredAccountFromAcceptanceSubject( - emailAuthMsg.subjectParams, + address recoveredAccount = extractRecoveredAccountFromAcceptanceCommand( + emailAuthMsg.commandParams, templateIdx ); require(recoveredAccount != address(0), "invalid account in email"); @@ -226,67 +225,73 @@ abstract contract EmailAccountRecovery { EmailAuth guardianEmailAuth; if (guardian.code.length == 0) { - // // Deploy proxy of the guardian's EmailAuth contract - // if (block.chainid == 324 || block.chainid == 300) { - // (bool success, bytes memory returnData) = SystemContractsCaller - // .systemCallWithReturndata( - // uint32(gasleft()), - // address(DEPLOYER_SYSTEM_CONTRACT), - // uint128(0), - // abi.encodeCall( - // DEPLOYER_SYSTEM_CONTRACT.create2, - // ( - // emailAuthMsg.proof.accountSalt, - // proxyBytecodeHash, - // abi.encode( - // emailAuthImplementation(), - // abi.encodeCall( - // EmailAuth.initialize, - // ( - // recoveredAccount, - // emailAuthMsg.proof.accountSalt, - // address(this) - // ) - // ) - // ) - // ) - // ) - // ); - // address payable proxyAddress = abi.decode(returnData, (address)); - // ERC1967Proxy proxy = ERC1967Proxy(proxyAddress); - // guardianEmailAuth = EmailAuth(address(proxy)); - // guardianEmailAuth.initialize( - // recoveredAccount, - // emailAuthMsg.proof.accountSalt, - // address(this) - // ); - // } else { - // Deploy proxy of the guardian's EmailAuth contract - ERC1967Proxy proxy = new ERC1967Proxy{salt: emailAuthMsg.proof.accountSalt}( - emailAuthImplementation(), - abi.encodeCall( - EmailAuth.initialize, - (recoveredAccount, emailAuthMsg.proof.accountSalt, address(this)) + // // Deploy proxy of the guardian's EmailAuth contract + // if (block.chainid == 324 || block.chainid == 300) { + // (bool success, bytes memory returnData) = SystemContractsCaller + // .systemCallWithReturndata( + // uint32(gasleft()), + // address(DEPLOYER_SYSTEM_CONTRACT), + // uint128(0), + // abi.encodeCall( + // DEPLOYER_SYSTEM_CONTRACT.create2, + // ( + // emailAuthMsg.proof.accountSalt, + // proxyBytecodeHash, + // abi.encode( + // emailAuthImplementation(), + // abi.encodeCall( + // EmailAuth.initialize, + // ( + // recoveredAccount, + // emailAuthMsg.proof.accountSalt, + // address(this) + // ) + // ) + // ) + // ) + // ) + // ); + // address payable proxyAddress = abi.decode(returnData, (address)); + // ERC1967Proxy proxy = ERC1967Proxy(proxyAddress); + // guardianEmailAuth = EmailAuth(address(proxy)); + // guardianEmailAuth.initialize( + // recoveredAccount, + // emailAuthMsg.proof.accountSalt, + // address(this) + // ); + // } else { + // Deploy proxy of the guardian's EmailAuth contract + ERC1967Proxy proxy = new ERC1967Proxy{ + salt: emailAuthMsg.proof.accountSalt + }( + emailAuthImplementation(), + abi.encodeCall( + EmailAuth.initialize, + ( + recoveredAccount, + emailAuthMsg.proof.accountSalt, + address(this) ) - ); - guardianEmailAuth = EmailAuth(address(proxy)); - // } + ) + ); + guardianEmailAuth = EmailAuth(address(proxy)); + // } guardianEmailAuth.initDKIMRegistry(dkim()); guardianEmailAuth.initVerifier(verifier()); for ( uint idx = 0; - idx < acceptanceSubjectTemplates().length; + idx < acceptanceCommandTemplates().length; idx++ ) { - guardianEmailAuth.insertSubjectTemplate( + guardianEmailAuth.insertCommandTemplate( computeAcceptanceTemplateId(idx), - acceptanceSubjectTemplates()[idx] + acceptanceCommandTemplates()[idx] ); } - for (uint idx = 0; idx < recoverySubjectTemplates().length; idx++) { - guardianEmailAuth.insertSubjectTemplate( + for (uint idx = 0; idx < recoveryCommandTemplates().length; idx++) { + guardianEmailAuth.insertCommandTemplate( computeRecoveryTemplateId(idx), - recoverySubjectTemplates()[idx] + recoveryCommandTemplates()[idx] ); } } else { @@ -303,22 +308,22 @@ abstract contract EmailAccountRecovery { acceptGuardian( guardian, templateIdx, - emailAuthMsg.subjectParams, + emailAuthMsg.commandParams, emailAuthMsg.proof.emailNullifier ); } /// @notice Processes the recovery based on an email from the guardian. - /// @dev Verify the provided email auth message for a deployed guardian's EmailAuth contract and a specific subject template for recovery. + /// @dev Verify the provided email auth message for a deployed guardian's EmailAuth contract and a specific command template for recovery. /// Requires that the guardian is already deployed, and the template ID corresponds to the `templateId` in the given email auth message. Once validated. /// @param emailAuthMsg The email auth message for recovery. - /// @param templateIdx The index of the subject template for recovery, which should match with the subject in the given email auth message. + /// @param templateIdx The index of the command template for recovery, which should match with the command in the given email auth message. function handleRecovery( EmailAuthMsg memory emailAuthMsg, uint templateIdx ) external { - address recoveredAccount = extractRecoveredAccountFromRecoverySubject( - emailAuthMsg.subjectParams, + address recoveredAccount = extractRecoveredAccountFromRecoveryCommand( + emailAuthMsg.commandParams, templateIdx ); require(recoveredAccount != address(0), "invalid account in email"); @@ -348,7 +353,7 @@ abstract contract EmailAccountRecovery { processRecovery( guardian, templateIdx, - emailAuthMsg.subjectParams, + emailAuthMsg.commandParams, emailAuthMsg.proof.emailNullifier ); } diff --git a/packages/contracts/src/EmailAuth.sol b/packages/contracts/src/EmailAuth.sol index ae850d42..fd9b7e25 100644 --- a/packages/contracts/src/EmailAuth.sol +++ b/packages/contracts/src/EmailAuth.sol @@ -4,25 +4,25 @@ pragma solidity ^0.8.12; import {EmailProof} from "./utils/Verifier.sol"; import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol"; import {Verifier} from "./utils/Verifier.sol"; -import {SubjectUtils} from "./libraries/SubjectUtils.sol"; +import {CommandUtils} from "./libraries/CommandUtils.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; /// @notice Struct to hold the email authentication/authorization message. struct EmailAuthMsg { - /// @notice The ID of the subject template that the email subject should satisfy. + /// @notice The ID of the command template that the command in the email body should satisfy. uint templateId; - /// @notice The parameters in the email subject, which should be taken according to the specified subject template. - bytes[] subjectParams; - /// @notice The number of skiiped bytes in the email subject. - uint skipedSubjectPrefix; + /// @notice The parameters in the command of the email body, which should be taken according to the specified command template. + bytes[] commandParams; + /// @notice The number of skiiped bytes in the command. + uint skipedCommandPrefix; /// @notice The email proof containing the zk proof and other necessary information for the email verification by the verifier contract. EmailProof proof; } /// @title Email Authentication/Authorization Contract -/// @notice This contract provides functionalities for the authentication of the email sender and the authentication of the message in the email subject using DKIM and custom verification logic. +/// @notice This contract provides functionalities for the authentication of the email sender and the authentication of the message in the command part of the email body using DKIM and custom verification logic. /// @dev Inherits from OwnableUpgradeable and UUPSUpgradeable for upgradeability and ownership management. contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { /// The CREATE2 salt of this contract defined as a hash of an email address and an account code. @@ -31,10 +31,10 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { IDKIMRegistry internal dkim; /// An instance of the Verifier contract. Verifier internal verifier; - /// An address of a controller contract, defining the subject templates supported by this contract. + /// An address of a controller contract, defining the command templates supported by this contract. address public controller; - /// A mapping of the supported subject templates associated with its ID. - mapping(uint => string[]) public subjectTemplates; + /// A mapping of the supported command templates associated with its ID. + mapping(uint => string[]) public commandTemplates; /// A mapping of the hash of the authorized message associated with its `emailNullifier`. uint public lastTimestamp; /// The latest `timestamp` in the verified `EmailAuthMsg`. @@ -44,9 +44,9 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { event DKIMRegistryUpdated(address indexed dkimRegistry); event VerifierUpdated(address indexed verifier); - event SubjectTemplateInserted(uint indexed templateId); - event SubjectTemplateUpdated(uint indexed templateId); - event SubjectTemplateDeleted(uint indexed templateId); + event CommandTemplateInserted(uint indexed templateId); + event CommandTemplateUpdated(uint indexed templateId); + event CommandTemplateDeleted(uint indexed templateId); event EmailAuthed( bytes32 indexed emailNullifier, bytes32 indexed accountSalt, @@ -135,70 +135,70 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { emit VerifierUpdated(_verifierAddr); } - /// @notice Retrieves a subject template by its ID. - /// @param _templateId The ID of the subject template to be retrieved. - /// @return string[] The subject template as an array of strings. - function getSubjectTemplate( + /// @notice Retrieves a command template by its ID. + /// @param _templateId The ID of the command template to be retrieved. + /// @return string[] The command template as an array of strings. + function getCommandTemplate( uint _templateId ) public view returns (string[] memory) { require( - subjectTemplates[_templateId].length > 0, + commandTemplates[_templateId].length > 0, "template id not exists" ); - return subjectTemplates[_templateId]; + return commandTemplates[_templateId]; } - /// @notice Inserts a new subject template. + /// @notice Inserts a new command template. /// @dev This function can only be called by the owner of the contract. - /// @param _templateId The ID for the new subject template. - /// @param _subjectTemplate The subject template as an array of strings. - function insertSubjectTemplate( + /// @param _templateId The ID for the new command template. + /// @param _commandTemplate The command template as an array of strings. + function insertCommandTemplate( uint _templateId, - string[] memory _subjectTemplate + string[] memory _commandTemplate ) public onlyController { - require(_subjectTemplate.length > 0, "subject template is empty"); + require(_commandTemplate.length > 0, "command template is empty"); require( - subjectTemplates[_templateId].length == 0, + commandTemplates[_templateId].length == 0, "template id already exists" ); - subjectTemplates[_templateId] = _subjectTemplate; - emit SubjectTemplateInserted(_templateId); + commandTemplates[_templateId] = _commandTemplate; + emit CommandTemplateInserted(_templateId); } - /// @notice Updates an existing subject template by its ID. + /// @notice Updates an existing command template by its ID. /// @dev This function can only be called by the controller contract. /// @param _templateId The ID of the template to update. - /// @param _subjectTemplate The new subject template as an array of strings. - function updateSubjectTemplate( + /// @param _commandTemplate The new command template as an array of strings. + function updateCommandTemplate( uint _templateId, - string[] memory _subjectTemplate + string[] memory _commandTemplate ) public onlyController { - require(_subjectTemplate.length > 0, "subject template is empty"); + require(_commandTemplate.length > 0, "command template is empty"); require( - subjectTemplates[_templateId].length > 0, + commandTemplates[_templateId].length > 0, "template id not exists" ); - subjectTemplates[_templateId] = _subjectTemplate; - emit SubjectTemplateUpdated(_templateId); + commandTemplates[_templateId] = _commandTemplate; + emit CommandTemplateUpdated(_templateId); } - /// @notice Deletes an existing subject template by its ID. + /// @notice Deletes an existing command template by its ID. /// @dev This function can only be called by the owner of the contract. - /// @param _templateId The ID of the subject template to be deleted. - function deleteSubjectTemplate(uint _templateId) public onlyController { + /// @param _templateId The ID of the command template to be deleted. + function deleteCommandTemplate(uint _templateId) public onlyController { require( - subjectTemplates[_templateId].length > 0, + commandTemplates[_templateId].length > 0, "template id not exists" ); - delete subjectTemplates[_templateId]; - emit SubjectTemplateDeleted(_templateId); + delete commandTemplates[_templateId]; + emit CommandTemplateDeleted(_templateId); } - /// @notice Authenticate the email sender and authorize the message in the email subject based on the provided email auth message. + /// @notice Authenticate the email sender and authorize the message in the email command based on the provided email auth message. /// @dev This function can only be called by the controller contract. /// @param emailAuthMsg The email auth message containing all necessary information for authentication and authorization. function authEmail(EmailAuthMsg memory emailAuthMsg) public onlyController { - string[] memory template = subjectTemplates[emailAuthMsg.templateId]; + string[] memory template = commandTemplates[emailAuthMsg.templateId]; require(template.length > 0, "template id not exists"); require( dkim.isDKIMPublicKeyHashValid( @@ -222,18 +222,18 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { "invalid timestamp" ); - // Construct an expectedSubject from template and the values of emailAuthMsg.subjectParams. - string memory expectedSubject = SubjectUtils.computeExpectedSubject( - emailAuthMsg.subjectParams, + // Construct an expectedCommand from template and the values of emailAuthMsg.commandParams. + string memory expectedCommand = CommandUtils.computeExpectedCommand( + emailAuthMsg.commandParams, template ); - string memory trimmedMaskedSubject = removePrefix( - emailAuthMsg.proof.maskedSubject, - emailAuthMsg.skipedSubjectPrefix + string memory trimmedMaskedCommand = removePrefix( + emailAuthMsg.proof.maskedCommand, + emailAuthMsg.skipedCommandPrefix ); require( - Strings.equal(expectedSubject, trimmedMaskedSubject), - "invalid subject" + Strings.equal(expectedCommand, trimmedMaskedCommand), + "invalid command" ); require( verifier.verifyEmailProof(emailAuthMsg.proof) == true, diff --git a/packages/contracts/src/libraries/SubjectUtils.sol b/packages/contracts/src/libraries/CommandUtils.sol similarity index 82% rename from packages/contracts/src/libraries/SubjectUtils.sol rename to packages/contracts/src/libraries/CommandUtils.sol index 2364fde7..fb87531e 100644 --- a/packages/contracts/src/libraries/SubjectUtils.sol +++ b/packages/contracts/src/libraries/CommandUtils.sol @@ -6,7 +6,7 @@ import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import "./DecimalUtils.sol"; -library SubjectUtils { +library CommandUtils { bytes16 private constant LOWER_HEX_DIGITS = "0123456789abcdef"; bytes16 private constant UPPER_HEX_DIGITS = "0123456789ABCDEF"; string public constant STRING_MATCHER = "{string}"; @@ -75,14 +75,14 @@ library SubjectUtils { return string(hexString); } - /// @notice Calculate the expected subject. - /// @param subjectParams Params to be used in the subject - /// @param template Template to be used for the subject - function computeExpectedSubject( - bytes[] memory subjectParams, + /// @notice Calculate the expected command. + /// @param commandParams Params to be used in the command + /// @param template Template to be used for the command + function computeExpectedCommand( + bytes[] memory commandParams, string[] memory template - ) public pure returns (string memory expectedSubject) { - // Construct an expectedSubject from template and the values of emailAuthMsg.subjectParams. + ) public pure returns (string memory expectedCommand) { + // Construct an expectedCommand from template and the values of commandParams. uint8 nextParamIndex = 0; string memory stringParam; bool isParamExist; @@ -90,31 +90,31 @@ library SubjectUtils { isParamExist = true; if (Strings.equal(template[i], STRING_MATCHER)) { string memory param = abi.decode( - subjectParams[nextParamIndex], + commandParams[nextParamIndex], (string) ); stringParam = param; } else if (Strings.equal(template[i], UINT_MATCHER)) { uint256 param = abi.decode( - subjectParams[nextParamIndex], + commandParams[nextParamIndex], (uint256) ); stringParam = Strings.toString(param); } else if (Strings.equal(template[i], INT_MATCHER)) { int256 param = abi.decode( - subjectParams[nextParamIndex], + commandParams[nextParamIndex], (int256) ); stringParam = Strings.toStringSigned(param); } else if (Strings.equal(template[i], DECIMALS_MATCHER)) { uint256 param = abi.decode( - subjectParams[nextParamIndex], + commandParams[nextParamIndex], (uint256) ); stringParam = DecimalUtils.uintToDecimalString(param); } else if (Strings.equal(template[i], ETH_ADDR_MATCHER)) { address param = abi.decode( - subjectParams[nextParamIndex], + commandParams[nextParamIndex], (address) ); stringParam = addressToChecksumHexString(param); @@ -124,17 +124,17 @@ library SubjectUtils { } if (i > 0) { - expectedSubject = string( - abi.encodePacked(expectedSubject, " ") + expectedCommand = string( + abi.encodePacked(expectedCommand, " ") ); } - expectedSubject = string( - abi.encodePacked(expectedSubject, stringParam) + expectedCommand = string( + abi.encodePacked(expectedCommand, stringParam) ); if (isParamExist) { nextParamIndex++; } } - return expectedSubject; + return expectedCommand; } } diff --git a/packages/contracts/src/utils/Verifier.sol b/packages/contracts/src/utils/Verifier.sol index 2ccff85d..85834441 100644 --- a/packages/contracts/src/utils/Verifier.sol +++ b/packages/contracts/src/utils/Verifier.sol @@ -9,7 +9,7 @@ struct EmailProof { string domainName; // Domain name of the sender's email bytes32 publicKeyHash; // Hash of the DKIM public key used in email/proof uint timestamp; // Timestamp of the email - string maskedSubject; // Masked subject of the email + string maskedCommand; // Masked command of the email bytes32 emailNullifier; // Nullifier of the email to prevent its reuse. bytes32 accountSalt; // Create2 salt of the account bool isCodeExist; // Check if the account code is exist @@ -52,7 +52,7 @@ contract Verifier is OwnableUpgradeable, UUPSUpgradeable { pubSignals[DOMAIN_FIELDS + 1] = uint256(proof.emailNullifier); pubSignals[DOMAIN_FIELDS + 2] = uint256(proof.timestamp); stringFields = _packBytes2Fields( - bytes(proof.maskedSubject), + bytes(proof.maskedCommand), SUBJECT_BYTES ); for (uint256 i = 0; i < SUBJECT_FIELDS; i++) { diff --git a/packages/contracts/test/DKIMRegistryUpgrade.t.sol b/packages/contracts/test/DKIMRegistryUpgrade.t.sol index 82342991..c3384571 100644 --- a/packages/contracts/test/DKIMRegistryUpgrade.t.sol +++ b/packages/contracts/test/DKIMRegistryUpgrade.t.sol @@ -43,15 +43,15 @@ contract DKIMRegistryUpgradeTest is StructHelper { assertEq(dkimAddr, address(dkim)); } - function _testInsertSubjectTemplate() private { - emailAuth.insertSubjectTemplate(templateId, subjectTemplate); - string[] memory result = emailAuth.getSubjectTemplate(templateId); - assertEq(result, subjectTemplate); + function _testInsertCommandTemplate() private { + emailAuth.insertCommandTemplate(templateId, commandTemplate); + string[] memory result = emailAuth.getCommandTemplate(templateId); + assertEq(result, commandTemplate); } function testAuthEmail() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); vm.stopPrank(); diff --git a/packages/contracts/test/EmailAccountRecovery.t.sol b/packages/contracts/test/EmailAccountRecovery.t.sol index f5670253..12a27a57 100644 --- a/packages/contracts/test/EmailAccountRecovery.t.sol +++ b/packages/contracts/test/EmailAccountRecovery.t.sol @@ -103,9 +103,9 @@ contract EmailAccountRecoveryTest is StructHelper { vm.stopPrank(); } - function testAcceptanceSubjectTemplates() public { + function testAcceptanceCommandTemplates() public { setUp(); - string[][] memory res = recoveryController.acceptanceSubjectTemplates(); + string[][] memory res = recoveryController.acceptanceCommandTemplates(); assertEq(res[0][0], "Accept"); assertEq(res[0][1], "guardian"); assertEq(res[0][2], "request"); @@ -113,9 +113,9 @@ contract EmailAccountRecoveryTest is StructHelper { assertEq(res[0][4], "{ethAddr}"); } - function testRecoverySubjectTemplates() public { + function testRecoveryCommandTemplates() public { setUp(); - string[][] memory res = recoveryController.recoverySubjectTemplates(); + string[][] memory res = recoveryController.recoveryCommandTemplates(); assertEq(res[0][0], "Set"); assertEq(res[0][1], "the"); assertEq(res[0][2], "new"); @@ -207,9 +207,9 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), @@ -248,9 +248,9 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; emailAuthMsg.proof.accountSalt = 0x0; vm.mockCall( @@ -280,9 +280,9 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), @@ -296,7 +296,7 @@ contract EmailAccountRecoveryTest is StructHelper { vm.stopPrank(); } - function testExpectRevertHandleAcceptanceInvalidSubjectParams() public { + function testExpectRevertHandleAcceptanceInvalidCommandParams() public { testRequestGuardian(); require( @@ -311,10 +311,10 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](2); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - subjectParamsForAcceptance[1] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](2); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + commandParamsForAcceptance[1] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), @@ -323,7 +323,7 @@ contract EmailAccountRecoveryTest is StructHelper { ); vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid subject params")); + vm.expectRevert(bytes("invalid command params")); recoveryController.handleAcceptance(emailAuthMsg, templateIdx); vm.stopPrank(); } @@ -345,9 +345,9 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(0x0)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(0x0)); + emailAuthMsg.commandParams = commandParamsForAcceptance; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), @@ -384,10 +384,10 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), @@ -439,10 +439,10 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; emailAuthMsg.proof.accountSalt = 0x0; vm.mockCall( @@ -476,10 +476,10 @@ contract EmailAccountRecoveryTest is StructHelper { uint templateIdx = 0; EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), @@ -521,10 +521,10 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; emailAuthMsg.proof.accountSalt = 0x0; // vm.mockCall( @@ -574,10 +574,10 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), @@ -613,11 +613,11 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](3); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - subjectParamsForRecovery[1] = abi.encode(address(0x0)); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](3); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + commandParamsForRecovery[1] = abi.encode(address(0x0)); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), @@ -626,7 +626,7 @@ contract EmailAccountRecoveryTest is StructHelper { ); vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid subject params")); + vm.expectRevert(bytes("invalid command params")); recoveryController.handleRecovery(emailAuthMsg, templateIdx); vm.stopPrank(); } @@ -649,10 +649,10 @@ contract EmailAccountRecoveryTest is StructHelper { // EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); // uint templateId = recoveryController.computeRecoveryTemplateId(templateIdx); // emailAuthMsg.templateId = templateId; - // bytes[] memory subjectParamsForRecovery = new bytes[](2); - // subjectParamsForRecovery[0] = abi.encode(address(0x0)); - // subjectParamsForRecovery[1] = abi.encode(newSigner); - // emailAuthMsg.subjectParams = subjectParamsForRecovery; + // bytes[] memory commandParamsForRecovery = new bytes[](2); + // commandParamsForRecovery[0] = abi.encode(address(0x0)); + // commandParamsForRecovery[1] = abi.encode(newSigner); + // emailAuthMsg.commandParams = commandParamsForRecovery; // vm.mockCall( // address(recoveryController.emailAuthImplementationAddr()), @@ -688,10 +688,10 @@ contract EmailAccountRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(address(0x0)); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(address(0x0)); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), diff --git a/packages/contracts/test/EmailAccountRecoveryForRejectRecovery.t.sol b/packages/contracts/test/EmailAccountRecoveryForRejectRecovery.t.sol index 7b346fcb..d534a325 100644 --- a/packages/contracts/test/EmailAccountRecoveryForRejectRecovery.t.sol +++ b/packages/contracts/test/EmailAccountRecoveryForRejectRecovery.t.sol @@ -49,12 +49,12 @@ contract EmailAccountRecoveryForRejectRecoveryTest is StructHelper { uint templateIdx = 0; EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; address recoveredAccount = recoveryController - .extractRecoveredAccountFromAcceptanceSubject( - emailAuthMsg.subjectParams, + .extractRecoveredAccountFromAcceptanceCommand( + emailAuthMsg.commandParams, templateIdx ); address computedGuardian = recoveryController.computeEmailAuthAddress( @@ -107,10 +107,10 @@ contract EmailAccountRecoveryForRejectRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), @@ -356,10 +356,10 @@ contract EmailAccountRecoveryForRejectRecoveryTest is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(address(0x0)); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(address(0x0)); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryController.emailAuthImplementationAddr()), diff --git a/packages/contracts/test/EmailAuth.t.sol b/packages/contracts/test/EmailAuth.t.sol index 220f886b..29c9d3cc 100644 --- a/packages/contracts/test/EmailAuth.t.sol +++ b/packages/contracts/test/EmailAuth.t.sol @@ -117,140 +117,140 @@ contract EmailAuthTest is StructHelper { vm.stopPrank(); } - function testGetSubjectTemplate() public { + function testGetCommandTemplate() public { vm.startPrank(deployer); - emailAuth.insertSubjectTemplate(templateId, subjectTemplate); + emailAuth.insertCommandTemplate(templateId, commandTemplate); vm.stopPrank(); - string[] memory result = emailAuth.getSubjectTemplate(templateId); - assertEq(result, subjectTemplate); + string[] memory result = emailAuth.getCommandTemplate(templateId); + assertEq(result, commandTemplate); } - function testExpectRevertGetSubjectTemplateTemplateIdNotExists() public { + function testExpectRevertGetCommandTemplateTemplateIdNotExists() public { vm.expectRevert(bytes("template id not exists")); - emailAuth.getSubjectTemplate(templateId); + emailAuth.getCommandTemplate(templateId); } - function testInsertSubjectTemplate() public { + function testInsertCommandTemplate() public { vm.startPrank(deployer); vm.expectEmit(true, false, false, false); - emit EmailAuth.SubjectTemplateInserted(templateId); - _testInsertSubjectTemplate(); + emit EmailAuth.CommandTemplateInserted(templateId); + _testInsertCommandTemplate(); vm.stopPrank(); } - function _testInsertSubjectTemplate() private { - emailAuth.insertSubjectTemplate(templateId, subjectTemplate); - string[] memory result = emailAuth.getSubjectTemplate(templateId); - assertEq(result, subjectTemplate); + function _testInsertCommandTemplate() private { + emailAuth.insertCommandTemplate(templateId, commandTemplate); + string[] memory result = emailAuth.getCommandTemplate(templateId); + assertEq(result, commandTemplate); } - function testExpectRevertInsertSubjectTemplateSubjectTemplateIsEmpty() + function testExpectRevertInsertCommandTemplateCommandTemplateIsEmpty() public { vm.startPrank(deployer); - string[] memory emptySubjectTemplate = new string[](0); - vm.expectRevert(bytes("subject template is empty")); - emailAuth.insertSubjectTemplate(templateId, emptySubjectTemplate); + string[] memory emptyCommandTemplate = new string[](0); + vm.expectRevert(bytes("command template is empty")); + emailAuth.insertCommandTemplate(templateId, emptyCommandTemplate); vm.stopPrank(); } - function testExpectRevertInsertSubjectTemplateTemplateIdAlreadyExists() + function testExpectRevertInsertCommandTemplateTemplateIdAlreadyExists() public { vm.startPrank(deployer); - emailAuth.insertSubjectTemplate(templateId, subjectTemplate); - string[] memory result = emailAuth.getSubjectTemplate(templateId); - assertEq(result, subjectTemplate); + emailAuth.insertCommandTemplate(templateId, commandTemplate); + string[] memory result = emailAuth.getCommandTemplate(templateId); + assertEq(result, commandTemplate); vm.expectRevert(bytes("template id already exists")); - emailAuth.insertSubjectTemplate(templateId, subjectTemplate); + emailAuth.insertCommandTemplate(templateId, commandTemplate); vm.stopPrank(); } - function testUpdateSubjectTemplate() public { + function testUpdateCommandTemplate() public { vm.expectRevert(bytes("template id not exists")); - string[] memory result = emailAuth.getSubjectTemplate(templateId); + string[] memory result = emailAuth.getCommandTemplate(templateId); vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); vm.stopPrank(); - result = emailAuth.getSubjectTemplate(templateId); - assertEq(result, subjectTemplate); + result = emailAuth.getCommandTemplate(templateId); + assertEq(result, commandTemplate); vm.startPrank(deployer); vm.expectEmit(true, false, false, false); - emit EmailAuth.SubjectTemplateUpdated(templateId); - emailAuth.updateSubjectTemplate(templateId, newSubjectTemplate); + emit EmailAuth.CommandTemplateUpdated(templateId); + emailAuth.updateCommandTemplate(templateId, newCommandTemplate); vm.stopPrank(); - result = emailAuth.getSubjectTemplate(templateId); - assertEq(result, newSubjectTemplate); + result = emailAuth.getCommandTemplate(templateId); + assertEq(result, newCommandTemplate); } - function testExpectRevertUpdateSubjectTemplateCallerIsNotTheModule() + function testExpectRevertUpdateCommandTemplateCallerIsNotTheModule() public { vm.expectRevert("only controller"); - emailAuth.updateSubjectTemplate(templateId, subjectTemplate); + emailAuth.updateCommandTemplate(templateId, commandTemplate); } - function testExpectRevertUpdateSubjectTemplateSubjectTemplateIsEmpty() + function testExpectRevertUpdateCommandTemplateCommandTemplateIsEmpty() public { vm.startPrank(deployer); - string[] memory emptySubjectTemplate = new string[](0); - vm.expectRevert(bytes("subject template is empty")); - emailAuth.updateSubjectTemplate(templateId, emptySubjectTemplate); + string[] memory emptyCommandTemplate = new string[](0); + vm.expectRevert(bytes("command template is empty")); + emailAuth.updateCommandTemplate(templateId, emptyCommandTemplate); vm.stopPrank(); } - function testExpectRevertUpdateSubjectTemplateTemplateIdNotExists() public { + function testExpectRevertUpdateCommandTemplateTemplateIdNotExists() public { vm.startPrank(deployer); vm.expectRevert(bytes("template id not exists")); - emailAuth.updateSubjectTemplate(templateId, subjectTemplate); + emailAuth.updateCommandTemplate(templateId, commandTemplate); vm.stopPrank(); } - function testDeleteSubjectTemplate() public { + function testDeleteCommandTemplate() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); vm.stopPrank(); - string[] memory result = emailAuth.getSubjectTemplate(templateId); - assertEq(result, subjectTemplate); + string[] memory result = emailAuth.getCommandTemplate(templateId); + assertEq(result, commandTemplate); vm.startPrank(deployer); vm.expectEmit(true, false, false, false); - emit EmailAuth.SubjectTemplateDeleted(templateId); - emailAuth.deleteSubjectTemplate(templateId); + emit EmailAuth.CommandTemplateDeleted(templateId); + emailAuth.deleteCommandTemplate(templateId); vm.stopPrank(); vm.expectRevert(bytes("template id not exists")); - emailAuth.getSubjectTemplate(templateId); + emailAuth.getCommandTemplate(templateId); } - function testExpectRevertDeleteSubjectTemplateCallerIsNotTheModule() + function testExpectRevertDeleteCommandTemplateCallerIsNotTheModule() public { vm.expectRevert("only controller"); - emailAuth.deleteSubjectTemplate(templateId); + emailAuth.deleteCommandTemplate(templateId); } - function testExpectRevertDeleteSubjectTemplateTemplateIdNotExists() public { + function testExpectRevertDeleteCommandTemplateTemplateIdNotExists() public { vm.startPrank(deployer); vm.expectRevert(bytes("template id not exists")); - emailAuth.deleteSubjectTemplate(templateId); + emailAuth.deleteCommandTemplate(templateId); vm.stopPrank(); } function testAuthEmail() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); vm.stopPrank(); @@ -310,7 +310,7 @@ contract EmailAuthTest is StructHelper { function testExpectRevertAuthEmailInvalidDkimPublicKeyHash() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); vm.stopPrank(); @@ -329,7 +329,7 @@ contract EmailAuthTest is StructHelper { function testExpectRevertAuthEmailEmailNullifierAlreadyUsed() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); vm.stopPrank(); @@ -348,7 +348,7 @@ contract EmailAuthTest is StructHelper { function testExpectRevertAuthEmailInvalidAccountSalt() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); vm.stopPrank(); @@ -367,7 +367,7 @@ contract EmailAuthTest is StructHelper { function testExpectRevertAuthEmailInvalidTimestamp() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); emailAuth.authEmail(emailAuthMsg); vm.stopPrank(); @@ -387,9 +387,9 @@ contract EmailAuthTest is StructHelper { vm.stopPrank(); } - function testExpectRevertAuthEmailInvalidSubject() public { + function testExpectRevertAuthEmailInvalidCommand() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); vm.stopPrank(); @@ -400,15 +400,15 @@ contract EmailAuthTest is StructHelper { assertEq(emailAuth.lastTimestamp(), 0); vm.startPrank(deployer); - emailAuthMsg.subjectParams[0] = abi.encode(2 ether); - vm.expectRevert(bytes("invalid subject")); + emailAuthMsg.commandParams[0] = abi.encode(2 ether); + vm.expectRevert(bytes("invalid command")); emailAuth.authEmail(emailAuthMsg); vm.stopPrank(); } function testExpectRevertAuthEmailInvalidEmailProof() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); vm.stopPrank(); diff --git a/packages/contracts/test/EmailAuthWithUserOverrideableDkim.t.sol b/packages/contracts/test/EmailAuthWithUserOverrideableDkim.t.sol index 3f55ef7d..26e10597 100644 --- a/packages/contracts/test/EmailAuthWithUserOverrideableDkim.t.sol +++ b/packages/contracts/test/EmailAuthWithUserOverrideableDkim.t.sol @@ -49,15 +49,15 @@ contract EmailAuthWithUserOverrideableDkimTest is StructHelper { ); } - function _testInsertSubjectTemplate() private { - emailAuth.insertSubjectTemplate(templateId, subjectTemplate); - string[] memory result = emailAuth.getSubjectTemplate(templateId); - assertEq(result, subjectTemplate); + function _testInsertCommandTemplate() private { + emailAuth.insertCommandTemplate(templateId, commandTemplate); + string[] memory result = emailAuth.getCommandTemplate(templateId); + assertEq(result, commandTemplate); } function testAuthEmail() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); vm.stopPrank(); diff --git a/packages/contracts/test/Integration.t.sol b/packages/contracts/test/Integration.t.sol index 35ca040d..18883f99 100644 --- a/packages/contracts/test/Integration.t.sol +++ b/packages/contracts/test/Integration.t.sol @@ -186,10 +186,10 @@ contract IntegrationTest is Test { emailProof.timestamp = vm.parseUint(pubSignals[11]); if (isZksync) { emailProof - .maskedSubject = "Accept guardian request for 0x05A78D3dB903a58B5FA373E07e5044B95B12aec4"; + .maskedCommand = "Accept guardian request for 0x05A78D3dB903a58B5FA373E07e5044B95B12aec4"; } else { emailProof - .maskedSubject = "Accept guardian request for 0x0C06688e61C06466E2a5C6fE4E15c359260a33f3"; + .maskedCommand = "Accept guardian request for 0x0C06688e61C06466E2a5C6fE4E15c359260a33f3"; } emailProof.emailNullifier = bytes32(vm.parseUint(pubSignals[10])); emailProof.accountSalt = bytes32(vm.parseUint(pubSignals[32])); @@ -224,14 +224,14 @@ contract IntegrationTest is Test { ); // Call handleAcceptance -> GuardianStatus.ACCEPTED - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); EmailAuthMsg memory emailAuthMsg = EmailAuthMsg({ templateId: recoveryController.computeAcceptanceTemplateId( templateIdx ), - subjectParams: subjectParamsForAcceptance, - skipedSubjectPrefix: 0, + commandParams: commandParamsForAcceptance, + skipedCommandPrefix: 0, proof: emailProof }); recoveryController.handleAcceptance(emailAuthMsg, templateIdx); @@ -272,10 +272,10 @@ contract IntegrationTest is Test { // 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 is account 9 if (isZksync) { emailProof - .maskedSubject = "Set the new signer of 0x05A78D3dB903a58B5FA373E07e5044B95B12aec4 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; + .maskedCommand = "Set the new signer of 0x05A78D3dB903a58B5FA373E07e5044B95B12aec4 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; } else { emailProof - .maskedSubject = "Set the new signer of 0x0C06688e61C06466E2a5C6fE4E15c359260a33f3 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; + .maskedCommand = "Set the new signer of 0x0C06688e61C06466E2a5C6fE4E15c359260a33f3 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; } emailProof.emailNullifier = bytes32(vm.parseUint(pubSignals[10])); @@ -302,17 +302,17 @@ contract IntegrationTest is Test { console.log("is code exist: ", vm.parseUint(pubSignals[33])); // Call handleRecovery -> isRecovering = true; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(address(simpleWallet)); - subjectParamsForRecovery[1] = abi.encode( + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(address(simpleWallet)); + commandParamsForRecovery[1] = abi.encode( address(0xa0Ee7A142d267C1f36714E4a8F75612F20a79720) ); emailAuthMsg = EmailAuthMsg({ templateId: recoveryController.computeRecoveryTemplateId( templateIdx ), - subjectParams: subjectParamsForRecovery, - skipedSubjectPrefix: 0, + commandParams: commandParamsForRecovery, + skipedCommandPrefix: 0, proof: emailProof }); recoveryController.handleRecovery(emailAuthMsg, templateIdx); diff --git a/packages/contracts/test/helpers/DeploymentHelper.sol b/packages/contracts/test/helpers/DeploymentHelper.sol index 3acad108..c3e720fe 100644 --- a/packages/contracts/test/helpers/DeploymentHelper.sol +++ b/packages/contracts/test/helpers/DeploymentHelper.sol @@ -34,8 +34,8 @@ contract DeploymentHelper is Test { bytes32 accountSalt; uint templateId; - string[] subjectTemplate; - string[] newSubjectTemplate; + string[] commandTemplate; + string[] newCommandTemplate; bytes mockProof = abi.encodePacked(bytes1(0x01)); string selector = "12345"; @@ -106,8 +106,8 @@ contract DeploymentHelper is Test { uint templateIdx = 0; templateId = uint256(keccak256(abi.encodePacked("TEST", templateIdx))); - subjectTemplate = ["Send", "{decimals}", "ETH", "to", "{ethAddr}"]; - newSubjectTemplate = ["Send", "{decimals}", "USDC", "to", "{ethAddr}"]; + commandTemplate = ["Send", "{decimals}", "ETH", "to", "{ethAddr}"]; + newCommandTemplate = ["Send", "{decimals}", "USDC", "to", "{ethAddr}"]; // Create RecoveryController as EmailAccountRecovery implementation RecoveryController recoveryControllerImpl = new RecoveryController(); diff --git a/packages/contracts/test/helpers/RecoveryController.sol b/packages/contracts/test/helpers/RecoveryController.sol index 725bca68..a73e5b7e 100644 --- a/packages/contracts/test/helpers/RecoveryController.sol +++ b/packages/contracts/test/helpers/RecoveryController.sol @@ -22,12 +22,6 @@ contract RecoveryController is OwnableUpgradeable, EmailAccountRecovery { mapping(address => uint) public timelockPeriodOfAccount; mapping(address => uint) public currentTimelockOfAccount; - // modifier onlyNotRecoveringOwner() { - // require(msg.sender == owner(), "only owner"); - // require(!isRecovering, "recovery in progress"); - // _; - // } - constructor() {} function initialize( @@ -48,7 +42,7 @@ contract RecoveryController is OwnableUpgradeable, EmailAccountRecovery { return isActivatedOfAccount[recoveredAccount]; } - function acceptanceSubjectTemplates() + function acceptanceCommandTemplates() public pure override @@ -64,7 +58,7 @@ contract RecoveryController is OwnableUpgradeable, EmailAccountRecovery { return templates; } - function recoverySubjectTemplates() + function recoveryCommandTemplates() public pure override @@ -83,22 +77,22 @@ contract RecoveryController is OwnableUpgradeable, EmailAccountRecovery { return templates; } - function extractRecoveredAccountFromAcceptanceSubject( - bytes[] memory subjectParams, + function extractRecoveredAccountFromAcceptanceCommand( + bytes[] memory commandParams, uint templateIdx ) public pure override returns (address) { require(templateIdx == 0, "invalid template index"); - require(subjectParams.length == 1, "invalid subject params"); - return abi.decode(subjectParams[0], (address)); + require(commandParams.length == 1, "invalid command params"); + return abi.decode(commandParams[0], (address)); } - function extractRecoveredAccountFromRecoverySubject( - bytes[] memory subjectParams, + function extractRecoveredAccountFromRecoveryCommand( + bytes[] memory commandParams, uint templateIdx ) public pure override returns (address) { require(templateIdx == 0, "invalid template index"); - require(subjectParams.length == 2, "invalid subject params"); - return abi.decode(subjectParams[0], (address)); + require(commandParams.length == 2, "invalid command params"); + return abi.decode(commandParams[0], (address)); } function requestGuardian(address guardian) public { @@ -122,10 +116,10 @@ contract RecoveryController is OwnableUpgradeable, EmailAccountRecovery { function acceptGuardian( address guardian, uint templateIdx, - bytes[] memory subjectParams, + bytes[] memory commandParams, bytes32 ) internal override { - address account = abi.decode(subjectParams[0], (address)); + address account = abi.decode(commandParams[0], (address)); require(!isRecovering[account], "recovery in progress"); require(guardian != address(0), "invalid guardian"); @@ -134,17 +128,17 @@ contract RecoveryController is OwnableUpgradeable, EmailAccountRecovery { "guardian status must be REQUESTED" ); require(templateIdx == 0, "invalid template index"); - require(subjectParams.length == 1, "invalid subject params"); + require(commandParams.length == 1, "invalid command params"); guardians[guardian] = GuardianStatus.ACCEPTED; } function processRecovery( address guardian, uint templateIdx, - bytes[] memory subjectParams, + bytes[] memory commandParams, bytes32 ) internal override { - address account = abi.decode(subjectParams[0], (address)); + address account = abi.decode(commandParams[0], (address)); require(!isRecovering[account], "recovery in progress"); require(guardian != address(0), "invalid guardian"); require( @@ -152,8 +146,8 @@ contract RecoveryController is OwnableUpgradeable, EmailAccountRecovery { "guardian status must be ACCEPTED" ); require(templateIdx == 0, "invalid template index"); - require(subjectParams.length == 2, "invalid subject params"); - address newSignerInEmail = abi.decode(subjectParams[1], (address)); + require(commandParams.length == 2, "invalid command params"); + address newSignerInEmail = abi.decode(commandParams[1], (address)); require(newSignerInEmail != address(0), "invalid new signer"); isRecovering[account] = true; newSignerCandidateOfAccount[account] = newSignerInEmail; diff --git a/packages/contracts/test/helpers/StructHelper.sol b/packages/contracts/test/helpers/StructHelper.sol index cae1eb2f..7fcf4a45 100644 --- a/packages/contracts/test/helpers/StructHelper.sol +++ b/packages/contracts/test/helpers/StructHelper.sol @@ -8,9 +8,9 @@ contract StructHelper is DeploymentHelper { public returns (EmailAuthMsg memory emailAuthMsg) { - bytes[] memory subjectParams = new bytes[](2); - subjectParams[0] = abi.encode(1 ether); - subjectParams[1] = abi.encode( + bytes[] memory commandParams = new bytes[](2); + commandParams[0] = abi.encode(1 ether); + commandParams[1] = abi.encode( "0x0000000000000000000000000000000000000020" ); @@ -18,7 +18,7 @@ contract StructHelper is DeploymentHelper { domainName: "gmail.com", publicKeyHash: publicKeyHash, timestamp: 1694989812, - maskedSubject: "Send 1 ETH to 0x0000000000000000000000000000000000000020", + maskedCommand: "Send 1 ETH to 0x0000000000000000000000000000000000000020", emailNullifier: emailNullifier, accountSalt: accountSalt, isCodeExist: true, @@ -27,8 +27,8 @@ contract StructHelper is DeploymentHelper { emailAuthMsg = EmailAuthMsg({ templateId: templateId, - subjectParams: subjectParams, - skipedSubjectPrefix: 0, + commandParams: commandParams, + skipedCommandPrefix: 0, proof: emailProof }); diff --git a/packages/prover/Dockerfile b/packages/prover/Dockerfile index 7997cc71..4e2428cb 100644 --- a/packages/prover/Dockerfile +++ b/packages/prover/Dockerfile @@ -1,6 +1,5 @@ FROM python:3.10 - RUN apt-get update && apt-get upgrade -y # Update the package list and install necessary dependencies RUN apt-get update && \ From 776fa59ca3e771933236413031706a17dbe8192c Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Sun, 8 Sep 2024 00:25:07 +0900 Subject: [PATCH 039/121] Fix compile errors in relayer --- .../src/abis/email_account_recovery.rs | 170 ++--- packages/relayer/src/abis/email_auth.rs | 706 +++++++++--------- packages/relayer/src/chain.rs | 28 +- packages/relayer/src/core.rs | 34 +- .../src/modules/web_server/rest_api.rs | 54 +- 5 files changed, 496 insertions(+), 496 deletions(-) diff --git a/packages/relayer/src/abis/email_account_recovery.rs b/packages/relayer/src/abis/email_account_recovery.rs index 90b7a195..7f5d0286 100644 --- a/packages/relayer/src/abis/email_account_recovery.rs +++ b/packages/relayer/src/abis/email_account_recovery.rs @@ -16,11 +16,11 @@ pub mod email_account_recovery { constructor: ::core::option::Option::None, functions: ::core::convert::From::from([ ( - ::std::borrow::ToOwned::to_owned("acceptanceSubjectTemplates"), + ::std::borrow::ToOwned::to_owned("acceptanceCommandTemplates"), ::std::vec![ ::ethers::core::abi::ethabi::Function { name: ::std::borrow::ToOwned::to_owned( - "acceptanceSubjectTemplates", + "acceptanceCommandTemplates", ), inputs: ::std::vec![], outputs: ::std::vec![ @@ -265,16 +265,16 @@ pub mod email_account_recovery { ), ( ::std::borrow::ToOwned::to_owned( - "extractRecoveredAccountFromAcceptanceSubject", + "extractRecoveredAccountFromAcceptanceCommand", ), ::std::vec![ ::ethers::core::abi::ethabi::Function { name: ::std::borrow::ToOwned::to_owned( - "extractRecoveredAccountFromAcceptanceSubject", + "extractRecoveredAccountFromAcceptanceCommand", ), inputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("subjectParams"), + name: ::std::borrow::ToOwned::to_owned("commandParams"), kind: ::ethers::core::abi::ethabi::ParamType::Array( ::std::boxed::Box::new( ::ethers::core::abi::ethabi::ParamType::Bytes, @@ -310,16 +310,16 @@ pub mod email_account_recovery { ), ( ::std::borrow::ToOwned::to_owned( - "extractRecoveredAccountFromRecoverySubject", + "extractRecoveredAccountFromRecoveryCommand", ), ::std::vec![ ::ethers::core::abi::ethabi::Function { name: ::std::borrow::ToOwned::to_owned( - "extractRecoveredAccountFromRecoverySubject", + "extractRecoveredAccountFromRecoveryCommand", ), inputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("subjectParams"), + name: ::std::borrow::ToOwned::to_owned("commandParams"), kind: ::ethers::core::abi::ethabi::ParamType::Array( ::std::boxed::Box::new( ::ethers::core::abi::ethabi::ParamType::Bytes, @@ -506,11 +506,11 @@ pub mod email_account_recovery { ], ), ( - ::std::borrow::ToOwned::to_owned("recoverySubjectTemplates"), + ::std::borrow::ToOwned::to_owned("recoveryCommandTemplates"), ::std::vec![ ::ethers::core::abi::ethabi::Function { name: ::std::borrow::ToOwned::to_owned( - "recoverySubjectTemplates", + "recoveryCommandTemplates", ), inputs: ::std::vec![], outputs: ::std::vec![ @@ -625,15 +625,15 @@ pub mod email_account_recovery { ), ) } - ///Calls the contract's `acceptanceSubjectTemplates` (0x5bafadda) function - pub fn acceptance_subject_templates( + ///Calls the contract's `acceptanceCommandTemplates` (0x222f6cb5) function + pub fn acceptance_command_templates( &self, ) -> ::ethers::contract::builders::ContractCall< M, ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, > { self.0 - .method_hash([91, 175, 173, 218], ()) + .method_hash([34, 47, 108, 181], ()) .expect("method not found (this should never happen)") } ///Calls the contract's `completeRecovery` (0xc18d09cf) function @@ -721,30 +721,30 @@ pub mod email_account_recovery { .method_hash([16, 152, 224, 46], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `extractRecoveredAccountFromAcceptanceSubject` (0xe81dcaf2) function - pub fn extract_recovered_account_from_acceptance_subject( + ///Calls the contract's `extractRecoveredAccountFromAcceptanceCommand` (0x2c4ce129) function + pub fn extract_recovered_account_from_acceptance_command( &self, - subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, + command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, template_idx: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall< M, ::ethers::core::types::Address, > { self.0 - .method_hash([232, 29, 202, 242], (subject_params, template_idx)) + .method_hash([44, 76, 225, 41], (command_params, template_idx)) .expect("method not found (this should never happen)") } - ///Calls the contract's `extractRecoveredAccountFromRecoverySubject` (0x30e6a5ab) function - pub fn extract_recovered_account_from_recovery_subject( + ///Calls the contract's `extractRecoveredAccountFromRecoveryCommand` (0xa5e3ee70) function + pub fn extract_recovered_account_from_recovery_command( &self, - subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, + command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, template_idx: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall< M, ::ethers::core::types::Address, > { self.0 - .method_hash([48, 230, 165, 171], (subject_params, template_idx)) + .method_hash([165, 227, 238, 112], (command_params, template_idx)) .expect("method not found (this should never happen)") } ///Calls the contract's `handleAcceptance` (0x0481af67) function @@ -784,15 +784,15 @@ pub mod email_account_recovery { .method_hash([133, 246, 15, 126], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `recoverySubjectTemplates` (0x3e91cdcd) function - pub fn recovery_subject_templates( + ///Calls the contract's `recoveryCommandTemplates` (0x3ef01b8f) function + pub fn recovery_command_templates( &self, ) -> ::ethers::contract::builders::ContractCall< M, ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, > { self.0 - .method_hash([62, 145, 205, 205], ()) + .method_hash([62, 240, 27, 143], ()) .expect("method not found (this should never happen)") } ///Calls the contract's `verifier` (0x2b7ac3f3) function @@ -824,7 +824,7 @@ pub mod email_account_recovery { Self::new(contract.address(), contract.client()) } } - ///Container type for all input parameters for the `acceptanceSubjectTemplates` function with signature `acceptanceSubjectTemplates()` and selector `0x5bafadda` + ///Container type for all input parameters for the `acceptanceCommandTemplates` function with signature `acceptanceCommandTemplates()` and selector `0x222f6cb5` #[derive( Clone, ::ethers::contract::EthCall, @@ -835,8 +835,8 @@ pub mod email_account_recovery { Eq, Hash )] - #[ethcall(name = "acceptanceSubjectTemplates", abi = "acceptanceSubjectTemplates()")] - pub struct AcceptanceSubjectTemplatesCall; + #[ethcall(name = "acceptanceCommandTemplates", abi = "acceptanceCommandTemplates()")] + pub struct AcceptanceCommandTemplatesCall; ///Container type for all input parameters for the `completeRecovery` function with signature `completeRecovery(address,bytes)` and selector `0xc18d09cf` #[derive( Clone, @@ -963,7 +963,7 @@ pub mod email_account_recovery { abi = "emailAuthImplementationAddr()" )] pub struct EmailAuthImplementationAddrCall; - ///Container type for all input parameters for the `extractRecoveredAccountFromAcceptanceSubject` function with signature `extractRecoveredAccountFromAcceptanceSubject(bytes[],uint256)` and selector `0xe81dcaf2` + ///Container type for all input parameters for the `extractRecoveredAccountFromAcceptanceCommand` function with signature `extractRecoveredAccountFromAcceptanceCommand(bytes[],uint256)` and selector `0x2c4ce129` #[derive( Clone, ::ethers::contract::EthCall, @@ -975,14 +975,14 @@ pub mod email_account_recovery { Hash )] #[ethcall( - name = "extractRecoveredAccountFromAcceptanceSubject", - abi = "extractRecoveredAccountFromAcceptanceSubject(bytes[],uint256)" + name = "extractRecoveredAccountFromAcceptanceCommand", + abi = "extractRecoveredAccountFromAcceptanceCommand(bytes[],uint256)" )] - pub struct ExtractRecoveredAccountFromAcceptanceSubjectCall { - pub subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, + pub struct ExtractRecoveredAccountFromAcceptanceCommandCall { + pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, pub template_idx: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `extractRecoveredAccountFromRecoverySubject` function with signature `extractRecoveredAccountFromRecoverySubject(bytes[],uint256)` and selector `0x30e6a5ab` + ///Container type for all input parameters for the `extractRecoveredAccountFromRecoveryCommand` function with signature `extractRecoveredAccountFromRecoveryCommand(bytes[],uint256)` and selector `0xa5e3ee70` #[derive( Clone, ::ethers::contract::EthCall, @@ -994,11 +994,11 @@ pub mod email_account_recovery { Hash )] #[ethcall( - name = "extractRecoveredAccountFromRecoverySubject", - abi = "extractRecoveredAccountFromRecoverySubject(bytes[],uint256)" + name = "extractRecoveredAccountFromRecoveryCommand", + abi = "extractRecoveredAccountFromRecoveryCommand(bytes[],uint256)" )] - pub struct ExtractRecoveredAccountFromRecoverySubjectCall { - pub subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, + pub struct ExtractRecoveredAccountFromRecoveryCommandCall { + pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, pub template_idx: ::ethers::core::types::U256, } ///Container type for all input parameters for the `handleAcceptance` function with signature `handleAcceptance((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0x0481af67` @@ -1067,7 +1067,7 @@ pub mod email_account_recovery { )] #[ethcall(name = "proxyBytecodeHash", abi = "proxyBytecodeHash()")] pub struct ProxyBytecodeHashCall; - ///Container type for all input parameters for the `recoverySubjectTemplates` function with signature `recoverySubjectTemplates()` and selector `0x3e91cdcd` + ///Container type for all input parameters for the `recoveryCommandTemplates` function with signature `recoveryCommandTemplates()` and selector `0x3ef01b8f` #[derive( Clone, ::ethers::contract::EthCall, @@ -1078,8 +1078,8 @@ pub mod email_account_recovery { Eq, Hash )] - #[ethcall(name = "recoverySubjectTemplates", abi = "recoverySubjectTemplates()")] - pub struct RecoverySubjectTemplatesCall; + #[ethcall(name = "recoveryCommandTemplates", abi = "recoveryCommandTemplates()")] + pub struct RecoveryCommandTemplatesCall; ///Container type for all input parameters for the `verifier` function with signature `verifier()` and selector `0x2b7ac3f3` #[derive( Clone, @@ -1109,7 +1109,7 @@ pub mod email_account_recovery { ///Container type for all of the contract's call #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] pub enum EmailAccountRecoveryCalls { - AcceptanceSubjectTemplates(AcceptanceSubjectTemplatesCall), + AcceptanceCommandTemplates(AcceptanceCommandTemplatesCall), CompleteRecovery(CompleteRecoveryCall), ComputeAcceptanceTemplateId(ComputeAcceptanceTemplateIdCall), ComputeEmailAuthAddress(ComputeEmailAuthAddressCall), @@ -1118,17 +1118,17 @@ pub mod email_account_recovery { DkimAddr(DkimAddrCall), EmailAuthImplementation(EmailAuthImplementationCall), EmailAuthImplementationAddr(EmailAuthImplementationAddrCall), - ExtractRecoveredAccountFromAcceptanceSubject( - ExtractRecoveredAccountFromAcceptanceSubjectCall, + ExtractRecoveredAccountFromAcceptanceCommand( + ExtractRecoveredAccountFromAcceptanceCommandCall, ), - ExtractRecoveredAccountFromRecoverySubject( - ExtractRecoveredAccountFromRecoverySubjectCall, + ExtractRecoveredAccountFromRecoveryCommand( + ExtractRecoveredAccountFromRecoveryCommandCall, ), HandleAcceptance(HandleAcceptanceCall), HandleRecovery(HandleRecoveryCall), IsActivated(IsActivatedCall), ProxyBytecodeHash(ProxyBytecodeHashCall), - RecoverySubjectTemplates(RecoverySubjectTemplatesCall), + RecoveryCommandTemplates(RecoveryCommandTemplatesCall), Verifier(VerifierCall), VerifierAddr(VerifierAddrCall), } @@ -1137,10 +1137,10 @@ pub mod email_account_recovery { data: impl AsRef<[u8]>, ) -> ::core::result::Result { let data = data.as_ref(); - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::AcceptanceSubjectTemplates(decoded)); + return Ok(Self::AcceptanceCommandTemplates(decoded)); } if let Ok(decoded) = ::decode( data, @@ -1182,15 +1182,15 @@ pub mod email_account_recovery { ) { return Ok(Self::EmailAuthImplementationAddr(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::ExtractRecoveredAccountFromAcceptanceSubject(decoded)); + return Ok(Self::ExtractRecoveredAccountFromAcceptanceCommand(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::ExtractRecoveredAccountFromRecoverySubject(decoded)); + return Ok(Self::ExtractRecoveredAccountFromRecoveryCommand(decoded)); } if let Ok(decoded) = ::decode( data, @@ -1212,10 +1212,10 @@ pub mod email_account_recovery { ) { return Ok(Self::ProxyBytecodeHash(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::RecoverySubjectTemplates(decoded)); + return Ok(Self::RecoveryCommandTemplates(decoded)); } if let Ok(decoded) = ::decode( data, @@ -1233,7 +1233,7 @@ pub mod email_account_recovery { impl ::ethers::core::abi::AbiEncode for EmailAccountRecoveryCalls { fn encode(self) -> Vec { match self { - Self::AcceptanceSubjectTemplates(element) => { + Self::AcceptanceCommandTemplates(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::CompleteRecovery(element) => { @@ -1258,10 +1258,10 @@ pub mod email_account_recovery { Self::EmailAuthImplementationAddr(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::ExtractRecoveredAccountFromAcceptanceSubject(element) => { + Self::ExtractRecoveredAccountFromAcceptanceCommand(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::ExtractRecoveredAccountFromRecoverySubject(element) => { + Self::ExtractRecoveredAccountFromRecoveryCommand(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::HandleAcceptance(element) => { @@ -1276,7 +1276,7 @@ pub mod email_account_recovery { Self::ProxyBytecodeHash(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::RecoverySubjectTemplates(element) => { + Self::RecoveryCommandTemplates(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::Verifier(element) => { @@ -1291,7 +1291,7 @@ pub mod email_account_recovery { impl ::core::fmt::Display for EmailAccountRecoveryCalls { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { - Self::AcceptanceSubjectTemplates(element) => { + Self::AcceptanceCommandTemplates(element) => { ::core::fmt::Display::fmt(element, f) } Self::CompleteRecovery(element) => ::core::fmt::Display::fmt(element, f), @@ -1312,17 +1312,17 @@ pub mod email_account_recovery { Self::EmailAuthImplementationAddr(element) => { ::core::fmt::Display::fmt(element, f) } - Self::ExtractRecoveredAccountFromAcceptanceSubject(element) => { + Self::ExtractRecoveredAccountFromAcceptanceCommand(element) => { ::core::fmt::Display::fmt(element, f) } - Self::ExtractRecoveredAccountFromRecoverySubject(element) => { + Self::ExtractRecoveredAccountFromRecoveryCommand(element) => { ::core::fmt::Display::fmt(element, f) } Self::HandleAcceptance(element) => ::core::fmt::Display::fmt(element, f), Self::HandleRecovery(element) => ::core::fmt::Display::fmt(element, f), Self::IsActivated(element) => ::core::fmt::Display::fmt(element, f), Self::ProxyBytecodeHash(element) => ::core::fmt::Display::fmt(element, f), - Self::RecoverySubjectTemplates(element) => { + Self::RecoveryCommandTemplates(element) => { ::core::fmt::Display::fmt(element, f) } Self::Verifier(element) => ::core::fmt::Display::fmt(element, f), @@ -1330,10 +1330,10 @@ pub mod email_account_recovery { } } } - impl ::core::convert::From + impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: AcceptanceSubjectTemplatesCall) -> Self { - Self::AcceptanceSubjectTemplates(value) + fn from(value: AcceptanceCommandTemplatesCall) -> Self { + Self::AcceptanceCommandTemplates(value) } } impl ::core::convert::From for EmailAccountRecoveryCalls { @@ -1381,16 +1381,16 @@ pub mod email_account_recovery { Self::EmailAuthImplementationAddr(value) } } - impl ::core::convert::From + impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: ExtractRecoveredAccountFromAcceptanceSubjectCall) -> Self { - Self::ExtractRecoveredAccountFromAcceptanceSubject(value) + fn from(value: ExtractRecoveredAccountFromAcceptanceCommandCall) -> Self { + Self::ExtractRecoveredAccountFromAcceptanceCommand(value) } } - impl ::core::convert::From + impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: ExtractRecoveredAccountFromRecoverySubjectCall) -> Self { - Self::ExtractRecoveredAccountFromRecoverySubject(value) + fn from(value: ExtractRecoveredAccountFromRecoveryCommandCall) -> Self { + Self::ExtractRecoveredAccountFromRecoveryCommand(value) } } impl ::core::convert::From for EmailAccountRecoveryCalls { @@ -1413,10 +1413,10 @@ pub mod email_account_recovery { Self::ProxyBytecodeHash(value) } } - impl ::core::convert::From + impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: RecoverySubjectTemplatesCall) -> Self { - Self::RecoverySubjectTemplates(value) + fn from(value: RecoveryCommandTemplatesCall) -> Self { + Self::RecoveryCommandTemplates(value) } } impl ::core::convert::From for EmailAccountRecoveryCalls { @@ -1429,7 +1429,7 @@ pub mod email_account_recovery { Self::VerifierAddr(value) } } - ///Container type for all return fields from the `acceptanceSubjectTemplates` function with signature `acceptanceSubjectTemplates()` and selector `0x5bafadda` + ///Container type for all return fields from the `acceptanceCommandTemplates` function with signature `acceptanceCommandTemplates()` and selector `0x222f6cb5` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1440,7 +1440,7 @@ pub mod email_account_recovery { Eq, Hash )] - pub struct AcceptanceSubjectTemplatesReturn( + pub struct AcceptanceCommandTemplatesReturn( pub ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, ); ///Container type for all return fields from the `computeAcceptanceTemplateId` function with signature `computeAcceptanceTemplateId(uint256)` and selector `0x32ccc2f2` @@ -1527,7 +1527,7 @@ pub mod email_account_recovery { Hash )] pub struct EmailAuthImplementationAddrReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `extractRecoveredAccountFromAcceptanceSubject` function with signature `extractRecoveredAccountFromAcceptanceSubject(bytes[],uint256)` and selector `0xe81dcaf2` + ///Container type for all return fields from the `extractRecoveredAccountFromAcceptanceCommand` function with signature `extractRecoveredAccountFromAcceptanceCommand(bytes[],uint256)` and selector `0x2c4ce129` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1538,10 +1538,10 @@ pub mod email_account_recovery { Eq, Hash )] - pub struct ExtractRecoveredAccountFromAcceptanceSubjectReturn( + pub struct ExtractRecoveredAccountFromAcceptanceCommandReturn( pub ::ethers::core::types::Address, ); - ///Container type for all return fields from the `extractRecoveredAccountFromRecoverySubject` function with signature `extractRecoveredAccountFromRecoverySubject(bytes[],uint256)` and selector `0x30e6a5ab` + ///Container type for all return fields from the `extractRecoveredAccountFromRecoveryCommand` function with signature `extractRecoveredAccountFromRecoveryCommand(bytes[],uint256)` and selector `0xa5e3ee70` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1552,7 +1552,7 @@ pub mod email_account_recovery { Eq, Hash )] - pub struct ExtractRecoveredAccountFromRecoverySubjectReturn( + pub struct ExtractRecoveredAccountFromRecoveryCommandReturn( pub ::ethers::core::types::Address, ); ///Container type for all return fields from the `isActivated` function with signature `isActivated(address)` and selector `0xc9faa7c5` @@ -1579,7 +1579,7 @@ pub mod email_account_recovery { Hash )] pub struct ProxyBytecodeHashReturn(pub [u8; 32]); - ///Container type for all return fields from the `recoverySubjectTemplates` function with signature `recoverySubjectTemplates()` and selector `0x3e91cdcd` + ///Container type for all return fields from the `recoveryCommandTemplates` function with signature `recoveryCommandTemplates()` and selector `0x3ef01b8f` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1590,7 +1590,7 @@ pub mod email_account_recovery { Eq, Hash )] - pub struct RecoverySubjectTemplatesReturn( + pub struct RecoveryCommandTemplatesReturn( pub ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, ); ///Container type for all return fields from the `verifier` function with signature `verifier()` and selector `0x2b7ac3f3` @@ -1630,8 +1630,8 @@ pub mod email_account_recovery { )] pub struct EmailAuthMsg { pub template_id: ::ethers::core::types::U256, - pub subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub skiped_subject_prefix: ::ethers::core::types::U256, + pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, + pub skiped_command_prefix: ::ethers::core::types::U256, pub proof: EmailProof, } ///`EmailProof(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)` @@ -1649,7 +1649,7 @@ pub mod email_account_recovery { pub domain_name: ::std::string::String, pub public_key_hash: [u8; 32], pub timestamp: ::ethers::core::types::U256, - pub masked_subject: ::std::string::String, + pub masked_command: ::std::string::String, pub email_nullifier: [u8; 32], pub account_salt: [u8; 32], pub is_code_exist: bool, diff --git a/packages/relayer/src/abis/email_auth.rs b/packages/relayer/src/abis/email_auth.rs index 10d27c61..ab5ae1cc 100644 --- a/packages/relayer/src/abis/email_auth.rs +++ b/packages/relayer/src/abis/email_auth.rs @@ -103,6 +103,45 @@ pub mod email_auth { }, ], ), + ( + ::std::borrow::ToOwned::to_owned("commandTemplates"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("commandTemplates"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::String, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("string"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + }, + ], + ), ( ::std::borrow::ToOwned::to_owned("controller"), ::std::vec![ @@ -124,11 +163,11 @@ pub mod email_auth { ], ), ( - ::std::borrow::ToOwned::to_owned("deleteSubjectTemplate"), + ::std::borrow::ToOwned::to_owned("deleteCommandTemplate"), ::std::vec![ ::ethers::core::abi::ethabi::Function { name: ::std::borrow::ToOwned::to_owned( - "deleteSubjectTemplate", + "deleteCommandTemplate", ), inputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { @@ -168,10 +207,10 @@ pub mod email_auth { ], ), ( - ::std::borrow::ToOwned::to_owned("getSubjectTemplate"), + ::std::borrow::ToOwned::to_owned("getCommandTemplate"), ::std::vec![ ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("getSubjectTemplate"), + name: ::std::borrow::ToOwned::to_owned("getCommandTemplate"), inputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { name: ::std::borrow::ToOwned::to_owned("_templateId"), @@ -278,11 +317,11 @@ pub mod email_auth { ], ), ( - ::std::borrow::ToOwned::to_owned("insertSubjectTemplate"), + ::std::borrow::ToOwned::to_owned("insertCommandTemplate"), ::std::vec![ ::ethers::core::abi::ethabi::Function { name: ::std::borrow::ToOwned::to_owned( - "insertSubjectTemplate", + "insertCommandTemplate", ), inputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { @@ -295,7 +334,7 @@ pub mod email_auth { ), }, ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_subjectTemplate"), + name: ::std::borrow::ToOwned::to_owned("_commandTemplate"), kind: ::ethers::core::abi::ethabi::ParamType::Array( ::std::boxed::Box::new( ::ethers::core::abi::ethabi::ParamType::String, @@ -410,45 +449,6 @@ pub mod email_auth { }, ], ), - ( - ::std::borrow::ToOwned::to_owned("subjectTemplates"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("subjectTemplates"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), ( ::std::borrow::ToOwned::to_owned("timestampCheckEnabled"), ::std::vec![ @@ -492,31 +492,11 @@ pub mod email_auth { ], ), ( - ::std::borrow::ToOwned::to_owned("updateDKIMRegistry"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("updateDKIMRegistry"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_dkimRegistryAddr"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("updateSubjectTemplate"), + ::std::borrow::ToOwned::to_owned("updateCommandTemplate"), ::std::vec![ ::ethers::core::abi::ethabi::Function { name: ::std::borrow::ToOwned::to_owned( - "updateSubjectTemplate", + "updateCommandTemplate", ), inputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { @@ -529,7 +509,7 @@ pub mod email_auth { ), }, ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_subjectTemplate"), + name: ::std::borrow::ToOwned::to_owned("_commandTemplate"), kind: ::ethers::core::abi::ethabi::ParamType::Array( ::std::boxed::Box::new( ::ethers::core::abi::ethabi::ParamType::String, @@ -546,6 +526,26 @@ pub mod email_auth { }, ], ), + ( + ::std::borrow::ToOwned::to_owned("updateDKIMRegistry"), + ::std::vec![ + ::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("updateDKIMRegistry"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("_dkimRegistryAddr"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + }, + ], + ), ( ::std::borrow::ToOwned::to_owned("updateVerifier"), ::std::vec![ @@ -646,16 +646,18 @@ pub mod email_auth { ]), events: ::core::convert::From::from([ ( - ::std::borrow::ToOwned::to_owned("DKIMRegistryUpdated"), + ::std::borrow::ToOwned::to_owned("CommandTemplateDeleted"), ::std::vec![ ::ethers::core::abi::ethabi::Event { name: ::std::borrow::ToOwned::to_owned( - "DKIMRegistryUpdated", + "CommandTemplateDeleted", ), inputs: ::std::vec![ ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("dkimRegistry"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, + name: ::std::borrow::ToOwned::to_owned("templateId"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), indexed: true, }, ], @@ -664,36 +666,19 @@ pub mod email_auth { ], ), ( - ::std::borrow::ToOwned::to_owned("EmailAuthed"), + ::std::borrow::ToOwned::to_owned("CommandTemplateInserted"), ::std::vec![ ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("EmailAuthed"), + name: ::std::borrow::ToOwned::to_owned( + "CommandTemplateInserted", + ), inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("emailNullifier"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("accountSalt"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("isCodeExist"), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - indexed: false, - }, ::ethers::core::abi::ethabi::EventParam { name: ::std::borrow::ToOwned::to_owned("templateId"), kind: ::ethers::core::abi::ethabi::ParamType::Uint( 256usize, ), - indexed: false, + indexed: true, }, ], anonymous: false, @@ -701,15 +686,19 @@ pub mod email_auth { ], ), ( - ::std::borrow::ToOwned::to_owned("Initialized"), + ::std::borrow::ToOwned::to_owned("CommandTemplateUpdated"), ::std::vec![ ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Initialized"), + name: ::std::borrow::ToOwned::to_owned( + "CommandTemplateUpdated", + ), inputs: ::std::vec![ ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("version"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), - indexed: false, + name: ::std::borrow::ToOwned::to_owned("templateId"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint( + 256usize, + ), + indexed: true, }, ], anonymous: false, @@ -717,20 +706,15 @@ pub mod email_auth { ], ), ( - ::std::borrow::ToOwned::to_owned("OwnershipTransferred"), + ::std::borrow::ToOwned::to_owned("DKIMRegistryUpdated"), ::std::vec![ ::ethers::core::abi::ethabi::Event { name: ::std::borrow::ToOwned::to_owned( - "OwnershipTransferred", + "DKIMRegistryUpdated", ), inputs: ::std::vec![ ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("previousOwner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("newOwner"), + name: ::std::borrow::ToOwned::to_owned("dkimRegistry"), kind: ::ethers::core::abi::ethabi::ParamType::Address, indexed: true, }, @@ -740,19 +724,36 @@ pub mod email_auth { ], ), ( - ::std::borrow::ToOwned::to_owned("SubjectTemplateDeleted"), + ::std::borrow::ToOwned::to_owned("EmailAuthed"), ::std::vec![ ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "SubjectTemplateDeleted", - ), + name: ::std::borrow::ToOwned::to_owned("EmailAuthed"), inputs: ::std::vec![ + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("emailNullifier"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( + 32usize, + ), + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("accountSalt"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( + 32usize, + ), + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("isCodeExist"), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + indexed: false, + }, ::ethers::core::abi::ethabi::EventParam { name: ::std::borrow::ToOwned::to_owned("templateId"), kind: ::ethers::core::abi::ethabi::ParamType::Uint( 256usize, ), - indexed: true, + indexed: false, }, ], anonymous: false, @@ -760,19 +761,15 @@ pub mod email_auth { ], ), ( - ::std::borrow::ToOwned::to_owned("SubjectTemplateInserted"), + ::std::borrow::ToOwned::to_owned("Initialized"), ::std::vec![ ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "SubjectTemplateInserted", - ), + name: ::std::borrow::ToOwned::to_owned("Initialized"), inputs: ::std::vec![ ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("templateId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: true, + name: ::std::borrow::ToOwned::to_owned("version"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + indexed: false, }, ], anonymous: false, @@ -780,18 +777,21 @@ pub mod email_auth { ], ), ( - ::std::borrow::ToOwned::to_owned("SubjectTemplateUpdated"), + ::std::borrow::ToOwned::to_owned("OwnershipTransferred"), ::std::vec![ ::ethers::core::abi::ethabi::Event { name: ::std::borrow::ToOwned::to_owned( - "SubjectTemplateUpdated", + "OwnershipTransferred", ), inputs: ::std::vec![ ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("templateId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), + name: ::std::borrow::ToOwned::to_owned("previousOwner"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("newOwner"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, indexed: true, }, ], @@ -1066,6 +1066,16 @@ pub mod email_auth { .method_hash([173, 63, 95, 155], (email_auth_msg,)) .expect("method not found (this should never happen)") } + ///Calls the contract's `commandTemplates` (0x091c1650) function + pub fn command_templates( + &self, + p0: ::ethers::core::types::U256, + p1: ::ethers::core::types::U256, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([9, 28, 22, 80], (p0, p1)) + .expect("method not found (this should never happen)") + } ///Calls the contract's `controller` (0xf77c4791) function pub fn controller( &self, @@ -1077,13 +1087,13 @@ pub mod email_auth { .method_hash([247, 124, 71, 145], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `deleteSubjectTemplate` (0x519e50d1) function - pub fn delete_subject_template( + ///Calls the contract's `deleteCommandTemplate` (0x640e8b69) function + pub fn delete_command_template( &self, template_id: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([81, 158, 80, 209], template_id) + .method_hash([100, 14, 139, 105], template_id) .expect("method not found (this should never happen)") } ///Calls the contract's `dkimRegistryAddr` (0x1bc01b83) function @@ -1097,8 +1107,8 @@ pub mod email_auth { .method_hash([27, 192, 27, 131], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `getSubjectTemplate` (0x1e05a028) function - pub fn get_subject_template( + ///Calls the contract's `getCommandTemplate` (0x95e33c08) function + pub fn get_command_template( &self, template_id: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall< @@ -1106,7 +1116,7 @@ pub mod email_auth { ::std::vec::Vec<::std::string::String>, > { self.0 - .method_hash([30, 5, 160, 40], template_id) + .method_hash([149, 227, 60, 8], template_id) .expect("method not found (this should never happen)") } ///Calls the contract's `initDKIMRegistry` (0x557cf5ef) function @@ -1141,14 +1151,14 @@ pub mod email_auth { ) .expect("method not found (this should never happen)") } - ///Calls the contract's `insertSubjectTemplate` (0xc4b84df4) function - pub fn insert_subject_template( + ///Calls the contract's `insertCommandTemplate` (0x8ff3730f) function + pub fn insert_command_template( &self, template_id: ::ethers::core::types::U256, - subject_template: ::std::vec::Vec<::std::string::String>, + command_template: ::std::vec::Vec<::std::string::String>, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([196, 184, 77, 244], (template_id, subject_template)) + .method_hash([143, 243, 115, 15], (template_id, command_template)) .expect("method not found (this should never happen)") } ///Calls the contract's `lastTimestamp` (0x19d8ac61) function @@ -1195,16 +1205,6 @@ pub mod email_auth { .method_hash([228, 83, 192, 243], enabled) .expect("method not found (this should never happen)") } - ///Calls the contract's `subjectTemplates` (0x4bd07760) function - pub fn subject_templates( - &self, - p0: ::ethers::core::types::U256, - p1: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([75, 208, 119, 96], (p0, p1)) - .expect("method not found (this should never happen)") - } ///Calls the contract's `timestampCheckEnabled` (0x3e56f529) function pub fn timestamp_check_enabled( &self, @@ -1222,23 +1222,23 @@ pub mod email_auth { .method_hash([242, 253, 227, 139], new_owner) .expect("method not found (this should never happen)") } - ///Calls the contract's `updateDKIMRegistry` (0xa500125c) function - pub fn update_dkim_registry( + ///Calls the contract's `updateCommandTemplate` (0x24e33f11) function + pub fn update_command_template( &self, - dkim_registry_addr: ::ethers::core::types::Address, + template_id: ::ethers::core::types::U256, + command_template: ::std::vec::Vec<::std::string::String>, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([165, 0, 18, 92], dkim_registry_addr) + .method_hash([36, 227, 63, 17], (template_id, command_template)) .expect("method not found (this should never happen)") } - ///Calls the contract's `updateSubjectTemplate` (0x4dbb82f1) function - pub fn update_subject_template( + ///Calls the contract's `updateDKIMRegistry` (0xa500125c) function + pub fn update_dkim_registry( &self, - template_id: ::ethers::core::types::U256, - subject_template: ::std::vec::Vec<::std::string::String>, + dkim_registry_addr: ::ethers::core::types::Address, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([77, 187, 130, 241], (template_id, subject_template)) + .method_hash([165, 0, 18, 92], dkim_registry_addr) .expect("method not found (this should never happen)") } ///Calls the contract's `updateVerifier` (0x97fc007c) function @@ -1280,73 +1280,73 @@ pub mod email_auth { .method_hash([102, 62, 162, 226], ()) .expect("method not found (this should never happen)") } - ///Gets the contract's `DKIMRegistryUpdated` event - pub fn dkim_registry_updated_filter( + ///Gets the contract's `CommandTemplateDeleted` event + pub fn command_template_deleted_filter( &self, ) -> ::ethers::contract::builders::Event< ::std::sync::Arc, M, - DkimregistryUpdatedFilter, + CommandTemplateDeletedFilter, > { self.0.event() } - ///Gets the contract's `EmailAuthed` event - pub fn email_authed_filter( + ///Gets the contract's `CommandTemplateInserted` event + pub fn command_template_inserted_filter( &self, ) -> ::ethers::contract::builders::Event< ::std::sync::Arc, M, - EmailAuthedFilter, + CommandTemplateInsertedFilter, > { self.0.event() } - ///Gets the contract's `Initialized` event - pub fn initialized_filter( + ///Gets the contract's `CommandTemplateUpdated` event + pub fn command_template_updated_filter( &self, ) -> ::ethers::contract::builders::Event< ::std::sync::Arc, M, - InitializedFilter, + CommandTemplateUpdatedFilter, > { self.0.event() } - ///Gets the contract's `OwnershipTransferred` event - pub fn ownership_transferred_filter( + ///Gets the contract's `DKIMRegistryUpdated` event + pub fn dkim_registry_updated_filter( &self, ) -> ::ethers::contract::builders::Event< ::std::sync::Arc, M, - OwnershipTransferredFilter, + DkimregistryUpdatedFilter, > { self.0.event() } - ///Gets the contract's `SubjectTemplateDeleted` event - pub fn subject_template_deleted_filter( + ///Gets the contract's `EmailAuthed` event + pub fn email_authed_filter( &self, ) -> ::ethers::contract::builders::Event< ::std::sync::Arc, M, - SubjectTemplateDeletedFilter, + EmailAuthedFilter, > { self.0.event() } - ///Gets the contract's `SubjectTemplateInserted` event - pub fn subject_template_inserted_filter( + ///Gets the contract's `Initialized` event + pub fn initialized_filter( &self, ) -> ::ethers::contract::builders::Event< ::std::sync::Arc, M, - SubjectTemplateInsertedFilter, + InitializedFilter, > { self.0.event() } - ///Gets the contract's `SubjectTemplateUpdated` event - pub fn subject_template_updated_filter( + ///Gets the contract's `OwnershipTransferred` event + pub fn ownership_transferred_filter( &self, ) -> ::ethers::contract::builders::Event< ::std::sync::Arc, M, - SubjectTemplateUpdatedFilter, + OwnershipTransferredFilter, > { self.0.event() } @@ -1808,10 +1808,10 @@ pub mod email_auth { Eq, Hash )] - #[ethevent(name = "DKIMRegistryUpdated", abi = "DKIMRegistryUpdated(address)")] - pub struct DkimregistryUpdatedFilter { + #[ethevent(name = "CommandTemplateDeleted", abi = "CommandTemplateDeleted(uint256)")] + pub struct CommandTemplateDeletedFilter { #[ethevent(indexed)] - pub dkim_registry: ::ethers::core::types::Address, + pub template_id: ::ethers::core::types::U256, } #[derive( Clone, @@ -1823,13 +1823,12 @@ pub mod email_auth { Eq, Hash )] - #[ethevent(name = "EmailAuthed", abi = "EmailAuthed(bytes32,bytes32,bool,uint256)")] - pub struct EmailAuthedFilter { - #[ethevent(indexed)] - pub email_nullifier: [u8; 32], + #[ethevent( + name = "CommandTemplateInserted", + abi = "CommandTemplateInserted(uint256)" + )] + pub struct CommandTemplateInsertedFilter { #[ethevent(indexed)] - pub account_salt: [u8; 32], - pub is_code_exist: bool, pub template_id: ::ethers::core::types::U256, } #[derive( @@ -1842,9 +1841,10 @@ pub mod email_auth { Eq, Hash )] - #[ethevent(name = "Initialized", abi = "Initialized(uint64)")] - pub struct InitializedFilter { - pub version: u64, + #[ethevent(name = "CommandTemplateUpdated", abi = "CommandTemplateUpdated(uint256)")] + pub struct CommandTemplateUpdatedFilter { + #[ethevent(indexed)] + pub template_id: ::ethers::core::types::U256, } #[derive( Clone, @@ -1856,15 +1856,10 @@ pub mod email_auth { Eq, Hash )] - #[ethevent( - name = "OwnershipTransferred", - abi = "OwnershipTransferred(address,address)" - )] - pub struct OwnershipTransferredFilter { - #[ethevent(indexed)] - pub previous_owner: ::ethers::core::types::Address, + #[ethevent(name = "DKIMRegistryUpdated", abi = "DKIMRegistryUpdated(address)")] + pub struct DkimregistryUpdatedFilter { #[ethevent(indexed)] - pub new_owner: ::ethers::core::types::Address, + pub dkim_registry: ::ethers::core::types::Address, } #[derive( Clone, @@ -1876,9 +1871,13 @@ pub mod email_auth { Eq, Hash )] - #[ethevent(name = "SubjectTemplateDeleted", abi = "SubjectTemplateDeleted(uint256)")] - pub struct SubjectTemplateDeletedFilter { + #[ethevent(name = "EmailAuthed", abi = "EmailAuthed(bytes32,bytes32,bool,uint256)")] + pub struct EmailAuthedFilter { + #[ethevent(indexed)] + pub email_nullifier: [u8; 32], #[ethevent(indexed)] + pub account_salt: [u8; 32], + pub is_code_exist: bool, pub template_id: ::ethers::core::types::U256, } #[derive( @@ -1891,13 +1890,9 @@ pub mod email_auth { Eq, Hash )] - #[ethevent( - name = "SubjectTemplateInserted", - abi = "SubjectTemplateInserted(uint256)" - )] - pub struct SubjectTemplateInsertedFilter { - #[ethevent(indexed)] - pub template_id: ::ethers::core::types::U256, + #[ethevent(name = "Initialized", abi = "Initialized(uint64)")] + pub struct InitializedFilter { + pub version: u64, } #[derive( Clone, @@ -1909,10 +1904,15 @@ pub mod email_auth { Eq, Hash )] - #[ethevent(name = "SubjectTemplateUpdated", abi = "SubjectTemplateUpdated(uint256)")] - pub struct SubjectTemplateUpdatedFilter { + #[ethevent( + name = "OwnershipTransferred", + abi = "OwnershipTransferred(address,address)" + )] + pub struct OwnershipTransferredFilter { #[ethevent(indexed)] - pub template_id: ::ethers::core::types::U256, + pub previous_owner: ::ethers::core::types::Address, + #[ethevent(indexed)] + pub new_owner: ::ethers::core::types::Address, } #[derive( Clone, @@ -1961,13 +1961,13 @@ pub mod email_auth { ///Container type for all of the contract's events #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] pub enum EmailAuthEvents { + CommandTemplateDeletedFilter(CommandTemplateDeletedFilter), + CommandTemplateInsertedFilter(CommandTemplateInsertedFilter), + CommandTemplateUpdatedFilter(CommandTemplateUpdatedFilter), DkimregistryUpdatedFilter(DkimregistryUpdatedFilter), EmailAuthedFilter(EmailAuthedFilter), InitializedFilter(InitializedFilter), OwnershipTransferredFilter(OwnershipTransferredFilter), - SubjectTemplateDeletedFilter(SubjectTemplateDeletedFilter), - SubjectTemplateInsertedFilter(SubjectTemplateInsertedFilter), - SubjectTemplateUpdatedFilter(SubjectTemplateUpdatedFilter), TimestampCheckEnabledFilter(TimestampCheckEnabledFilter), UpgradedFilter(UpgradedFilter), VerifierUpdatedFilter(VerifierUpdatedFilter), @@ -1976,6 +1976,15 @@ pub mod email_auth { fn decode_log( log: &::ethers::core::abi::RawLog, ) -> ::core::result::Result { + if let Ok(decoded) = CommandTemplateDeletedFilter::decode_log(log) { + return Ok(EmailAuthEvents::CommandTemplateDeletedFilter(decoded)); + } + if let Ok(decoded) = CommandTemplateInsertedFilter::decode_log(log) { + return Ok(EmailAuthEvents::CommandTemplateInsertedFilter(decoded)); + } + if let Ok(decoded) = CommandTemplateUpdatedFilter::decode_log(log) { + return Ok(EmailAuthEvents::CommandTemplateUpdatedFilter(decoded)); + } if let Ok(decoded) = DkimregistryUpdatedFilter::decode_log(log) { return Ok(EmailAuthEvents::DkimregistryUpdatedFilter(decoded)); } @@ -1988,15 +1997,6 @@ pub mod email_auth { if let Ok(decoded) = OwnershipTransferredFilter::decode_log(log) { return Ok(EmailAuthEvents::OwnershipTransferredFilter(decoded)); } - if let Ok(decoded) = SubjectTemplateDeletedFilter::decode_log(log) { - return Ok(EmailAuthEvents::SubjectTemplateDeletedFilter(decoded)); - } - if let Ok(decoded) = SubjectTemplateInsertedFilter::decode_log(log) { - return Ok(EmailAuthEvents::SubjectTemplateInsertedFilter(decoded)); - } - if let Ok(decoded) = SubjectTemplateUpdatedFilter::decode_log(log) { - return Ok(EmailAuthEvents::SubjectTemplateUpdatedFilter(decoded)); - } if let Ok(decoded) = TimestampCheckEnabledFilter::decode_log(log) { return Ok(EmailAuthEvents::TimestampCheckEnabledFilter(decoded)); } @@ -2012,21 +2012,21 @@ pub mod email_auth { impl ::core::fmt::Display for EmailAuthEvents { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { - Self::DkimregistryUpdatedFilter(element) => { + Self::CommandTemplateDeletedFilter(element) => { ::core::fmt::Display::fmt(element, f) } - Self::EmailAuthedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::OwnershipTransferredFilter(element) => { + Self::CommandTemplateInsertedFilter(element) => { ::core::fmt::Display::fmt(element, f) } - Self::SubjectTemplateDeletedFilter(element) => { + Self::CommandTemplateUpdatedFilter(element) => { ::core::fmt::Display::fmt(element, f) } - Self::SubjectTemplateInsertedFilter(element) => { + Self::DkimregistryUpdatedFilter(element) => { ::core::fmt::Display::fmt(element, f) } - Self::SubjectTemplateUpdatedFilter(element) => { + Self::EmailAuthedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::OwnershipTransferredFilter(element) => { ::core::fmt::Display::fmt(element, f) } Self::TimestampCheckEnabledFilter(element) => { @@ -2039,6 +2039,21 @@ pub mod email_auth { } } } + impl ::core::convert::From for EmailAuthEvents { + fn from(value: CommandTemplateDeletedFilter) -> Self { + Self::CommandTemplateDeletedFilter(value) + } + } + impl ::core::convert::From for EmailAuthEvents { + fn from(value: CommandTemplateInsertedFilter) -> Self { + Self::CommandTemplateInsertedFilter(value) + } + } + impl ::core::convert::From for EmailAuthEvents { + fn from(value: CommandTemplateUpdatedFilter) -> Self { + Self::CommandTemplateUpdatedFilter(value) + } + } impl ::core::convert::From for EmailAuthEvents { fn from(value: DkimregistryUpdatedFilter) -> Self { Self::DkimregistryUpdatedFilter(value) @@ -2059,21 +2074,6 @@ pub mod email_auth { Self::OwnershipTransferredFilter(value) } } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: SubjectTemplateDeletedFilter) -> Self { - Self::SubjectTemplateDeletedFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: SubjectTemplateInsertedFilter) -> Self { - Self::SubjectTemplateInsertedFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: SubjectTemplateUpdatedFilter) -> Self { - Self::SubjectTemplateUpdatedFilter(value) - } - } impl ::core::convert::From for EmailAuthEvents { fn from(value: TimestampCheckEnabledFilter) -> Self { Self::TimestampCheckEnabledFilter(value) @@ -2133,6 +2133,22 @@ pub mod email_auth { pub struct AuthEmailCall { pub email_auth_msg: EmailAuthMsg, } + ///Container type for all input parameters for the `commandTemplates` function with signature `commandTemplates(uint256,uint256)` and selector `0x091c1650` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + #[ethcall(name = "commandTemplates", abi = "commandTemplates(uint256,uint256)")] + pub struct CommandTemplatesCall( + pub ::ethers::core::types::U256, + pub ::ethers::core::types::U256, + ); ///Container type for all input parameters for the `controller` function with signature `controller()` and selector `0xf77c4791` #[derive( Clone, @@ -2146,7 +2162,7 @@ pub mod email_auth { )] #[ethcall(name = "controller", abi = "controller()")] pub struct ControllerCall; - ///Container type for all input parameters for the `deleteSubjectTemplate` function with signature `deleteSubjectTemplate(uint256)` and selector `0x519e50d1` + ///Container type for all input parameters for the `deleteCommandTemplate` function with signature `deleteCommandTemplate(uint256)` and selector `0x640e8b69` #[derive( Clone, ::ethers::contract::EthCall, @@ -2157,8 +2173,8 @@ pub mod email_auth { Eq, Hash )] - #[ethcall(name = "deleteSubjectTemplate", abi = "deleteSubjectTemplate(uint256)")] - pub struct DeleteSubjectTemplateCall { + #[ethcall(name = "deleteCommandTemplate", abi = "deleteCommandTemplate(uint256)")] + pub struct DeleteCommandTemplateCall { pub template_id: ::ethers::core::types::U256, } ///Container type for all input parameters for the `dkimRegistryAddr` function with signature `dkimRegistryAddr()` and selector `0x1bc01b83` @@ -2174,7 +2190,7 @@ pub mod email_auth { )] #[ethcall(name = "dkimRegistryAddr", abi = "dkimRegistryAddr()")] pub struct DkimRegistryAddrCall; - ///Container type for all input parameters for the `getSubjectTemplate` function with signature `getSubjectTemplate(uint256)` and selector `0x1e05a028` + ///Container type for all input parameters for the `getCommandTemplate` function with signature `getCommandTemplate(uint256)` and selector `0x95e33c08` #[derive( Clone, ::ethers::contract::EthCall, @@ -2185,8 +2201,8 @@ pub mod email_auth { Eq, Hash )] - #[ethcall(name = "getSubjectTemplate", abi = "getSubjectTemplate(uint256)")] - pub struct GetSubjectTemplateCall { + #[ethcall(name = "getCommandTemplate", abi = "getCommandTemplate(uint256)")] + pub struct GetCommandTemplateCall { pub template_id: ::ethers::core::types::U256, } ///Container type for all input parameters for the `initDKIMRegistry` function with signature `initDKIMRegistry(address)` and selector `0x557cf5ef` @@ -2236,7 +2252,7 @@ pub mod email_auth { pub account_salt: [u8; 32], pub controller: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `insertSubjectTemplate` function with signature `insertSubjectTemplate(uint256,string[])` and selector `0xc4b84df4` + ///Container type for all input parameters for the `insertCommandTemplate` function with signature `insertCommandTemplate(uint256,string[])` and selector `0x8ff3730f` #[derive( Clone, ::ethers::contract::EthCall, @@ -2248,12 +2264,12 @@ pub mod email_auth { Hash )] #[ethcall( - name = "insertSubjectTemplate", - abi = "insertSubjectTemplate(uint256,string[])" + name = "insertCommandTemplate", + abi = "insertCommandTemplate(uint256,string[])" )] - pub struct InsertSubjectTemplateCall { + pub struct InsertCommandTemplateCall { pub template_id: ::ethers::core::types::U256, - pub subject_template: ::std::vec::Vec<::std::string::String>, + pub command_template: ::std::vec::Vec<::std::string::String>, } ///Container type for all input parameters for the `lastTimestamp` function with signature `lastTimestamp()` and selector `0x19d8ac61` #[derive( @@ -2322,22 +2338,6 @@ pub mod email_auth { pub struct SetTimestampCheckEnabledCall { pub enabled: bool, } - ///Container type for all input parameters for the `subjectTemplates` function with signature `subjectTemplates(uint256,uint256)` and selector `0x4bd07760` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "subjectTemplates", abi = "subjectTemplates(uint256,uint256)")] - pub struct SubjectTemplatesCall( - pub ::ethers::core::types::U256, - pub ::ethers::core::types::U256, - ); ///Container type for all input parameters for the `timestampCheckEnabled` function with signature `timestampCheckEnabled()` and selector `0x3e56f529` #[derive( Clone, @@ -2366,7 +2366,7 @@ pub mod email_auth { pub struct TransferOwnershipCall { pub new_owner: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `updateDKIMRegistry` function with signature `updateDKIMRegistry(address)` and selector `0xa500125c` + ///Container type for all input parameters for the `updateCommandTemplate` function with signature `updateCommandTemplate(uint256,string[])` and selector `0x24e33f11` #[derive( Clone, ::ethers::contract::EthCall, @@ -2377,11 +2377,15 @@ pub mod email_auth { Eq, Hash )] - #[ethcall(name = "updateDKIMRegistry", abi = "updateDKIMRegistry(address)")] - pub struct UpdateDKIMRegistryCall { - pub dkim_registry_addr: ::ethers::core::types::Address, + #[ethcall( + name = "updateCommandTemplate", + abi = "updateCommandTemplate(uint256,string[])" + )] + pub struct UpdateCommandTemplateCall { + pub template_id: ::ethers::core::types::U256, + pub command_template: ::std::vec::Vec<::std::string::String>, } - ///Container type for all input parameters for the `updateSubjectTemplate` function with signature `updateSubjectTemplate(uint256,string[])` and selector `0x4dbb82f1` + ///Container type for all input parameters for the `updateDKIMRegistry` function with signature `updateDKIMRegistry(address)` and selector `0xa500125c` #[derive( Clone, ::ethers::contract::EthCall, @@ -2392,13 +2396,9 @@ pub mod email_auth { Eq, Hash )] - #[ethcall( - name = "updateSubjectTemplate", - abi = "updateSubjectTemplate(uint256,string[])" - )] - pub struct UpdateSubjectTemplateCall { - pub template_id: ::ethers::core::types::U256, - pub subject_template: ::std::vec::Vec<::std::string::String>, + #[ethcall(name = "updateDKIMRegistry", abi = "updateDKIMRegistry(address)")] + pub struct UpdateDKIMRegistryCall { + pub dkim_registry_addr: ::ethers::core::types::Address, } ///Container type for all input parameters for the `updateVerifier` function with signature `updateVerifier(address)` and selector `0x97fc007c` #[derive( @@ -2463,24 +2463,24 @@ pub mod email_auth { UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), AccountSalt(AccountSaltCall), AuthEmail(AuthEmailCall), + CommandTemplates(CommandTemplatesCall), Controller(ControllerCall), - DeleteSubjectTemplate(DeleteSubjectTemplateCall), + DeleteCommandTemplate(DeleteCommandTemplateCall), DkimRegistryAddr(DkimRegistryAddrCall), - GetSubjectTemplate(GetSubjectTemplateCall), + GetCommandTemplate(GetCommandTemplateCall), InitDKIMRegistry(InitDKIMRegistryCall), InitVerifier(InitVerifierCall), Initialize(InitializeCall), - InsertSubjectTemplate(InsertSubjectTemplateCall), + InsertCommandTemplate(InsertCommandTemplateCall), LastTimestamp(LastTimestampCall), Owner(OwnerCall), ProxiableUUID(ProxiableUUIDCall), RenounceOwnership(RenounceOwnershipCall), SetTimestampCheckEnabled(SetTimestampCheckEnabledCall), - SubjectTemplates(SubjectTemplatesCall), TimestampCheckEnabled(TimestampCheckEnabledCall), TransferOwnership(TransferOwnershipCall), + UpdateCommandTemplate(UpdateCommandTemplateCall), UpdateDKIMRegistry(UpdateDKIMRegistryCall), - UpdateSubjectTemplate(UpdateSubjectTemplateCall), UpdateVerifier(UpdateVerifierCall), UpgradeToAndCall(UpgradeToAndCallCall), UsedNullifiers(UsedNullifiersCall), @@ -2506,25 +2506,30 @@ pub mod email_auth { ) { return Ok(Self::AuthEmail(decoded)); } + if let Ok(decoded) = ::decode( + data, + ) { + return Ok(Self::CommandTemplates(decoded)); + } if let Ok(decoded) = ::decode( data, ) { return Ok(Self::Controller(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::DeleteSubjectTemplate(decoded)); + return Ok(Self::DeleteCommandTemplate(decoded)); } if let Ok(decoded) = ::decode( data, ) { return Ok(Self::DkimRegistryAddr(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::GetSubjectTemplate(decoded)); + return Ok(Self::GetCommandTemplate(decoded)); } if let Ok(decoded) = ::decode( data, @@ -2541,10 +2546,10 @@ pub mod email_auth { ) { return Ok(Self::Initialize(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::InsertSubjectTemplate(decoded)); + return Ok(Self::InsertCommandTemplate(decoded)); } if let Ok(decoded) = ::decode( data, @@ -2571,11 +2576,6 @@ pub mod email_auth { ) { return Ok(Self::SetTimestampCheckEnabled(decoded)); } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::SubjectTemplates(decoded)); - } if let Ok(decoded) = ::decode( data, ) { @@ -2586,15 +2586,15 @@ pub mod email_auth { ) { return Ok(Self::TransferOwnership(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::UpdateDKIMRegistry(decoded)); + return Ok(Self::UpdateCommandTemplate(decoded)); } - if let Ok(decoded) = ::decode( + if let Ok(decoded) = ::decode( data, ) { - return Ok(Self::UpdateSubjectTemplate(decoded)); + return Ok(Self::UpdateDKIMRegistry(decoded)); } if let Ok(decoded) = ::decode( data, @@ -2631,16 +2631,19 @@ pub mod email_auth { Self::AuthEmail(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::CommandTemplates(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::Controller(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::DeleteSubjectTemplate(element) => { + Self::DeleteCommandTemplate(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::DkimRegistryAddr(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::GetSubjectTemplate(element) => { + Self::GetCommandTemplate(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::InitDKIMRegistry(element) => { @@ -2652,7 +2655,7 @@ pub mod email_auth { Self::Initialize(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::InsertSubjectTemplate(element) => { + Self::InsertCommandTemplate(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::LastTimestamp(element) => { @@ -2668,19 +2671,16 @@ pub mod email_auth { Self::SetTimestampCheckEnabled(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::SubjectTemplates(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::TimestampCheckEnabled(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::TransferOwnership(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::UpdateDKIMRegistry(element) => { + Self::UpdateCommandTemplate(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::UpdateSubjectTemplate(element) => { + Self::UpdateDKIMRegistry(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::UpdateVerifier(element) => { @@ -2706,18 +2706,19 @@ pub mod email_auth { } Self::AccountSalt(element) => ::core::fmt::Display::fmt(element, f), Self::AuthEmail(element) => ::core::fmt::Display::fmt(element, f), + Self::CommandTemplates(element) => ::core::fmt::Display::fmt(element, f), Self::Controller(element) => ::core::fmt::Display::fmt(element, f), - Self::DeleteSubjectTemplate(element) => { + Self::DeleteCommandTemplate(element) => { ::core::fmt::Display::fmt(element, f) } Self::DkimRegistryAddr(element) => ::core::fmt::Display::fmt(element, f), - Self::GetSubjectTemplate(element) => { + Self::GetCommandTemplate(element) => { ::core::fmt::Display::fmt(element, f) } Self::InitDKIMRegistry(element) => ::core::fmt::Display::fmt(element, f), Self::InitVerifier(element) => ::core::fmt::Display::fmt(element, f), Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), - Self::InsertSubjectTemplate(element) => { + Self::InsertCommandTemplate(element) => { ::core::fmt::Display::fmt(element, f) } Self::LastTimestamp(element) => ::core::fmt::Display::fmt(element, f), @@ -2727,15 +2728,14 @@ pub mod email_auth { Self::SetTimestampCheckEnabled(element) => { ::core::fmt::Display::fmt(element, f) } - Self::SubjectTemplates(element) => ::core::fmt::Display::fmt(element, f), Self::TimestampCheckEnabled(element) => { ::core::fmt::Display::fmt(element, f) } Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), - Self::UpdateDKIMRegistry(element) => { + Self::UpdateCommandTemplate(element) => { ::core::fmt::Display::fmt(element, f) } - Self::UpdateSubjectTemplate(element) => { + Self::UpdateDKIMRegistry(element) => { ::core::fmt::Display::fmt(element, f) } Self::UpdateVerifier(element) => ::core::fmt::Display::fmt(element, f), @@ -2760,14 +2760,19 @@ pub mod email_auth { Self::AuthEmail(value) } } + impl ::core::convert::From for EmailAuthCalls { + fn from(value: CommandTemplatesCall) -> Self { + Self::CommandTemplates(value) + } + } impl ::core::convert::From for EmailAuthCalls { fn from(value: ControllerCall) -> Self { Self::Controller(value) } } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: DeleteSubjectTemplateCall) -> Self { - Self::DeleteSubjectTemplate(value) + impl ::core::convert::From for EmailAuthCalls { + fn from(value: DeleteCommandTemplateCall) -> Self { + Self::DeleteCommandTemplate(value) } } impl ::core::convert::From for EmailAuthCalls { @@ -2775,9 +2780,9 @@ pub mod email_auth { Self::DkimRegistryAddr(value) } } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: GetSubjectTemplateCall) -> Self { - Self::GetSubjectTemplate(value) + impl ::core::convert::From for EmailAuthCalls { + fn from(value: GetCommandTemplateCall) -> Self { + Self::GetCommandTemplate(value) } } impl ::core::convert::From for EmailAuthCalls { @@ -2795,9 +2800,9 @@ pub mod email_auth { Self::Initialize(value) } } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: InsertSubjectTemplateCall) -> Self { - Self::InsertSubjectTemplate(value) + impl ::core::convert::From for EmailAuthCalls { + fn from(value: InsertCommandTemplateCall) -> Self { + Self::InsertCommandTemplate(value) } } impl ::core::convert::From for EmailAuthCalls { @@ -2825,11 +2830,6 @@ pub mod email_auth { Self::SetTimestampCheckEnabled(value) } } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: SubjectTemplatesCall) -> Self { - Self::SubjectTemplates(value) - } - } impl ::core::convert::From for EmailAuthCalls { fn from(value: TimestampCheckEnabledCall) -> Self { Self::TimestampCheckEnabled(value) @@ -2840,16 +2840,16 @@ pub mod email_auth { Self::TransferOwnership(value) } } + impl ::core::convert::From for EmailAuthCalls { + fn from(value: UpdateCommandTemplateCall) -> Self { + Self::UpdateCommandTemplate(value) + } + } impl ::core::convert::From for EmailAuthCalls { fn from(value: UpdateDKIMRegistryCall) -> Self { Self::UpdateDKIMRegistry(value) } } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: UpdateSubjectTemplateCall) -> Self { - Self::UpdateSubjectTemplate(value) - } - } impl ::core::convert::From for EmailAuthCalls { fn from(value: UpdateVerifierCall) -> Self { Self::UpdateVerifier(value) @@ -2894,7 +2894,7 @@ pub mod email_auth { Hash )] pub struct AccountSaltReturn(pub [u8; 32]); - ///Container type for all return fields from the `controller` function with signature `controller()` and selector `0xf77c4791` + ///Container type for all return fields from the `commandTemplates` function with signature `commandTemplates(uint256,uint256)` and selector `0x091c1650` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -2905,8 +2905,8 @@ pub mod email_auth { Eq, Hash )] - pub struct ControllerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `dkimRegistryAddr` function with signature `dkimRegistryAddr()` and selector `0x1bc01b83` + pub struct CommandTemplatesReturn(pub ::std::string::String); + ///Container type for all return fields from the `controller` function with signature `controller()` and selector `0xf77c4791` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -2917,8 +2917,8 @@ pub mod email_auth { Eq, Hash )] - pub struct DkimRegistryAddrReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `getSubjectTemplate` function with signature `getSubjectTemplate(uint256)` and selector `0x1e05a028` + pub struct ControllerReturn(pub ::ethers::core::types::Address); + ///Container type for all return fields from the `dkimRegistryAddr` function with signature `dkimRegistryAddr()` and selector `0x1bc01b83` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -2929,8 +2929,8 @@ pub mod email_auth { Eq, Hash )] - pub struct GetSubjectTemplateReturn(pub ::std::vec::Vec<::std::string::String>); - ///Container type for all return fields from the `lastTimestamp` function with signature `lastTimestamp()` and selector `0x19d8ac61` + pub struct DkimRegistryAddrReturn(pub ::ethers::core::types::Address); + ///Container type for all return fields from the `getCommandTemplate` function with signature `getCommandTemplate(uint256)` and selector `0x95e33c08` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -2941,8 +2941,8 @@ pub mod email_auth { Eq, Hash )] - pub struct LastTimestampReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` + pub struct GetCommandTemplateReturn(pub ::std::vec::Vec<::std::string::String>); + ///Container type for all return fields from the `lastTimestamp` function with signature `lastTimestamp()` and selector `0x19d8ac61` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -2953,8 +2953,8 @@ pub mod email_auth { Eq, Hash )] - pub struct OwnerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` + pub struct LastTimestampReturn(pub ::ethers::core::types::U256); + ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -2965,8 +2965,8 @@ pub mod email_auth { Eq, Hash )] - pub struct ProxiableUUIDReturn(pub [u8; 32]); - ///Container type for all return fields from the `subjectTemplates` function with signature `subjectTemplates(uint256,uint256)` and selector `0x4bd07760` + pub struct OwnerReturn(pub ::ethers::core::types::Address); + ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -2977,7 +2977,7 @@ pub mod email_auth { Eq, Hash )] - pub struct SubjectTemplatesReturn(pub ::std::string::String); + pub struct ProxiableUUIDReturn(pub [u8; 32]); ///Container type for all return fields from the `timestampCheckEnabled` function with signature `timestampCheckEnabled()` and selector `0x3e56f529` #[derive( Clone, @@ -3027,8 +3027,8 @@ pub mod email_auth { )] pub struct EmailAuthMsg { pub template_id: ::ethers::core::types::U256, - pub subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub skiped_subject_prefix: ::ethers::core::types::U256, + pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, + pub skiped_command_prefix: ::ethers::core::types::U256, pub proof: EmailProof, } ///`EmailProof(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)` @@ -3046,7 +3046,7 @@ pub mod email_auth { pub domain_name: ::std::string::String, pub public_key_hash: [u8; 32], pub timestamp: ::ethers::core::types::U256, - pub masked_subject: ::std::string::String, + pub masked_command: ::std::string::String, pub email_nullifier: [u8; 32], pub account_salt: [u8; 32], pub is_code_exist: bool, diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index 21f2ff70..080cf388 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -120,7 +120,7 @@ impl ChainClient { } } - pub async fn get_acceptance_subject_templates( + pub async fn get_acceptance_command_templates( &self, controller_eth_addr: &String, template_idx: u64, @@ -128,14 +128,14 @@ impl ChainClient { let controller_eth_addr: H160 = controller_eth_addr.parse()?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let templates = contract - .acceptance_subject_templates() + .acceptance_command_templates() .call() .await .map_err(|e| anyhow::Error::from(e))?; Ok(templates[template_idx as usize].clone()) } - pub async fn get_recovery_subject_templates( + pub async fn get_recovery_command_templates( &self, controller_eth_addr: &String, template_idx: u64, @@ -143,7 +143,7 @@ impl ChainClient { let controller_eth_addr: H160 = controller_eth_addr.parse()?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let templates = contract - .recovery_subject_templates() + .recovery_command_templates() .call() .await .map_err(|e| anyhow::Error::from(e))?; @@ -240,15 +240,15 @@ impl ChainClient { .await?) } - pub async fn get_recovered_account_from_acceptance_subject( + pub async fn get_recovered_account_from_acceptance_command( &self, controller_eth_addr: &String, - subject_params: Vec, + command_params: Vec, template_idx: u64, ) -> Result { let controller_eth_addr: H160 = controller_eth_addr.parse()?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - let subject_params_bytes = subject_params + let command_params_bytes = command_params .iter() // Change here: use iter() instead of map() directly on Vec .map(|s| { s.abi_encode(None) // Assuming decimal_size is not needed or can be None @@ -256,8 +256,8 @@ impl ChainClient { }) // Error handling .collect::>(); let recovered_account = contract - .extract_recovered_account_from_acceptance_subject( - subject_params_bytes, + .extract_recovered_account_from_acceptance_command( + command_params_bytes, template_idx.into(), ) .call() @@ -265,15 +265,15 @@ impl ChainClient { Ok(recovered_account) } - pub async fn get_recovered_account_from_recovery_subject( + pub async fn get_recovered_account_from_recovery_command( &self, controller_eth_addr: &String, - subject_params: Vec, + command_params: Vec, template_idx: u64, ) -> Result { let controller_eth_addr: H160 = controller_eth_addr.parse()?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - let subject_params_bytes = subject_params + let command_params_bytes = command_params .iter() // Change here: use iter() instead of map() directly on Vec .map(|s| { s.abi_encode(None) // Assuming decimal_size is not needed or can be None @@ -281,8 +281,8 @@ impl ChainClient { }) // Error handling .collect::>(); let recovered_account = contract - .extract_recovered_account_from_recovery_subject( - subject_params_bytes, + .extract_recovered_account_from_recovery_command( + command_params_bytes, template_idx.into(), ) .call() diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 10269361..893fa8ab 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -11,7 +11,7 @@ use ethers::{ use relayer_utils::{extract_substr_idxes, generate_email_circuit_input, EmailCircuitParams, LOG}; const DOMAIN_FIELDS: usize = 9; -const SUBJECT_FIELDS: usize = 20; +const COMMAND_FIELDS: usize = 20; const EMAIL_ADDR_FIELDS: usize = 9; pub async fn handle_email(email: String) -> Result { @@ -78,7 +78,7 @@ pub async fn handle_email(email: String) -> Result { } let command_template = CLIENT - .get_acceptance_subject_templates( + .get_acceptance_command_templates( &request.controller_eth_addr, request.template_idx, ) @@ -90,7 +90,7 @@ pub async fn handle_email(email: String) -> Result { Err(e) => { return Ok(EmailAuthEvent::Error { email_addr: guardian_email_addr, - error: format!("Invalid Subject, {}", e), + error: format!("Invalid Command, {}", e), }); } }; @@ -125,8 +125,8 @@ pub async fn handle_email(email: String) -> Result { info!(LOG, "Public signals: {:?}", public_signals); - let account_salt = u256_to_bytes32(&public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 3]); - let is_code_exist = public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); + let account_salt = u256_to_bytes32(&public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 3]); + let is_code_exist = public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; let email_proof = EmailProof { @@ -134,7 +134,7 @@ pub async fn handle_email(email: String) -> Result { domain_name: parsed_email.get_email_domain()?, public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_subject: masked_command, + masked_command: masked_command, email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), account_salt, is_code_exist, @@ -142,8 +142,8 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), - subject_params: command_params_encoded, - skiped_subject_prefix: 0.into(), + command_params: command_params_encoded, + skiped_command_prefix: 0.into(), proof: email_proof.clone(), }; @@ -225,7 +225,7 @@ pub async fn handle_email(email: String) -> Result { } else { if request.is_for_recovery { let command_template = CLIENT - .get_recovery_subject_templates(&request.controller_eth_addr, request.template_idx) + .get_recovery_command_templates(&request.controller_eth_addr, request.template_idx) .await?; let command_params = @@ -234,7 +234,7 @@ pub async fn handle_email(email: String) -> Result { Err(e) => { return Ok(EmailAuthEvent::Error { email_addr: guardian_email_addr, - error: format!("Invalid Subject, {}", e), + error: format!("Invalid Command, {}", e), }); } }; @@ -267,8 +267,8 @@ pub async fn handle_email(email: String) -> Result { let (proof, public_signals) = generate_proof(&circuit_input, "email_auth", PROVER_ADDRESS.get().unwrap()).await?; - let account_salt = u256_to_bytes32(&public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 3]); - let is_code_exist = public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); + let account_salt = u256_to_bytes32(&public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 3]); + let is_code_exist = public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; let email_proof = EmailProof { @@ -276,7 +276,7 @@ pub async fn handle_email(email: String) -> Result { domain_name: parsed_email.get_email_domain()?, public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_subject: masked_command, + masked_command: masked_command, email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), account_salt, is_code_exist, @@ -284,8 +284,8 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), - subject_params: command_params_encoded, - skiped_subject_prefix: 0.into(), + command_params: command_params_encoded, + skiped_command_prefix: 0.into(), proof: email_proof.clone(), }; @@ -356,9 +356,9 @@ pub async fn handle_email(email: String) -> Result { } pub fn get_masked_command(public_signals: Vec, start_idx: usize) -> Result { - // Gather signals from start_idx to start_idx + SUBJECT_FIELDS + // Gather signals from start_idx to start_idx + COMMAND_FIELDS let mut command_bytes = Vec::new(); - for i in start_idx..start_idx + SUBJECT_FIELDS { + for i in start_idx..start_idx + COMMAND_FIELDS { let signal = public_signals[i as usize]; if signal == U256::zero() { break; diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 7b2aa480..2812480f 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -35,13 +35,13 @@ pub struct AcceptanceRequest { pub guardian_email_addr: String, pub account_code: String, pub template_idx: u64, - pub subject: String, + pub command: String, } #[derive(Serialize, Deserialize)] pub struct AcceptanceResponse { pub request_id: u32, - pub subject_params: Vec, + pub command_params: Vec, } #[derive(Serialize, Deserialize)] @@ -49,13 +49,13 @@ pub struct RecoveryRequest { pub controller_eth_addr: String, pub guardian_email_addr: String, pub template_idx: u64, - pub subject: String, + pub command: String, } #[derive(Serialize, Deserialize)] pub struct RecoveryResponse { pub request_id: u32, - pub subject_params: Vec, + pub command_params: Vec, } #[derive(Serialize, Deserialize)] @@ -110,26 +110,26 @@ pub async fn request_status_api(payload: RequestStatusRequest) -> Result Response { - let subject_template = CLIENT - .get_acceptance_subject_templates(&payload.controller_eth_addr, payload.template_idx) + let command_template = CLIENT + .get_acceptance_command_templates(&payload.controller_eth_addr, payload.template_idx) .await .unwrap(); - let subject_params = extract_template_vals(&payload.subject, subject_template); + let command_params = extract_template_vals(&payload.command, command_template); - if subject_params.is_err() { + if command_params.is_err() { return Response::builder() .status(StatusCode::BAD_REQUEST) - .body(Body::from("Invalid subject")) + .body(Body::from("Invalid command")) .unwrap(); } - let subject_params = subject_params.unwrap(); + let command_params = command_params.unwrap(); let account_eth_addr = CLIENT - .get_recovered_account_from_acceptance_subject( + .get_recovered_account_from_acceptance_command( &payload.controller_eth_addr, - subject_params.clone(), + command_params.clone(), payload.template_idx, ) .await @@ -267,7 +267,7 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response Response Response Response Response { - let subject_template = CLIENT - .get_recovery_subject_templates(&payload.controller_eth_addr, payload.template_idx) + let command_template = CLIENT + .get_recovery_command_templates(&payload.controller_eth_addr, payload.template_idx) .await .unwrap(); - let subject_params = extract_template_vals(&payload.subject, subject_template); + let command_params = extract_template_vals(&payload.command, command_template); - if subject_params.is_err() { + if command_params.is_err() { return Response::builder() .status(StatusCode::BAD_REQUEST) - .body(Body::from("Invalid subject")) + .body(Body::from("Invalid command")) .unwrap(); } - let subject_params = subject_params.unwrap(); + let command_params = command_params.unwrap(); let account_eth_addr = CLIENT - .get_recovered_account_from_recovery_subject( + .get_recovered_account_from_recovery_command( &payload.controller_eth_addr, - subject_params.clone(), + command_params.clone(), payload.template_idx, ) .await @@ -445,7 +445,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response handle_email_event(EmailAuthEvent::GuardianNotRegistered { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), - subject: payload.subject.clone(), + subject: payload.command.clone(), request_id, }) .await @@ -456,7 +456,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response .body(Body::from( serde_json::to_string(&RecoveryResponse { request_id, - subject_params, + command_params, }) .unwrap(), )) @@ -486,7 +486,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), request_id, - command: payload.subject.clone(), + command: payload.command.clone(), }) .await .expect("Failed to send Recovery event"); @@ -521,7 +521,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response .body(Body::from( serde_json::to_string(&RecoveryResponse { request_id, - subject_params, + command_params, }) .unwrap(), )) From 16eaa8536e01ac5c154e2fee37c5a0661cecd34a Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Sun, 8 Sep 2024 01:09:52 +0900 Subject: [PATCH 040/121] Remove skipped_command_bytes --- packages/contracts/src/EmailAuth.sol | 8 +------ packages/contracts/test/Integration.t.sol | 2 -- .../contracts/test/helpers/StructHelper.sol | 1 - .../src/abis/email_account_recovery.rs | 21 ++++++++----------- packages/relayer/src/abis/email_auth.rs | 12 +++++------ packages/relayer/src/core.rs | 2 -- 6 files changed, 15 insertions(+), 31 deletions(-) diff --git a/packages/contracts/src/EmailAuth.sol b/packages/contracts/src/EmailAuth.sol index fd9b7e25..b1790d0d 100644 --- a/packages/contracts/src/EmailAuth.sol +++ b/packages/contracts/src/EmailAuth.sol @@ -15,8 +15,6 @@ struct EmailAuthMsg { uint templateId; /// @notice The parameters in the command of the email body, which should be taken according to the specified command template. bytes[] commandParams; - /// @notice The number of skiiped bytes in the command. - uint skipedCommandPrefix; /// @notice The email proof containing the zk proof and other necessary information for the email verification by the verifier contract. EmailProof proof; } @@ -227,12 +225,8 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { emailAuthMsg.commandParams, template ); - string memory trimmedMaskedCommand = removePrefix( - emailAuthMsg.proof.maskedCommand, - emailAuthMsg.skipedCommandPrefix - ); require( - Strings.equal(expectedCommand, trimmedMaskedCommand), + Strings.equal(expectedCommand, emailAuthMsg.proof.maskedCommand), "invalid command" ); require( diff --git a/packages/contracts/test/Integration.t.sol b/packages/contracts/test/Integration.t.sol index 18883f99..628022b3 100644 --- a/packages/contracts/test/Integration.t.sol +++ b/packages/contracts/test/Integration.t.sol @@ -231,7 +231,6 @@ contract IntegrationTest is Test { templateIdx ), commandParams: commandParamsForAcceptance, - skipedCommandPrefix: 0, proof: emailProof }); recoveryController.handleAcceptance(emailAuthMsg, templateIdx); @@ -312,7 +311,6 @@ contract IntegrationTest is Test { templateIdx ), commandParams: commandParamsForRecovery, - skipedCommandPrefix: 0, proof: emailProof }); recoveryController.handleRecovery(emailAuthMsg, templateIdx); diff --git a/packages/contracts/test/helpers/StructHelper.sol b/packages/contracts/test/helpers/StructHelper.sol index 7fcf4a45..a2f3963f 100644 --- a/packages/contracts/test/helpers/StructHelper.sol +++ b/packages/contracts/test/helpers/StructHelper.sol @@ -28,7 +28,6 @@ contract StructHelper is DeploymentHelper { emailAuthMsg = EmailAuthMsg({ templateId: templateId, commandParams: commandParams, - skipedCommandPrefix: 0, proof: emailProof }); diff --git a/packages/relayer/src/abis/email_account_recovery.rs b/packages/relayer/src/abis/email_account_recovery.rs index 7f5d0286..b49c5af1 100644 --- a/packages/relayer/src/abis/email_account_recovery.rs +++ b/packages/relayer/src/abis/email_account_recovery.rs @@ -369,7 +369,6 @@ pub mod email_account_recovery { ::ethers::core::abi::ethabi::ParamType::Bytes, ), ), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Tuple( ::std::vec![ ::ethers::core::abi::ethabi::ParamType::String, @@ -420,7 +419,6 @@ pub mod email_account_recovery { ::ethers::core::abi::ethabi::ParamType::Bytes, ), ), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Tuple( ::std::vec![ ::ethers::core::abi::ethabi::ParamType::String, @@ -747,24 +745,24 @@ pub mod email_account_recovery { .method_hash([165, 227, 238, 112], (command_params, template_idx)) .expect("method not found (this should never happen)") } - ///Calls the contract's `handleAcceptance` (0x0481af67) function + ///Calls the contract's `handleAcceptance` (0xd686b48a) function pub fn handle_acceptance( &self, email_auth_msg: EmailAuthMsg, template_idx: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([4, 129, 175, 103], (email_auth_msg, template_idx)) + .method_hash([214, 134, 180, 138], (email_auth_msg, template_idx)) .expect("method not found (this should never happen)") } - ///Calls the contract's `handleRecovery` (0xb68126fa) function + ///Calls the contract's `handleRecovery` (0xb684742f) function pub fn handle_recovery( &self, email_auth_msg: EmailAuthMsg, template_idx: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([182, 129, 38, 250], (email_auth_msg, template_idx)) + .method_hash([182, 132, 116, 47], (email_auth_msg, template_idx)) .expect("method not found (this should never happen)") } ///Calls the contract's `isActivated` (0xc9faa7c5) function @@ -1001,7 +999,7 @@ pub mod email_account_recovery { pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, pub template_idx: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `handleAcceptance` function with signature `handleAcceptance((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0x0481af67` + ///Container type for all input parameters for the `handleAcceptance` function with signature `handleAcceptance((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0xd686b48a` #[derive( Clone, ::ethers::contract::EthCall, @@ -1014,13 +1012,13 @@ pub mod email_account_recovery { )] #[ethcall( name = "handleAcceptance", - abi = "handleAcceptance((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)" + abi = "handleAcceptance((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)" )] pub struct HandleAcceptanceCall { pub email_auth_msg: EmailAuthMsg, pub template_idx: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `handleRecovery` function with signature `handleRecovery((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0xb68126fa` + ///Container type for all input parameters for the `handleRecovery` function with signature `handleRecovery((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0xb684742f` #[derive( Clone, ::ethers::contract::EthCall, @@ -1033,7 +1031,7 @@ pub mod email_account_recovery { )] #[ethcall( name = "handleRecovery", - abi = "handleRecovery((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)" + abi = "handleRecovery((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)" )] pub struct HandleRecoveryCall { pub email_auth_msg: EmailAuthMsg, @@ -1617,7 +1615,7 @@ pub mod email_account_recovery { Hash )] pub struct VerifierAddrReturn(pub ::ethers::core::types::Address); - ///`EmailAuthMsg(uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` + ///`EmailAuthMsg(uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1631,7 +1629,6 @@ pub mod email_account_recovery { pub struct EmailAuthMsg { pub template_id: ::ethers::core::types::U256, pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub skiped_command_prefix: ::ethers::core::types::U256, pub proof: EmailProof, } ///`EmailProof(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)` diff --git a/packages/relayer/src/abis/email_auth.rs b/packages/relayer/src/abis/email_auth.rs index ab5ae1cc..7db65267 100644 --- a/packages/relayer/src/abis/email_auth.rs +++ b/packages/relayer/src/abis/email_auth.rs @@ -77,7 +77,6 @@ pub mod email_auth { ::ethers::core::abi::ethabi::ParamType::Bytes, ), ), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Tuple( ::std::vec![ ::ethers::core::abi::ethabi::ParamType::String, @@ -1057,13 +1056,13 @@ pub mod email_auth { .method_hash([108, 116, 146, 30], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `authEmail` (0xad3f5f9b) function + ///Calls the contract's `authEmail` (0xce207018) function pub fn auth_email( &self, email_auth_msg: EmailAuthMsg, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([173, 63, 95, 155], (email_auth_msg,)) + .method_hash([206, 32, 112, 24], (email_auth_msg,)) .expect("method not found (this should never happen)") } ///Calls the contract's `commandTemplates` (0x091c1650) function @@ -2115,7 +2114,7 @@ pub mod email_auth { )] #[ethcall(name = "accountSalt", abi = "accountSalt()")] pub struct AccountSaltCall; - ///Container type for all input parameters for the `authEmail` function with signature `authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))` and selector `0xad3f5f9b` + ///Container type for all input parameters for the `authEmail` function with signature `authEmail((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))` and selector `0xce207018` #[derive( Clone, ::ethers::contract::EthCall, @@ -2128,7 +2127,7 @@ pub mod email_auth { )] #[ethcall( name = "authEmail", - abi = "authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))" + abi = "authEmail((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))" )] pub struct AuthEmailCall { pub email_auth_msg: EmailAuthMsg, @@ -3014,7 +3013,7 @@ pub mod email_auth { Hash )] pub struct VerifierAddrReturn(pub ::ethers::core::types::Address); - ///`EmailAuthMsg(uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` + ///`EmailAuthMsg(uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3028,7 +3027,6 @@ pub mod email_auth { pub struct EmailAuthMsg { pub template_id: ::ethers::core::types::U256, pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub skiped_command_prefix: ::ethers::core::types::U256, pub proof: EmailProof, } ///`EmailProof(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)` diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 893fa8ab..cba3c4ee 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -143,7 +143,6 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), command_params: command_params_encoded, - skiped_command_prefix: 0.into(), proof: email_proof.clone(), }; @@ -285,7 +284,6 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), command_params: command_params_encoded, - skiped_command_prefix: 0.into(), proof: email_proof.clone(), }; From f6433a130f45b8ba7fa37926a8385e0f8010ee24 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Tue, 10 Sep 2024 15:41:44 +0900 Subject: [PATCH 041/121] Merge audit-fix into body-parsing --- packages/circuits/README.md | 2 + packages/circuits/package.json | 10 +- .../circuits/src/email_auth_template.circom | 31 +- .../src/regexes/invitation_code_regex.circom | 16 +- .../invitation_code_with_prefix_regex.circom | 23 +- packages/circuits/src/utils/digit2int.circom | 7 + packages/circuits/src/utils/hash_sign.circom | 2 +- packages/circuits/tests/email_auth.test.ts | 130 +++- .../circuits/tests/recipient_enabled.test.ts | 67 +- packages/contracts/README.md | 2 +- packages/contracts/foundry.toml | 6 +- packages/contracts/package.json | 2 +- packages/contracts/src/EmailAuth.sol | 50 +- .../contracts/src/libraries/CommandUtils.sol | 33 +- .../contracts/src/utils/Groth16Verifier.sol | 680 ++++++++++++------ packages/contracts/src/utils/Verifier.sol | 14 +- .../contracts/test/EmailAccountRecovery.t.sol | 2 +- packages/contracts/test/EmailAuth.t.sol | 42 ++ packages/prover/modal_server.py | 3 +- yarn.lock | 34 +- 20 files changed, 794 insertions(+), 362 deletions(-) diff --git a/packages/circuits/README.md b/packages/circuits/README.md index 934b2d79..74f58d13 100644 --- a/packages/circuits/README.md +++ b/packages/circuits/README.md @@ -61,3 +61,5 @@ The `email_auth.circom` makes constraints and computes the public output as foll 13. If `is_code_exist` is 1, assert that `embedded_code` is equal to `account_code`. 14. Let `account_salt` be `PoseidonHash(from_addr|0..0, account_code, 0)`. 15. Let `masked_subject` be a string that removes `code_str`, the prefix of the invitation code, and one email address from `subject`, if they appear in `subject`. + +Note that the email address in the subject is assumbed not to overlap with the invitation code. \ No newline at end of file diff --git a/packages/circuits/package.json b/packages/circuits/package.json index 964439a1..a563ac3c 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -11,11 +11,11 @@ "test": "NODE_OPTIONS=--max_old_space_size=8192 jest" }, "dependencies": { - "@zk-email/circuits": "^6.1.5", - "@zk-email/zk-regex-circom": "^2.1.0", - "@zk-email/relayer-utils": "^0.3.7", + "@zk-email/circuits": "=6.1.5", + "@zk-email/relayer-utils": "=0.3.7", + "@zk-email/zk-regex-circom": "=2.1.1", "commander": "^11.0.0", - "snarkjs": "^0.7.0" + "snarkjs": "^0.7.4" }, "devDependencies": { "@babel/preset-env": "^7.22.20", @@ -42,4 +42,4 @@ ] ] } -} +} \ No newline at end of file diff --git a/packages/circuits/src/email_auth_template.circom b/packages/circuits/src/email_auth_template.circom index 547e30df..1df21428 100644 --- a/packages/circuits/src/email_auth_template.circom +++ b/packages/circuits/src/email_auth_template.circom @@ -5,7 +5,7 @@ include "circomlib/circuits/comparators.circom"; include "circomlib/circuits/poseidon.circom"; include "@zk-email/circuits/email-verifier.circom"; include "@zk-email/circuits/utils/regex.circom"; -include "@zk-email/circuits/utils/array.circom"; +include "@zk-email/circuits/utils/functions.circom"; include "./utils/constants.circom"; include "./utils/account_salt.circom"; include "./utils/hash_sign.circom"; @@ -75,6 +75,8 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) signal from_regex_out, from_regex_reveal[max_header_bytes]; (from_regex_out, from_regex_reveal) <== FromAddrRegex(max_header_bytes)(padded_header); from_regex_out === 1; + signal is_valid_from_addr_idx <== LessThan(log2Ceil(max_header_bytes))([from_addr_idx, max_header_bytes]); + is_valid_from_addr_idx === 1; signal from_email_addr[email_max_bytes]; from_email_addr <== SelectRegexReveal(max_header_bytes, email_max_bytes)(from_regex_reveal, from_addr_idx); @@ -82,10 +84,13 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) signal domain_regex_out, domain_regex_reveal[email_max_bytes]; (domain_regex_out, domain_regex_reveal) <== EmailDomainRegex(email_max_bytes)(from_email_addr); domain_regex_out === 1; + signal is_valid_domain_idx <== LessThan(log2Ceil(email_max_bytes))([domain_idx, email_max_bytes]); + is_valid_domain_idx === 1; signal domain_name_bytes[domain_len]; domain_name_bytes <== SelectRegexReveal(email_max_bytes, domain_len)(domain_regex_reveal, domain_idx); domain_name <== Bytes2Ints(domain_len)(domain_name_bytes); + /// EMAIL NULLIFIER signal sign_hash; signal sign_ints[k2_chunked_size]; (sign_hash, sign_ints) <== HashSign(n,k)(signature); @@ -96,28 +101,35 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) signal subject_regex_out, subject_regex_reveal[max_header_bytes]; (subject_regex_out, subject_regex_reveal) <== SubjectAllRegex(max_header_bytes)(padded_header); subject_regex_out === 1; + signal is_valid_subject_idx <== LessThan(log2Ceil(max_header_bytes))([subject_idx, max_header_bytes]); + is_valid_subject_idx === 1; signal subject_all[max_subject_bytes]; subject_all <== SelectRegexReveal(max_header_bytes, max_subject_bytes)(subject_regex_reveal, subject_idx); // Timestamp regex + convert to decimal format signal timestamp_regex_out, timestamp_regex_reveal[max_header_bytes]; (timestamp_regex_out, timestamp_regex_reveal) <== TimestampRegex(max_header_bytes)(padded_header); - // timestamp_regex_out === 1; + signal is_valid_timestamp_idx <== LessThan(log2Ceil(max_header_bytes))([timestamp_idx, max_header_bytes]); + is_valid_timestamp_idx === 1; signal timestamp_str[timestamp_len]; timestamp_str <== SelectRegexReveal(max_header_bytes, timestamp_len)(timestamp_regex_reveal, timestamp_idx); signal raw_timestamp <== Digit2Int(timestamp_len)(timestamp_str); timestamp <== timestamp_regex_out * raw_timestamp; + /// MASKED SUBJECT + /// INVITATION CODE WITH PREFIX REGEX signal prefixed_code_regex_out, prefixed_code_regex_reveal[max_subject_bytes]; (prefixed_code_regex_out, prefixed_code_regex_reveal) <== InvitationCodeWithPrefixRegex(max_subject_bytes)(subject_all); - is_code_exist <== IsZero()(prefixed_code_regex_out-1); + is_code_exist <== prefixed_code_regex_out; signal removed_code[max_subject_bytes]; for(var i = 0; i < max_subject_bytes; i++) { removed_code[i] <== is_code_exist * prefixed_code_regex_reveal[i]; } + /// EMAIL ADDRESS REGEX + /// Note: the email address in the subject should not overlap with the invitation code signal subject_email_addr_regex_out, subject_email_addr_regex_reveal[max_subject_bytes]; (subject_email_addr_regex_out, subject_email_addr_regex_reveal) <== EmailAddrRegex(max_subject_bytes)(subject_all); - signal is_subject_email_addr_exist <== IsZero()(subject_email_addr_regex_out-1); + signal is_subject_email_addr_exist <== subject_email_addr_regex_out; signal removed_subject_email_addr[max_subject_bytes]; for(var i = 0; i < max_subject_bytes; i++) { removed_subject_email_addr[i] <== is_subject_email_addr_exist * subject_email_addr_regex_reveal[i]; @@ -131,8 +143,7 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) // INVITATION CODE REGEX signal code_regex_out, code_regex_reveal[max_header_bytes]; (code_regex_out, code_regex_reveal) <== InvitationCodeRegex(max_header_bytes)(padded_header); - signal code_consistency <== IsZero()(is_code_exist * (1 - code_regex_out)); - code_consistency === 1; + is_code_exist * (1 - code_regex_out) === 0; signal replaced_code_regex_reveal[max_header_bytes]; for(var i=0; i { ); expect(0n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 ] ); }); @@ -144,7 +144,7 @@ describe("Email Auth", () => { ); expect(0n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 ] ); }); @@ -208,7 +208,7 @@ describe("Email Auth", () => { ); expect(0n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 ] ); }); @@ -272,7 +272,7 @@ describe("Email Auth", () => { ); expect(0n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 ] ); }); @@ -337,7 +337,7 @@ describe("Email Auth", () => { ); expect(1n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 ] ); }); @@ -402,35 +402,119 @@ describe("Email Auth", () => { ); expect(1n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 ] ); }); it("Verify a sent email whose subject tries to forge the From field", async () => { - const emailFilePath = path.join( - __dirname, - "./emails/email_auth_test7.eml" - ); + const emailFilePath = path.join(__dirname, "./emails/email_auth_test7.eml"); const accountCode = "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; - const { - body_hash_idx, - precomputed_sha, - padded_body, - padded_body_len, - command_idx, - padded_cleaned_body, - ...circuitInputsRelevant - } = await genEmailCircuitInput(emailFilePath, accountCode, { + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { maxHeaderLength: 1024, ignoreBodyHashCheck: true, }); - circuitInputsRelevant.from_addr_idx = circuitInputsRelevant.subject_idx; + circuitInputs.from_addr_idx = circuitInputs.subject_idx; async function failFn() { - const witness = await circuit.calculateWitness( - circuitInputsRelevant - ); + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + } + await expect(failFn).rejects.toThrow(); + }); + + + it("Verify a sent email with a too large from_addr_idx", async () => { + const emailFilePath = path.join(__dirname, "./emails/email_auth_test1.eml"); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + circuitInputs.from_addr_idx = 1024; + async function failFn() { + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + } + await expect(failFn).rejects.toThrow(); + }); + + it("Verify a sent email with a too large domain_idx", async () => { + const emailFilePath = path.join(__dirname, "./emails/email_auth_test1.eml"); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + circuitInputs.domain_idx = 256; + async function failFn() { + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + } + await expect(failFn).rejects.toThrow(); + }); + + it("Verify a sent email with a too large subject_idx", async () => { + const emailFilePath = path.join(__dirname, "./emails/email_auth_test1.eml"); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + circuitInputs.subject_idx = 1024; + async function failFn() { + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + } + await expect(failFn).rejects.toThrow(); + }); + + it("Verify a sent email with a too large timestamp_idx", async () => { + const emailFilePath = path.join(__dirname, "./emails/email_auth_test1.eml"); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + circuitInputs.timestamp_idx = 1024; + async function failFn() { + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + } + await expect(failFn).rejects.toThrow(); + }); + + it("Verify a sent email with a too large code_idx", async () => { + const emailFilePath = path.join(__dirname, "./emails/email_auth_test1.eml"); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + circuitInputs.code_idx = 1024; + async function failFn() { + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + } + await expect(failFn).rejects.toThrow(); + }); + + it("Verify a sent email with a too large code_idx 2", async () => { + const emailFilePath = path.join(__dirname, "./emails/email_auth_test1.eml"); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const circuitInputs = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + circuitInputs.code_idx = 1024 * 4; + async function failFn() { + const witness = await circuit.calculateWitness(circuitInputs); await circuit.checkConstraints(witness); } await expect(failFn).rejects.toThrow(); diff --git a/packages/circuits/tests/recipient_enabled.test.ts b/packages/circuits/tests/recipient_enabled.test.ts index c168d3b6..bfefeb27 100644 --- a/packages/circuits/tests/recipient_enabled.test.ts +++ b/packages/circuits/tests/recipient_enabled.test.ts @@ -83,12 +83,12 @@ describe("Email Auth", () => { ); expect(0n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 ] ); expect(1n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 ] ); const recipientEmailAddr = "alice@gmail.com"; @@ -98,7 +98,7 @@ describe("Email Auth", () => { ); expect(BigInt(emailAddrCommit)).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 ] ); }); @@ -167,12 +167,12 @@ describe("Email Auth", () => { ); expect(0n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 ] ); expect(1n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 ] ); const recipientEmailAddr = "bob@example.com"; @@ -182,7 +182,7 @@ describe("Email Auth", () => { ); expect(BigInt(emailAddrCommit)).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 ] ); }); @@ -251,12 +251,12 @@ describe("Email Auth", () => { ); expect(0n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 ] ); expect(1n).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 ] ); const recipientEmailAddr = "bob@example.com"; @@ -266,16 +266,13 @@ describe("Email Auth", () => { ); expect(BigInt(emailAddrCommit)).toEqual( witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 + 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 ] ); }); it("Verify a sent email whose subject has an invitation code", async () => { - const emailFilePath = path.join( - __dirname, - "./emails/email_auth_test5.eml" - ); + const emailFilePath = path.join(__dirname, "./emails/email_auth_test5.eml"); const emailRaw = readFileSync(emailFilePath, "utf8"); const parsedEmail = await relayerUtils.parseEmail(emailRaw); console.log(parsedEmail.canonicalizedHeader); @@ -322,8 +319,7 @@ describe("Email Auth", () => { expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); const maskedSubject = "Send 0.12 ETH to "; const paddedMaskedSubject = relayerUtils.padString(maskedSubject, 605); - const maskedSubjectFields = - relayerUtils.bytes2Fields(paddedMaskedSubject); + const maskedSubjectFields = relayerUtils.bytes2Fields(paddedMaskedSubject); for (let idx = 0; idx < maskedSubjectFields.length; ++idx) { expect(BigInt(maskedSubjectFields[idx])).toEqual( witness[1 + domainFields.length + 3 + idx] @@ -335,14 +331,10 @@ describe("Email Auth", () => { witness[1 + domainFields.length + 3 + maskedSubjectFields.length] ); expect(1n).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 1 - ] + witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 1] ); expect(1n).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 2 - ] + witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 2] ); const recipientEmailAddr = "alice@gmail.com"; const emailAddrCommit = relayerUtils.emailAddrCommitWithSignature( @@ -350,9 +342,36 @@ describe("Email Auth", () => { parsedEmail.signature ); expect(BigInt(emailAddrCommit)).toEqual( - witness[ - 1 + domainFields.length + 3 + maskedSubjectFields.length + 3 - ] + witness[1 + domainFields.length + 3 + maskedSubjectFields.length + 3] ); }); + + it("Verify a sent email with a too large subject_email_addr_idx", async () => { + const emailFilePath = path.join(__dirname, "./emails/email_auth_test1.eml"); + const accountCode = + "0x01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76"; + const { + body_hash_idx, + precomputed_sha, + padded_body, + padded_body_len, + command_idx, + padded_cleaned_body, + ...emailAuthInput + } = await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + const recipientInput = await genRecipientInput(emailFilePath); + const circuitInputs = { + ...emailAuthInput, + subject_email_addr_idx: recipientInput.subject_email_addr_idx, + }; + circuitInputs.subject_email_addr_idx = 605; + async function failFn() { + const witness = await circuit.calculateWitness(circuitInputs); + await circuit.checkConstraints(witness); + } + await expect(failFn).rejects.toThrow(); + }); }); diff --git a/packages/contracts/README.md b/packages/contracts/README.md index ddf54f2e..75ca880f 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -25,7 +25,7 @@ $ yarn test Run integration tests Before running integration tests, you need to make a `packages/contracts/test/build_integration` directory, download the zip file from the following link, and place its unzipped directory under that directory. -https://drive.google.com/file/d/1TChinAnHr9eV8H_OV9SVReF8Rvu6h1XH/view?usp=sharing +https://drive.google.com/file/d/1Ybtxe1TCVUtHzCPUs9cuZAGbM-MVwigE/view?usp=drive_link Then, move `email_auth.zkey` and `email_auth.wasm` in the unzipped directory `params` to `build_integration`. diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index 5c546414..bf78c037 100644 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -22,7 +22,7 @@ build_info = true extra_output = ["storageLayout"] # For missing libraries, please comment out this if you use foundry-zksync -#libraries = ["{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:0x91cc0f0a227b8dd56794f9391e8af48b40420a0b", "{PROJECT_DIR}/packages/contracts/src/libraries/SubjectUtils.sol:SubjectUtils:0x981e3df952358a57753c7b85de7949da4abcf54a"] +#libraries = ["{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:0x91cc0f0a227b8dd56794f9391e8af48b40420a0b", "{PROJECT_DIR}/packages/contracts/src/libraries/CommandUtils.sol:CommandUtils:0x981e3df952358a57753c7b85de7949da4abcf54a"] [rpc_endpoints] localhost = "${LOCALHOST_RPC_URL}" @@ -33,11 +33,11 @@ mainnet = "${MAINNET_RPC_URL}" sepolia = { key = "${ETHERSCAN_API_KEY}" } mainnet = { key = "${ETHERSCAN_API_KEY}" } -[profile.default.zksync] +[profile.default.zksync] src = 'src' libs = ["node_modules", "lib"] fallback_oz = true is_system = true mode = "3" -zksolc = "1.5.0" \ No newline at end of file +zksolc = "1.5.0" diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 0f53be8e..2234fd85 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -12,7 +12,7 @@ "dependencies": { "@openzeppelin/contracts": "^5.0.0", "@openzeppelin/contracts-upgradeable": "^5.0.0", - "@zk-email/contracts": "^6.1.2", + "@zk-email/contracts": "^6.1.5", "@matterlabs/zksync-contracts": "^0.6.1", "solady": "^0.0.123" }, diff --git a/packages/contracts/src/EmailAuth.sol b/packages/contracts/src/EmailAuth.sol index b1790d0d..d7cb5120 100644 --- a/packages/contracts/src/EmailAuth.sol +++ b/packages/contracts/src/EmailAuth.sol @@ -219,23 +219,39 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { emailAuthMsg.proof.timestamp > lastTimestamp, "invalid timestamp" ); - - // Construct an expectedCommand from template and the values of emailAuthMsg.commandParams. - string memory expectedCommand = CommandUtils.computeExpectedCommand( - emailAuthMsg.commandParams, - template - ); require( - Strings.equal(expectedCommand, emailAuthMsg.proof.maskedCommand), - "invalid command" + bytes(emailAuthMsg.proof.maskedCommand).length <= + verifier.COMMAND_BYTES(), + "invalid masked command length" ); + + // Construct an expectedCommand from template and the values of emailAuthMsg.commandParams. + string memory expectedCommand = ""; + for (uint stringCase = 0; stringCase < 3; stringCase++) { + expectedCommand = CommandUtils.computeExpectedCommand( + emailAuthMsg.commandParams, + template, + stringCase + ); + if ( + Strings.equal(expectedCommand, emailAuthMsg.proof.maskedCommand) + ) { + break; + } + if (stringCase == 2) { + revert("invalid command"); + } + } + require( verifier.verifyEmailProof(emailAuthMsg.proof) == true, "invalid email proof" ); usedNullifiers[emailAuthMsg.proof.emailNullifier] = true; - lastTimestamp = emailAuthMsg.proof.timestamp; + if (timestampCheckEnabled && emailAuthMsg.proof.timestamp != 0) { + lastTimestamp = emailAuthMsg.proof.timestamp; + } emit EmailAuthed( emailAuthMsg.proof.emailNullifier, emailAuthMsg.proof.accountSalt, @@ -257,20 +273,4 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { function _authorizeUpgrade( address newImplementation ) internal override onlyOwner {} - - function removePrefix( - string memory str, - uint numChars - ) private pure returns (string memory) { - require(numChars <= bytes(str).length, "Invalid number of characters"); - - bytes memory strBytes = bytes(str); - bytes memory result = new bytes(strBytes.length - numChars); - - for (uint i = numChars; i < strBytes.length; i++) { - result[i - numChars] = strBytes[i]; - } - - return string(result); - } } diff --git a/packages/contracts/src/libraries/CommandUtils.sol b/packages/contracts/src/libraries/CommandUtils.sol index fb87531e..71fba9d9 100644 --- a/packages/contracts/src/libraries/CommandUtils.sol +++ b/packages/contracts/src/libraries/CommandUtils.sol @@ -15,6 +15,21 @@ library CommandUtils { string public constant DECIMALS_MATCHER = "{decimals}"; string public constant ETH_ADDR_MATCHER = "{ethAddr}"; + function addressToHexString( + address addr, + uint stringCase + ) internal pure returns (string memory) { + if (stringCase == 0) { + return addressToChecksumHexString(addr); + } else if (stringCase == 1) { + return Strings.toHexString(addr); + } else if (stringCase == 2) { + return lowerToUpperCase(Strings.toHexString(addr)); + } else { + revert("invalid stringCase"); + } + } + function addressToChecksumHexString( address addr ) internal pure returns (string memory) { @@ -58,6 +73,18 @@ library CommandUtils { return string(result); } + function lowerToUpperCase( + string memory hexStr + ) internal pure returns (string memory) { + bytes memory bytesStr = bytes(hexStr); + for (uint i = 0; i < bytesStr.length; i++) { + if (bytesStr[i] >= 0x61 && bytesStr[i] <= 0x66) { + bytesStr[i] = bytes1(uint8(bytesStr[i]) - 32); + } + } + return string(bytesStr); + } + /// @notice Convert bytes to hex string without 0x prefix /// @param data bytes to convert function bytesToHexString( @@ -78,9 +105,11 @@ library CommandUtils { /// @notice Calculate the expected command. /// @param commandParams Params to be used in the command /// @param template Template to be used for the command + /// @param stringCase Case of the ethereum address string to be used for the command - 0: checksum, 1: lowercase, 2: uppercase function computeExpectedCommand( bytes[] memory commandParams, - string[] memory template + string[] memory template, + uint stringCase ) public pure returns (string memory expectedCommand) { // Construct an expectedCommand from template and the values of commandParams. uint8 nextParamIndex = 0; @@ -117,7 +146,7 @@ library CommandUtils { commandParams[nextParamIndex], (address) ); - stringParam = addressToChecksumHexString(param); + stringParam = addressToHexString(param, stringCase); } else { isParamExist = false; stringParam = template[i]; diff --git a/packages/contracts/src/utils/Groth16Verifier.sol b/packages/contracts/src/utils/Groth16Verifier.sol index 84d3ced7..990bf1ac 100644 --- a/packages/contracts/src/utils/Groth16Verifier.sol +++ b/packages/contracts/src/utils/Groth16Verifier.sol @@ -22,140 +22,229 @@ pragma solidity >=0.7.0 <0.9.0; contract Groth16Verifier { // Scalar field size - uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + uint256 constant r = + 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Base field size - uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + uint256 constant q = + 21888242871839275222246405745257275088696311157297823662689037894645226208583; // Verification Key data - uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042; - uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958; - uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132; - uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731; - uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679; - uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856; - uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 520994677997493400810773541476499788644902082984396453075685762761831850120; - uint256 constant deltax2 = 10213897956116323293360574495863850733565743032313310303301962890191828600579; - uint256 constant deltay1 = 7932164237875706492467150825847531456461165832347520966415283522471937964900; - uint256 constant deltay2 = 13933167949481980812622491915190180689983098052228504440538951968850456401091; - - - uint256 constant IC0x = 5535234085311902579901349478459196637795058221120958134445592343488246156733; - uint256 constant IC0y = 5306640240432430234979242614873688760288740315547161616274789884917660992367; - - uint256 constant IC1x = 10707387490009252629078273089029959904307706408726467155680696001386854048915; - uint256 constant IC1y = 17653533518649258839749460334216534095963029303372459441511113120126665109653; - - uint256 constant IC2x = 20865571486499188594003814476515099918525806346210086833881258772408663191533; - uint256 constant IC2y = 7888240421702647837386220931474009495401756148617371230939296514314837098271; - - uint256 constant IC3x = 1912978194609077207430131695891867170745002253126750956906023142956794841865; - uint256 constant IC3y = 17615941814906629303790964184866269246906472609406726939478790210268313990051; - - uint256 constant IC4x = 15066418251539359853074143581365946179824576559935306245174822608350324474776; - uint256 constant IC4y = 3268372113574542796802111569975146953310662150883456386537997506424333670939; - - uint256 constant IC5x = 16726903819494555062907147643613770035747444680904544904305313872617709937814; - uint256 constant IC5y = 17101225626470597533777593163737774333478931604126018373298094394038436070638; - - uint256 constant IC6x = 20641928936490067347238549514729636898746687294162031430805590421560903783440; - uint256 constant IC6y = 67121451455228913817899520547955848577485738949760740559721896890970176103; - - uint256 constant IC7x = 14545357897180104829942737321629647336974601349904876305377785895976088498628; - uint256 constant IC7y = 16314295394308016823245804523460668622871621620058982289202172672703214642909; - - uint256 constant IC8x = 21739153088746313904366793933727782582174946747904879487285317254557443015329; - uint256 constant IC8y = 3132175803297520185172383705548796916566539464602625887509031362173771022843; - - uint256 constant IC9x = 20333233803298528081912583132659619517672056679176472634300802350468027326361; - uint256 constant IC9y = 6238837794343377502421946404928002513039151091738403488064287245988205748593; - - uint256 constant IC10x = 16418874123357333544592669082833232850459535832174384729993255430764462500486; - uint256 constant IC10y = 21771971202968985066744191573424980335377073332855742387685123535002522571529; - - uint256 constant IC11x = 19451975215864606845692411747435064359921385769371233821650301822958164252383; - uint256 constant IC11y = 20892514595722901078388943250566322962503399436888984708776669059327181439790; - - uint256 constant IC12x = 7890932830092388862341624941690789312256479754725115142819338325966740669428; - uint256 constant IC12y = 4418832493543398820840947134519317894746836913806654901909239755962388809991; - - uint256 constant IC13x = 8199473712814016100135467002253188985688335051507321176911775440880532334952; - uint256 constant IC13y = 15997818842062211202600134971063758566999644777722172606469491329666812258276; - - uint256 constant IC14x = 12137522381148387733238329761055359894311504591070198713455315089652636842402; - uint256 constant IC14y = 21339188004338495042416918774038965889032101950904198621697204175535425843091; - - uint256 constant IC15x = 20499263784776697905943622542054972660913496529317877469532325036659142860841; - uint256 constant IC15y = 11428736355199483131940447330380125032711949052439215155046658645463458617674; - - uint256 constant IC16x = 5754299204496299424940297228286983528858894010778459654161035126221861884425; - uint256 constant IC16y = 184143361306450555375946116665530361251584344793605929804900169497536069657; - - uint256 constant IC17x = 6863685095405518858940222663610976520118803865048723755871419028593531099958; - uint256 constant IC17y = 18102099448859799403953336894017457656590279241400870825068223761138751757204; - - uint256 constant IC18x = 11617180898926442769507234462139371394680677212983320064407531026440672878535; - uint256 constant IC18y = 4231987035195694511291113860396316866846277265956849978459149363401736899419; - - uint256 constant IC19x = 6338405922510297847509581085618085787266710988385331069423772530751893351108; - uint256 constant IC19y = 2369188132617549234166848605509335807620667833570812871717711881712251941471; - - uint256 constant IC20x = 6534724304493884898998457959752744402731711456639277994605971968266824841921; - uint256 constant IC20y = 3616930696544290755224333216672259977980824937811778199173736509869170686624; - - uint256 constant IC21x = 18296109485859597664201013922077450611537275721380521453297622562810889903055; - uint256 constant IC21y = 3895545879384074505865915948837152152498358964611960941429309095904181030693; - - uint256 constant IC22x = 12343813894528681582898501974195928908758133920463632788058140152731464749914; - uint256 constant IC22y = 21505758529614139837798769683411075306857597005036383220173003789253857347751; - - uint256 constant IC23x = 16230461810715823239242025482008567032302510218301798998030587563164759203923; - uint256 constant IC23y = 1994949152609869198152052650904921912838643069265165983919780834335733459441; - - uint256 constant IC24x = 373995982353912590050571385234870501485812926774804412495284185340492728591; - uint256 constant IC24y = 4424414072575513799911234230042788376840811362954861538886070866583770853757; - - uint256 constant IC25x = 73053181031153871276946499443822334078747902352960726679539712950424139587; - uint256 constant IC25y = 1540570167066699022838327597833448980761202822749917678465275227142577692420; - - uint256 constant IC26x = 19743666564083954842724375605301868007217803605683850153936265256536005058028; - uint256 constant IC26y = 17989815625617579036436769970865806048561975460718195347202285390279820435349; - - uint256 constant IC27x = 8021544724659208314956854536191758170410161794829262652377062879718582077619; - uint256 constant IC27y = 11242343205078067027061957056593092382351538151124811098324850161004134673555; - - uint256 constant IC28x = 3078234746564587714000443808454353377587938001919200323959521327347201776344; - uint256 constant IC28y = 2745006783235117142840024866060647109576786923760899534870847030757937709480; - - uint256 constant IC29x = 5964844476592478242407630507799027172948004079052748175556332403023505609276; - uint256 constant IC29y = 12768841436519508981792953013446512028720534352691237119399120037998541137224; - - uint256 constant IC30x = 15371609663317589294806761513526368989695520686639615266578243336031459611909; - uint256 constant IC30y = 16994646314587748959724789317702812017993403087486552388242926535433658915883; - - uint256 constant IC31x = 6683739596768676873248624858087923536398042926812221220245863544486923422711; - uint256 constant IC31y = 12457051898274801033654726559510059327583138828424088437950360209133530872938; - - uint256 constant IC32x = 12960094561130886505165854876806731618571707898820633243029947918452735526807; - uint256 constant IC32y = 6820833146511263887962056926524443259150994889983748875463240028627107473405; - - uint256 constant IC33x = 996044632338712992107340240713239518089208404641712342335139731510181571935; - uint256 constant IC33y = 273204942495896233059800495345764298864994985906625498267135262620807809339; - - uint256 constant IC34x = 1813777432174456228797740790983800618055554859202869474902366329763076454717; - uint256 constant IC34y = 18263062241351175416183473322099225631153099284041729083414647404711496873274; - - + uint256 constant alphax = + 20491192805390485299153009773594534940189261866228447918068658471970481763042; + uint256 constant alphay = + 9383485363053290200918347156157836566562967994039712273449902621266178545958; + uint256 constant betax1 = + 4252822878758300859123897981450591353533073413197771768651442665752259397132; + uint256 constant betax2 = + 6375614351688725206403948262868962793625744043794305715222011528459656738731; + uint256 constant betay1 = + 21847035105528745403288232691147584728191162732299865338377159692350059136679; + uint256 constant betay2 = + 10505242626370262277552901082094356697409835680220590971873171140371331206856; + uint256 constant gammax1 = + 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant gammax2 = + 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant gammay1 = + 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant gammay2 = + 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant deltax1 = + 520994677997493400810773541476499788644902082984396453075685762761831850120; + uint256 constant deltax2 = + 10213897956116323293360574495863850733565743032313310303301962890191828600579; + uint256 constant deltay1 = + 7932164237875706492467150825847531456461165832347520966415283522471937964900; + uint256 constant deltay2 = + 13933167949481980812622491915190180689983098052228504440538951968850456401091; + + uint256 constant IC0x = + 5535234085311902579901349478459196637795058221120958134445592343488246156733; + uint256 constant IC0y = + 5306640240432430234979242614873688760288740315547161616274789884917660992367; + + uint256 constant IC1x = + 10707387490009252629078273089029959904307706408726467155680696001386854048915; + uint256 constant IC1y = + 17653533518649258839749460334216534095963029303372459441511113120126665109653; + + uint256 constant IC2x = + 20865571486499188594003814476515099918525806346210086833881258772408663191533; + uint256 constant IC2y = + 7888240421702647837386220931474009495401756148617371230939296514314837098271; + + uint256 constant IC3x = + 1912978194609077207430131695891867170745002253126750956906023142956794841865; + uint256 constant IC3y = + 17615941814906629303790964184866269246906472609406726939478790210268313990051; + + uint256 constant IC4x = + 15066418251539359853074143581365946179824576559935306245174822608350324474776; + uint256 constant IC4y = + 3268372113574542796802111569975146953310662150883456386537997506424333670939; + + uint256 constant IC5x = + 16726903819494555062907147643613770035747444680904544904305313872617709937814; + uint256 constant IC5y = + 17101225626470597533777593163737774333478931604126018373298094394038436070638; + + uint256 constant IC6x = + 20641928936490067347238549514729636898746687294162031430805590421560903783440; + uint256 constant IC6y = + 67121451455228913817899520547955848577485738949760740559721896890970176103; + + uint256 constant IC7x = + 14545357897180104829942737321629647336974601349904876305377785895976088498628; + uint256 constant IC7y = + 16314295394308016823245804523460668622871621620058982289202172672703214642909; + + uint256 constant IC8x = + 21739153088746313904366793933727782582174946747904879487285317254557443015329; + uint256 constant IC8y = + 3132175803297520185172383705548796916566539464602625887509031362173771022843; + + uint256 constant IC9x = + 20333233803298528081912583132659619517672056679176472634300802350468027326361; + uint256 constant IC9y = + 6238837794343377502421946404928002513039151091738403488064287245988205748593; + + uint256 constant IC10x = + 16418874123357333544592669082833232850459535832174384729993255430764462500486; + uint256 constant IC10y = + 21771971202968985066744191573424980335377073332855742387685123535002522571529; + + uint256 constant IC11x = + 19451975215864606845692411747435064359921385769371233821650301822958164252383; + uint256 constant IC11y = + 20892514595722901078388943250566322962503399436888984708776669059327181439790; + + uint256 constant IC12x = + 7890932830092388862341624941690789312256479754725115142819338325966740669428; + uint256 constant IC12y = + 4418832493543398820840947134519317894746836913806654901909239755962388809991; + + uint256 constant IC13x = + 8199473712814016100135467002253188985688335051507321176911775440880532334952; + uint256 constant IC13y = + 15997818842062211202600134971063758566999644777722172606469491329666812258276; + + uint256 constant IC14x = + 12137522381148387733238329761055359894311504591070198713455315089652636842402; + uint256 constant IC14y = + 21339188004338495042416918774038965889032101950904198621697204175535425843091; + + uint256 constant IC15x = + 20499263784776697905943622542054972660913496529317877469532325036659142860841; + uint256 constant IC15y = + 11428736355199483131940447330380125032711949052439215155046658645463458617674; + + uint256 constant IC16x = + 5754299204496299424940297228286983528858894010778459654161035126221861884425; + uint256 constant IC16y = + 184143361306450555375946116665530361251584344793605929804900169497536069657; + + uint256 constant IC17x = + 6863685095405518858940222663610976520118803865048723755871419028593531099958; + uint256 constant IC17y = + 18102099448859799403953336894017457656590279241400870825068223761138751757204; + + uint256 constant IC18x = + 11617180898926442769507234462139371394680677212983320064407531026440672878535; + uint256 constant IC18y = + 4231987035195694511291113860396316866846277265956849978459149363401736899419; + + uint256 constant IC19x = + 6338405922510297847509581085618085787266710988385331069423772530751893351108; + uint256 constant IC19y = + 2369188132617549234166848605509335807620667833570812871717711881712251941471; + + uint256 constant IC20x = + 6534724304493884898998457959752744402731711456639277994605971968266824841921; + uint256 constant IC20y = + 3616930696544290755224333216672259977980824937811778199173736509869170686624; + + uint256 constant IC21x = + 18296109485859597664201013922077450611537275721380521453297622562810889903055; + uint256 constant IC21y = + 3895545879384074505865915948837152152498358964611960941429309095904181030693; + + uint256 constant IC22x = + 12343813894528681582898501974195928908758133920463632788058140152731464749914; + uint256 constant IC22y = + 21505758529614139837798769683411075306857597005036383220173003789253857347751; + + uint256 constant IC23x = + 16230461810715823239242025482008567032302510218301798998030587563164759203923; + uint256 constant IC23y = + 1994949152609869198152052650904921912838643069265165983919780834335733459441; + + uint256 constant IC24x = + 373995982353912590050571385234870501485812926774804412495284185340492728591; + uint256 constant IC24y = + 4424414072575513799911234230042788376840811362954861538886070866583770853757; + + uint256 constant IC25x = + 73053181031153871276946499443822334078747902352960726679539712950424139587; + uint256 constant IC25y = + 1540570167066699022838327597833448980761202822749917678465275227142577692420; + + uint256 constant IC26x = + 19743666564083954842724375605301868007217803605683850153936265256536005058028; + uint256 constant IC26y = + 17989815625617579036436769970865806048561975460718195347202285390279820435349; + + uint256 constant IC27x = + 8021544724659208314956854536191758170410161794829262652377062879718582077619; + uint256 constant IC27y = + 11242343205078067027061957056593092382351538151124811098324850161004134673555; + + uint256 constant IC28x = + 3078234746564587714000443808454353377587938001919200323959521327347201776344; + uint256 constant IC28y = + 2745006783235117142840024866060647109576786923760899534870847030757937709480; + + uint256 constant IC29x = + 5964844476592478242407630507799027172948004079052748175556332403023505609276; + uint256 constant IC29y = + 12768841436519508981792953013446512028720534352691237119399120037998541137224; + + uint256 constant IC30x = + 15371609663317589294806761513526368989695520686639615266578243336031459611909; + uint256 constant IC30y = + 16994646314587748959724789317702812017993403087486552388242926535433658915883; + + uint256 constant IC31x = + 6683739596768676873248624858087923536398042926812221220245863544486923422711; + uint256 constant IC31y = + 12457051898274801033654726559510059327583138828424088437950360209133530872938; + + uint256 constant IC32x = + 12960094561130886505165854876806731618571707898820633243029947918452735526807; + uint256 constant IC32y = + 6820833146511263887962056926524443259150994889983748875463240028627107473405; + + uint256 constant IC33x = + 996044632338712992107340240713239518089208404641712342335139731510181571935; + uint256 constant IC33y = + 273204942495896233059800495345764298864994985906625498267135262620807809339; + + uint256 constant IC34x = + 1813777432174456228797740790983800618055554859202869474902366329763076454717; + uint256 constant IC34y = + 18263062241351175416183473322099225631153099284041729083414647404711496873274; + // Memory data uint16 constant pVk = 0; uint16 constant pPairing = 128; uint16 constant pLastMem = 896; - function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[34] calldata _pubSignals) public view returns (bool) { + function verifyProof( + uint[2] calldata _pA, + uint[2][2] calldata _pB, + uint[2] calldata _pC, + uint[34] calldata _pubSignals + ) public view returns (bool) { assembly { function checkField(v) { if iszero(lt(v, r)) { @@ -163,7 +252,7 @@ contract Groth16Verifier { return(0, 0x20) } } - + // G1 function to multiply a G1 value(x,y) to value in an address function g1_mulAccC(pR, x, y, s) { let success @@ -198,79 +287,206 @@ contract Groth16Verifier { mstore(add(_pVk, 32), IC0y) // Compute the linear combination vk_x - + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) - + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) - + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) - + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) - + g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) - + g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) - + g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192))) - + g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224))) - + g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256))) - - g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288))) - - g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320))) - - g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352))) - - g1_mulAccC(_pVk, IC13x, IC13y, calldataload(add(pubSignals, 384))) - - g1_mulAccC(_pVk, IC14x, IC14y, calldataload(add(pubSignals, 416))) - - g1_mulAccC(_pVk, IC15x, IC15y, calldataload(add(pubSignals, 448))) - - g1_mulAccC(_pVk, IC16x, IC16y, calldataload(add(pubSignals, 480))) - - g1_mulAccC(_pVk, IC17x, IC17y, calldataload(add(pubSignals, 512))) - - g1_mulAccC(_pVk, IC18x, IC18y, calldataload(add(pubSignals, 544))) - - g1_mulAccC(_pVk, IC19x, IC19y, calldataload(add(pubSignals, 576))) - - g1_mulAccC(_pVk, IC20x, IC20y, calldataload(add(pubSignals, 608))) - - g1_mulAccC(_pVk, IC21x, IC21y, calldataload(add(pubSignals, 640))) - - g1_mulAccC(_pVk, IC22x, IC22y, calldataload(add(pubSignals, 672))) - - g1_mulAccC(_pVk, IC23x, IC23y, calldataload(add(pubSignals, 704))) - - g1_mulAccC(_pVk, IC24x, IC24y, calldataload(add(pubSignals, 736))) - - g1_mulAccC(_pVk, IC25x, IC25y, calldataload(add(pubSignals, 768))) - - g1_mulAccC(_pVk, IC26x, IC26y, calldataload(add(pubSignals, 800))) - - g1_mulAccC(_pVk, IC27x, IC27y, calldataload(add(pubSignals, 832))) - - g1_mulAccC(_pVk, IC28x, IC28y, calldataload(add(pubSignals, 864))) - - g1_mulAccC(_pVk, IC29x, IC29y, calldataload(add(pubSignals, 896))) - - g1_mulAccC(_pVk, IC30x, IC30y, calldataload(add(pubSignals, 928))) - - g1_mulAccC(_pVk, IC31x, IC31y, calldataload(add(pubSignals, 960))) - - g1_mulAccC(_pVk, IC32x, IC32y, calldataload(add(pubSignals, 992))) - - g1_mulAccC(_pVk, IC33x, IC33y, calldataload(add(pubSignals, 1024))) - - g1_mulAccC(_pVk, IC34x, IC34y, calldataload(add(pubSignals, 1056))) - + + g1_mulAccC( + _pVk, + IC10x, + IC10y, + calldataload(add(pubSignals, 288)) + ) + + g1_mulAccC( + _pVk, + IC11x, + IC11y, + calldataload(add(pubSignals, 320)) + ) + + g1_mulAccC( + _pVk, + IC12x, + IC12y, + calldataload(add(pubSignals, 352)) + ) + + g1_mulAccC( + _pVk, + IC13x, + IC13y, + calldataload(add(pubSignals, 384)) + ) + + g1_mulAccC( + _pVk, + IC14x, + IC14y, + calldataload(add(pubSignals, 416)) + ) + + g1_mulAccC( + _pVk, + IC15x, + IC15y, + calldataload(add(pubSignals, 448)) + ) + + g1_mulAccC( + _pVk, + IC16x, + IC16y, + calldataload(add(pubSignals, 480)) + ) + + g1_mulAccC( + _pVk, + IC17x, + IC17y, + calldataload(add(pubSignals, 512)) + ) + + g1_mulAccC( + _pVk, + IC18x, + IC18y, + calldataload(add(pubSignals, 544)) + ) + + g1_mulAccC( + _pVk, + IC19x, + IC19y, + calldataload(add(pubSignals, 576)) + ) + + g1_mulAccC( + _pVk, + IC20x, + IC20y, + calldataload(add(pubSignals, 608)) + ) + + g1_mulAccC( + _pVk, + IC21x, + IC21y, + calldataload(add(pubSignals, 640)) + ) + + g1_mulAccC( + _pVk, + IC22x, + IC22y, + calldataload(add(pubSignals, 672)) + ) + + g1_mulAccC( + _pVk, + IC23x, + IC23y, + calldataload(add(pubSignals, 704)) + ) + + g1_mulAccC( + _pVk, + IC24x, + IC24y, + calldataload(add(pubSignals, 736)) + ) + + g1_mulAccC( + _pVk, + IC25x, + IC25y, + calldataload(add(pubSignals, 768)) + ) + + g1_mulAccC( + _pVk, + IC26x, + IC26y, + calldataload(add(pubSignals, 800)) + ) + + g1_mulAccC( + _pVk, + IC27x, + IC27y, + calldataload(add(pubSignals, 832)) + ) + + g1_mulAccC( + _pVk, + IC28x, + IC28y, + calldataload(add(pubSignals, 864)) + ) + + g1_mulAccC( + _pVk, + IC29x, + IC29y, + calldataload(add(pubSignals, 896)) + ) + + g1_mulAccC( + _pVk, + IC30x, + IC30y, + calldataload(add(pubSignals, 928)) + ) + + g1_mulAccC( + _pVk, + IC31x, + IC31y, + calldataload(add(pubSignals, 960)) + ) + + g1_mulAccC( + _pVk, + IC32x, + IC32y, + calldataload(add(pubSignals, 992)) + ) + + g1_mulAccC( + _pVk, + IC33x, + IC33y, + calldataload(add(pubSignals, 1024)) + ) + + g1_mulAccC( + _pVk, + IC34x, + IC34y, + calldataload(add(pubSignals, 1056)) + ) // -A mstore(_pPairing, calldataload(pA)) - mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + mstore( + add(_pPairing, 32), + mod(sub(q, calldataload(add(pA, 32))), q) + ) // B mstore(add(_pPairing, 64), calldataload(pB)) @@ -292,7 +508,6 @@ contract Groth16Verifier { mstore(add(_pPairing, 384), mload(add(pMem, pVk))) mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) - // gamma2 mstore(add(_pPairing, 448), gammax1) mstore(add(_pPairing, 480), gammax2) @@ -309,8 +524,14 @@ contract Groth16Verifier { mstore(add(_pPairing, 704), deltay1) mstore(add(_pPairing, 736), deltay2) - - let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + let success := staticcall( + sub(gas(), 2000), + 8, + _pPairing, + 768, + _pPairing, + 0x20 + ) isOk := and(success, mload(_pPairing)) } @@ -319,83 +540,82 @@ contract Groth16Verifier { mstore(0x40, add(pMem, pLastMem)) // Validate that all evaluations ∈ F - + checkField(calldataload(add(_pubSignals, 0))) - + checkField(calldataload(add(_pubSignals, 32))) - + checkField(calldataload(add(_pubSignals, 64))) - + checkField(calldataload(add(_pubSignals, 96))) - + checkField(calldataload(add(_pubSignals, 128))) - + checkField(calldataload(add(_pubSignals, 160))) - + checkField(calldataload(add(_pubSignals, 192))) - + checkField(calldataload(add(_pubSignals, 224))) - + checkField(calldataload(add(_pubSignals, 256))) - + checkField(calldataload(add(_pubSignals, 288))) - + checkField(calldataload(add(_pubSignals, 320))) - + checkField(calldataload(add(_pubSignals, 352))) - + checkField(calldataload(add(_pubSignals, 384))) - + checkField(calldataload(add(_pubSignals, 416))) - + checkField(calldataload(add(_pubSignals, 448))) - + checkField(calldataload(add(_pubSignals, 480))) - + checkField(calldataload(add(_pubSignals, 512))) - + checkField(calldataload(add(_pubSignals, 544))) - + checkField(calldataload(add(_pubSignals, 576))) - + checkField(calldataload(add(_pubSignals, 608))) - + checkField(calldataload(add(_pubSignals, 640))) - + checkField(calldataload(add(_pubSignals, 672))) - + checkField(calldataload(add(_pubSignals, 704))) - + checkField(calldataload(add(_pubSignals, 736))) - + checkField(calldataload(add(_pubSignals, 768))) - + checkField(calldataload(add(_pubSignals, 800))) - + checkField(calldataload(add(_pubSignals, 832))) - + checkField(calldataload(add(_pubSignals, 864))) - + checkField(calldataload(add(_pubSignals, 896))) - + checkField(calldataload(add(_pubSignals, 928))) - + checkField(calldataload(add(_pubSignals, 960))) - + checkField(calldataload(add(_pubSignals, 992))) - + checkField(calldataload(add(_pubSignals, 1024))) - + checkField(calldataload(add(_pubSignals, 1056))) - + checkField(calldataload(add(_pubSignals, 1088))) - // Validate all evaluations let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) mstore(0, isValid) - return(0, 0x20) - } - } - } + return(0, 0x20) + } + } +} diff --git a/packages/contracts/src/utils/Verifier.sol b/packages/contracts/src/utils/Verifier.sol index 85834441..8a490f2c 100644 --- a/packages/contracts/src/utils/Verifier.sol +++ b/packages/contracts/src/utils/Verifier.sol @@ -21,8 +21,8 @@ contract Verifier is OwnableUpgradeable, UUPSUpgradeable { uint256 public constant DOMAIN_FIELDS = 9; uint256 public constant DOMAIN_BYTES = 255; - uint256 public constant SUBJECT_FIELDS = 20; - uint256 public constant SUBJECT_BYTES = 605; + uint256 public constant COMMAND_FIELDS = 20; + uint256 public constant COMMAND_BYTES = 605; constructor() {} @@ -42,7 +42,7 @@ contract Verifier is OwnableUpgradeable, UUPSUpgradeable { uint256[2] memory pC ) = abi.decode(proof.proof, (uint256[2], uint256[2][2], uint256[2])); - uint256[DOMAIN_FIELDS + SUBJECT_FIELDS + 5] memory pubSignals; + uint256[DOMAIN_FIELDS + COMMAND_FIELDS + 5] memory pubSignals; uint256[] memory stringFields; stringFields = _packBytes2Fields(bytes(proof.domainName), DOMAIN_BYTES); for (uint256 i = 0; i < DOMAIN_FIELDS; i++) { @@ -53,15 +53,15 @@ contract Verifier is OwnableUpgradeable, UUPSUpgradeable { pubSignals[DOMAIN_FIELDS + 2] = uint256(proof.timestamp); stringFields = _packBytes2Fields( bytes(proof.maskedCommand), - SUBJECT_BYTES + COMMAND_BYTES ); - for (uint256 i = 0; i < SUBJECT_FIELDS; i++) { + for (uint256 i = 0; i < COMMAND_FIELDS; i++) { pubSignals[DOMAIN_FIELDS + 3 + i] = stringFields[i]; } - pubSignals[DOMAIN_FIELDS + 3 + SUBJECT_FIELDS] = uint256( + pubSignals[DOMAIN_FIELDS + 3 + COMMAND_FIELDS] = uint256( proof.accountSalt ); - pubSignals[DOMAIN_FIELDS + 3 + SUBJECT_FIELDS + 1] = proof.isCodeExist + pubSignals[DOMAIN_FIELDS + 3 + COMMAND_FIELDS + 1] = proof.isCodeExist ? 1 : 0; diff --git a/packages/contracts/test/EmailAccountRecovery.t.sol b/packages/contracts/test/EmailAccountRecovery.t.sol index 12a27a57..834e52e7 100644 --- a/packages/contracts/test/EmailAccountRecovery.t.sol +++ b/packages/contracts/test/EmailAccountRecovery.t.sol @@ -591,7 +591,7 @@ contract EmailAccountRecoveryTest is StructHelper { vm.stopPrank(); } - function testExpectRevertHandleRecoveryInvalidSubjectParams() public { + function testExpectRevertHandleRecoveryInvalidCommandParams() public { testHandleAcceptance(); assertEq(recoveryController.isRecovering(address(simpleWallet)), false); diff --git a/packages/contracts/test/EmailAuth.t.sol b/packages/contracts/test/EmailAuth.t.sol index 29c9d3cc..55bb4845 100644 --- a/packages/contracts/test/EmailAuth.t.sol +++ b/packages/contracts/test/EmailAuth.t.sol @@ -432,6 +432,48 @@ contract EmailAuthTest is StructHelper { vm.stopPrank(); } + function testExpectRevertAuthEmailInvalidMaskedCommandLength() public { + vm.startPrank(deployer); + _testInsertCommandTemplate(); + EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); + vm.stopPrank(); + + assertEq( + emailAuth.usedNullifiers(emailAuthMsg.proof.emailNullifier), + false + ); + assertEq(emailAuth.lastTimestamp(), 0); + + // Set masked command length to 606, which should be 605 or less defined in the verifier. + emailAuthMsg.proof.maskedCommand = string(new bytes(606)); + + vm.startPrank(deployer); + vm.expectRevert(bytes("invalid masked command length")); + emailAuth.authEmail(emailAuthMsg); + vm.stopPrank(); + } + + // function testExpectRevertAuthEmailInvalidSizeOfTheSkippedSubjectPrefix() public { + // vm.startPrank(deployer); + // _testInsertSubjectTemplate(); + // EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); + // vm.stopPrank(); + + // assertEq( + // emailAuth.usedNullifiers(emailAuthMsg.proof.emailNullifier), + // false + // ); + // assertEq(emailAuth.lastTimestamp(), 0); + + // // Set skipped subject prefix length to 605, it should be less than 605. + // emailAuthMsg.skipedSubjectPrefix = 605; + + // vm.startPrank(deployer); + // vm.expectRevert(bytes("invalid size of the skipped subject prefix")); + // emailAuth.authEmail(emailAuthMsg); + // vm.stopPrank(); + // } + function testSetTimestampCheckEnabled() public { vm.startPrank(deployer); diff --git a/packages/prover/modal_server.py b/packages/prover/modal_server.py index 22c08b33..d727caa1 100644 --- a/packages/prover/modal_server.py +++ b/packages/prover/modal_server.py @@ -5,8 +5,7 @@ from google.cloud.logging_v2.handlers import setup_logging from google.oauth2 import service_account - -app = modal.App("email-auth-prover-body-parsing-v1.0.0") +app = modal.App("email-auth-prover-v1.2.0") image = modal.Image.from_dockerfile("Dockerfile") diff --git a/yarn.lock b/yarn.lock index dd845b0b..bcd49b69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1802,7 +1802,7 @@ dependencies: "@types/yargs-parser" "*" -"@zk-email/circuits@^6.1.5": +"@zk-email/circuits@=6.1.5": version "6.1.5" resolved "https://registry.yarnpkg.com/@zk-email/circuits/-/circuits-6.1.5.tgz#53462456638edf97bbc206ead01c302ba11e7850" integrity sha512-Hx+R7ARIZ1JLJ6Ba3qqkWdGweOS63P2VyldVgZ5z0KZ5PvgAsM1ka8AUWzq1RFZCmgbluY8yiHLzWREbQm9bOQ== @@ -1810,7 +1810,7 @@ "@zk-email/zk-regex-circom" "^2.1.0" circomlib "^2.0.5" -"@zk-email/contracts@^6.1.2": +"@zk-email/contracts@^6.1.5": version "6.1.5" resolved "https://registry.yarnpkg.com/@zk-email/contracts/-/contracts-6.1.5.tgz#979c2aaa30cdcdb7433ff37d74c396df0cb60107" integrity sha512-1RW3dpYGBQXjmIlcTGMtYsux7FQoR1MezA0D0pssrNEaCO2CuQd6oAxJLpbCxFQWPbujLKn8PiEVcjP+eiGvVw== @@ -1818,16 +1818,16 @@ "@openzeppelin/contracts" "^5.0.0" dotenv "^16.3.1" -"@zk-email/relayer-utils@^0.3.6": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@zk-email/relayer-utils/-/relayer-utils-0.3.6.tgz#55d0109b57b7f19e2441c90a55ed8096dfdaefe4" - integrity sha512-j3xjcKmG2rMdwvg462s6QQ+CRr29mOT6uYq57rotg64c4UbvPWvhcuuJ7C7qc2wUl4bhShuBz1NoE8e2jkwHOw== +"@zk-email/relayer-utils@=0.3.7": + version "0.3.7" + resolved "https://registry.yarnpkg.com/@zk-email/relayer-utils/-/relayer-utils-0.3.7.tgz#a3cdcc02e3607ac2fe9a9c1d90077df702011a02" + integrity sha512-+/SYjuwO22kKp9n0syoOeRoifx7RDzZ8ycr1mAAIpEKgnySibTfGJpcFEkBTpv5eIK/a7vEev8KE6uG1Sj49EQ== dependencies: "@mapbox/node-pre-gyp" "^1.0" cargo-cp-artifact "^0.1" node-pre-gyp-github "https://github.com/ultamatt/node-pre-gyp-github.git" -"@zk-email/zk-regex-circom@^2.1.0": +"@zk-email/zk-regex-circom@=2.1.1", "@zk-email/zk-regex-circom@^2.1.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@zk-email/zk-regex-circom/-/zk-regex-circom-2.1.1.tgz#e4f41fd873905d27dd05a9f07613717be4b2e5d1" integrity sha512-tuU2Kb08fwYkAPDemL8RRvLTEKNGyUt2odYr5awkVKGCZGCV1hxIy/wke6+2fIOR8Lu82MnXVtdBk+G3gRZLbg== @@ -2241,9 +2241,9 @@ camelcase@^6.0.0, camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001646: - version "1.0.30001658" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz#b5f7be8ac748a049ab06aa1cf7a1408d83f074ec" - integrity sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw== + version "1.0.30001659" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001659.tgz#f370c311ffbc19c4965d8ec0064a3625c8aaa7af" + integrity sha512-Qxxyfv3RdHAfJcXelgf0hU4DFUVXBGTjqrBUZLUh8AtlGnsDo+CnncYtTd95+ZKfnANUOzxyIQCuU/UeBZBYoA== cargo-cp-artifact@^0.1: version "0.1.9" @@ -2371,9 +2371,9 @@ circomlibjs@^0.1.2: ffjavascript "^0.2.45" cjs-module-lexer@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz#677de7ed7efff67cc40c9bf1897fea79d41b5215" - integrity sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== cliui@^7.0.2: version "7.0.4" @@ -2611,9 +2611,9 @@ ejs@^3.1.10, ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.5.4: - version "1.5.16" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.16.tgz#125b6777774dbd4287aa86ab181cc880f4a5fb47" - integrity sha512-2gQpi2WYobXmz2q23FrOBYTLcI1O/P4heW3eqX+ldmPVDQELRqhiebV380EhlGG12NtnX1qbK/FHpN0ba+7bLA== + version "1.5.18" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.18.tgz#5fe62b9d21efbcfa26571066502d94f3ed97e495" + integrity sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ== elliptic@6.5.4: version "6.5.4" @@ -4566,7 +4566,7 @@ snarkjs@0.5.0: logplease "^1.2.15" r1csfile "0.0.41" -snarkjs@^0.7.0: +snarkjs@^0.7.0, snarkjs@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.7.4.tgz#b9ad5813f055ab84d33f1831a6f1f34a71b6cd46" integrity sha512-x4cOCR4YXSyBlLtfnUUwfbZrw8wFd/Y0lk83eexJzKwZB8ELdpH+10ts8YtDsm2/a3WK7c7p514bbE8NpqxW8w== From 5002ab32704b7c51dd70a46802346d618cdb47e0 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Tue, 10 Sep 2024 16:23:19 +0900 Subject: [PATCH 042/121] Add IGroth16Verifier --- packages/contracts/script/DeployCommons.s.sol | 7 ++++++- .../contracts/script/DeployRecoveryController.s.sol | 7 ++++++- .../contracts/src/interfaces/IGroth16Verifier.sol | 11 +++++++++++ packages/contracts/src/utils/Verifier.sol | 11 +++++++---- packages/contracts/test/Integration.t.sol | 7 ++++++- packages/contracts/test/helpers/DeploymentHelper.sol | 7 ++++++- 6 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 packages/contracts/src/interfaces/IGroth16Verifier.sol diff --git a/packages/contracts/script/DeployCommons.s.sol b/packages/contracts/script/DeployCommons.s.sol index 9a392170..f547e03d 100644 --- a/packages/contracts/script/DeployCommons.s.sol +++ b/packages/contracts/script/DeployCommons.s.sol @@ -6,6 +6,7 @@ import "forge-std/Script.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "../test/helpers/SimpleWallet.sol"; import "../src/utils/Verifier.sol"; +import "../src/utils/Groth16Verifier.sol"; import "../src/utils/ECDSAOwnedDKIMRegistry.sol"; // import "../src/utils/ForwardDKIMRegistry.sol"; import "../src/EmailAuth.sol"; @@ -80,9 +81,13 @@ contract Deploy is Script { "Verifier implementation deployed at: %s", address(verifierImpl) ); + Groth16Verifier groth16Verifier = new Groth16Verifier(); ERC1967Proxy verifierProxy = new ERC1967Proxy( address(verifierImpl), - abi.encodeCall(verifierImpl.initialize, (initialOwner)) + abi.encodeCall( + verifierImpl.initialize, + (initialOwner, address(groth16Verifier)) + ) ); verifier = Verifier(address(verifierProxy)); console.log("Verifier deployed at: %s", address(verifier)); diff --git a/packages/contracts/script/DeployRecoveryController.s.sol b/packages/contracts/script/DeployRecoveryController.s.sol index 5df2c89a..0251e36d 100644 --- a/packages/contracts/script/DeployRecoveryController.s.sol +++ b/packages/contracts/script/DeployRecoveryController.s.sol @@ -7,6 +7,7 @@ import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "../test/helpers/SimpleWallet.sol"; import "../test/helpers/RecoveryController.sol"; import "../src/utils/Verifier.sol"; +import "../src/utils/Groth16Verifier.sol"; import "../src/utils/ECDSAOwnedDKIMRegistry.sol"; // import "../src/utils/ForwardDKIMRegistry.sol"; import "../src/EmailAuth.sol"; @@ -75,9 +76,13 @@ contract Deploy is Script { "Verifier implementation deployed at: %s", address(verifierImpl) ); + Groth16Verifier groth16Verifier = new Groth16Verifier(); ERC1967Proxy verifierProxy = new ERC1967Proxy( address(verifierImpl), - abi.encodeCall(verifierImpl.initialize, (initialOwner)) + abi.encodeCall( + verifierImpl.initialize, + (initialOwner, address(groth16Verifier)) + ) ); verifier = Verifier(address(verifierProxy)); console.log("Verifier deployed at: %s", address(verifier)); diff --git a/packages/contracts/src/interfaces/IGroth16Verifier.sol b/packages/contracts/src/interfaces/IGroth16Verifier.sol new file mode 100644 index 00000000..47bc46fd --- /dev/null +++ b/packages/contracts/src/interfaces/IGroth16Verifier.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +interface IGroth16Verifier { + function verifyProof( + uint[2] calldata _pA, + uint[2][2] calldata _pB, + uint[2] calldata _pC, + uint[34] calldata _pubSignals + ) external view returns (bool); +} diff --git a/packages/contracts/src/utils/Verifier.sol b/packages/contracts/src/utils/Verifier.sol index 8a490f2c..753c76ff 100644 --- a/packages/contracts/src/utils/Verifier.sol +++ b/packages/contracts/src/utils/Verifier.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; -import "./Groth16Verifier.sol"; +import "../interfaces/IGroth16Verifier.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; @@ -17,7 +17,7 @@ struct EmailProof { } contract Verifier is OwnableUpgradeable, UUPSUpgradeable { - Groth16Verifier groth16Verifier; + IGroth16Verifier groth16Verifier; uint256 public constant DOMAIN_FIELDS = 9; uint256 public constant DOMAIN_BYTES = 255; @@ -28,9 +28,12 @@ contract Verifier is OwnableUpgradeable, UUPSUpgradeable { /// @notice Initialize the contract with the initial owner and deploy Groth16Verifier /// @param _initialOwner The address of the initial owner - function initialize(address _initialOwner) public initializer { + function initialize( + address _initialOwner, + address _groth16Verifier + ) public initializer { __Ownable_init(_initialOwner); - groth16Verifier = new Groth16Verifier(); + groth16Verifier = IGroth16Verifier(_groth16Verifier); } function verifyEmailProof( diff --git a/packages/contracts/test/Integration.t.sol b/packages/contracts/test/Integration.t.sol index 628022b3..a7f59a5e 100644 --- a/packages/contracts/test/Integration.t.sol +++ b/packages/contracts/test/Integration.t.sol @@ -9,6 +9,7 @@ import "@zk-email/contracts/DKIMRegistry.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "../src/EmailAuth.sol"; import "../src/utils/Verifier.sol"; +import "../src/utils/Groth16Verifier.sol"; import "../src/utils/ECDSAOwnedDKIMRegistry.sol"; import "./helpers/SimpleWallet.sol"; import "./helpers/RecoveryController.sol"; @@ -83,9 +84,13 @@ contract IntegrationTest is Test { // Create Verifier { Verifier verifierImpl = new Verifier(); + Groth16Verifier groth16Verifier = new Groth16Verifier(); ERC1967Proxy verifierProxy = new ERC1967Proxy( address(verifierImpl), - abi.encodeCall(verifierImpl.initialize, (msg.sender)) + abi.encodeCall( + verifierImpl.initialize, + (msg.sender, address(groth16Verifier)) + ) ); verifier = Verifier(address(verifierProxy)); } diff --git a/packages/contracts/test/helpers/DeploymentHelper.sol b/packages/contracts/test/helpers/DeploymentHelper.sol index c3e720fe..b4bcc5c5 100644 --- a/packages/contracts/test/helpers/DeploymentHelper.sol +++ b/packages/contracts/test/helpers/DeploymentHelper.sol @@ -7,6 +7,7 @@ import "forge-std/console.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "../../src/EmailAuth.sol"; import "../../src/utils/Verifier.sol"; +import "../../src/utils/Groth16Verifier.sol"; import "../../src/utils/ECDSAOwnedDKIMRegistry.sol"; // import "../../src/utils/ForwardDKIMRegistry.sol"; import {UserOverrideableDKIMRegistry} from "@zk-email/contracts/UserOverrideableDKIMRegistry.sol"; @@ -92,9 +93,13 @@ contract DeploymentHelper is Test { "Verifier implementation deployed at: %s", address(verifierImpl) ); + Groth16Verifier groth16Verifier = new Groth16Verifier(); ERC1967Proxy verifierProxy = new ERC1967Proxy( address(verifierImpl), - abi.encodeCall(verifierImpl.initialize, (msg.sender)) + abi.encodeCall( + verifierImpl.initialize, + (msg.sender, address(groth16Verifier)) + ) ); verifier = Verifier(address(verifierProxy)); } From d2255a44ccfe6a9d0079d9d9784b94dca9221fbf Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Tue, 10 Sep 2024 16:31:38 +0900 Subject: [PATCH 043/121] Recover skipped_commad_bytes --- packages/contracts/src/EmailAuth.sol | 30 +++++++++++++++++-- packages/contracts/test/Integration.t.sol | 2 ++ .../contracts/test/helpers/StructHelper.sol | 1 + 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/contracts/src/EmailAuth.sol b/packages/contracts/src/EmailAuth.sol index d7cb5120..07b883b6 100644 --- a/packages/contracts/src/EmailAuth.sol +++ b/packages/contracts/src/EmailAuth.sol @@ -15,6 +15,8 @@ struct EmailAuthMsg { uint templateId; /// @notice The parameters in the command of the email body, which should be taken according to the specified command template. bytes[] commandParams; + /// @notice The number of skipped bytes in the command. + uint skippedCommandPrefix; /// @notice The email proof containing the zk proof and other necessary information for the email verification by the verifier contract. EmailProof proof; } @@ -224,8 +226,16 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { verifier.COMMAND_BYTES(), "invalid masked command length" ); + require( + emailAuthMsg.skippedCommandPrefix < verifier.COMMAND_BYTES(), + "invalid size of the skipped command prefix" + ); // Construct an expectedCommand from template and the values of emailAuthMsg.commandParams. + string memory trimmedMaskedCommand = removePrefix( + emailAuthMsg.proof.maskedCommand, + emailAuthMsg.skippedCommandPrefix + ); string memory expectedCommand = ""; for (uint stringCase = 0; stringCase < 3; stringCase++) { expectedCommand = CommandUtils.computeExpectedCommand( @@ -233,9 +243,7 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { template, stringCase ); - if ( - Strings.equal(expectedCommand, emailAuthMsg.proof.maskedCommand) - ) { + if (Strings.equal(expectedCommand, trimmedMaskedCommand)) { break; } if (stringCase == 2) { @@ -273,4 +281,20 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { function _authorizeUpgrade( address newImplementation ) internal override onlyOwner {} + + function removePrefix( + string memory str, + uint numChars + ) private pure returns (string memory) { + require(numChars <= bytes(str).length, "Invalid number of characters"); + + bytes memory strBytes = bytes(str); + bytes memory result = new bytes(strBytes.length - numChars); + + for (uint i = numChars; i < strBytes.length; i++) { + result[i - numChars] = strBytes[i]; + } + + return string(result); + } } diff --git a/packages/contracts/test/Integration.t.sol b/packages/contracts/test/Integration.t.sol index a7f59a5e..647d3d9c 100644 --- a/packages/contracts/test/Integration.t.sol +++ b/packages/contracts/test/Integration.t.sol @@ -236,6 +236,7 @@ contract IntegrationTest is Test { templateIdx ), commandParams: commandParamsForAcceptance, + skippedCommandPrefix: 0, proof: emailProof }); recoveryController.handleAcceptance(emailAuthMsg, templateIdx); @@ -316,6 +317,7 @@ contract IntegrationTest is Test { templateIdx ), commandParams: commandParamsForRecovery, + skippedCommandPrefix: 0, proof: emailProof }); recoveryController.handleRecovery(emailAuthMsg, templateIdx); diff --git a/packages/contracts/test/helpers/StructHelper.sol b/packages/contracts/test/helpers/StructHelper.sol index a2f3963f..e8c75761 100644 --- a/packages/contracts/test/helpers/StructHelper.sol +++ b/packages/contracts/test/helpers/StructHelper.sol @@ -28,6 +28,7 @@ contract StructHelper is DeploymentHelper { emailAuthMsg = EmailAuthMsg({ templateId: templateId, commandParams: commandParams, + skippedCommandPrefix: 0, proof: emailProof }); From 29989f4814e61918bfc7233e339c42960ab88df8 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Tue, 10 Sep 2024 16:53:26 +0900 Subject: [PATCH 044/121] Apply audit-fixes to the body-parsing circuit. --- .../circuits/src/email_auth_template.circom | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/circuits/src/email_auth_template.circom b/packages/circuits/src/email_auth_template.circom index 1df21428..9a07d485 100644 --- a/packages/circuits/src/email_auth_template.circom +++ b/packages/circuits/src/email_auth_template.circom @@ -269,6 +269,8 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co signal from_regex_out, from_regex_reveal[max_header_bytes]; (from_regex_out, from_regex_reveal) <== FromAddrRegex(max_header_bytes)(padded_header); from_regex_out === 1; + signal is_valid_from_addr_idx <== LessThan(log2Ceil(max_header_bytes))([from_addr_idx, max_header_bytes]); + is_valid_from_addr_idx === 1; signal from_email_addr[email_max_bytes]; from_email_addr <== SelectRegexReveal(max_header_bytes, email_max_bytes)(from_regex_reveal, from_addr_idx); @@ -276,6 +278,8 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co signal domain_regex_out, domain_regex_reveal[email_max_bytes]; (domain_regex_out, domain_regex_reveal) <== EmailDomainRegex(email_max_bytes)(from_email_addr); domain_regex_out === 1; + signal is_valid_domain_idx <== LessThan(log2Ceil(email_max_bytes))([domain_idx, email_max_bytes]); + is_valid_domain_idx === 1; signal domain_name_bytes[domain_len]; domain_name_bytes <== SelectRegexReveal(email_max_bytes, domain_len)(domain_regex_reveal, domain_idx); domain_name <== Bytes2Ints(domain_len)(domain_name_bytes); @@ -289,6 +293,8 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co signal timestamp_regex_out, timestamp_regex_reveal[max_header_bytes]; (timestamp_regex_out, timestamp_regex_reveal) <== TimestampRegex(max_header_bytes)(padded_header); signal timestamp_str[timestamp_len]; + signal is_valid_timestamp_idx <== LessThan(log2Ceil(max_header_bytes))([timestamp_idx, max_header_bytes]); + is_valid_timestamp_idx === 1; timestamp_str <== SelectRegexReveal(max_header_bytes, timestamp_len)(timestamp_regex_reveal, timestamp_idx); signal raw_timestamp <== Digit2Int(timestamp_len)(timestamp_str); timestamp <== timestamp_regex_out * raw_timestamp; @@ -301,19 +307,21 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co (command_regex_out, command_regex_reveal) <== CommandRegex(max_body_bytes)(padded_cleaned_body); } command_regex_out === 1; + signal is_valid_command_idx <== LessThan(log2Ceil(max_command_bytes))([command_idx, max_command_bytes]); + is_valid_command_idx === 1; signal command_all[max_command_bytes]; command_all <== SelectRegexReveal(max_body_bytes, max_command_bytes)(command_regex_reveal, command_idx); signal prefixed_code_regex_out, prefixed_code_regex_reveal[max_command_bytes]; (prefixed_code_regex_out, prefixed_code_regex_reveal) <== InvitationCodeWithPrefixRegex(max_command_bytes)(command_all); - is_code_exist <== IsZero()(prefixed_code_regex_out-1); + is_code_exist <== prefixed_code_regex_out; signal removed_code[max_command_bytes]; for(var i = 0; i < max_command_bytes; i++) { removed_code[i] <== is_code_exist * prefixed_code_regex_reveal[i]; } signal command_email_addr_regex_out, command_email_addr_regex_reveal[max_command_bytes]; (command_email_addr_regex_out, command_email_addr_regex_reveal) <== EmailAddrRegex(max_command_bytes)(command_all); - signal is_command_email_addr_exist <== IsZero()(command_email_addr_regex_out-1); + signal is_command_email_addr_exist <== command_email_addr_regex_out; signal removed_command_email_addr[max_command_bytes]; for(var i = 0; i < max_command_bytes; i++) { removed_command_email_addr[i] <== is_command_email_addr_exist * command_email_addr_regex_reveal[i]; @@ -331,8 +339,7 @@ template EmailAuthWithBodyParsing(n, k, max_header_bytes, max_body_bytes, max_co } else { (code_regex_out, code_regex_reveal) <== InvitationCodeRegex(max_body_bytes)(padded_cleaned_body); } - signal code_consistency <== IsZero()(is_code_exist * (1 - code_regex_out)); - code_consistency === 1; + is_code_exist * (1 - code_regex_out) === 0; signal replaced_code_regex_reveal[max_body_bytes]; for(var i=0; i Date: Tue, 10 Sep 2024 16:55:52 +0900 Subject: [PATCH 045/121] Fix relayer --- .../src/abis/email_account_recovery.rs | 21 +++++++++++-------- packages/relayer/src/abis/email_auth.rs | 12 ++++++----- packages/relayer/src/core.rs | 2 ++ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/packages/relayer/src/abis/email_account_recovery.rs b/packages/relayer/src/abis/email_account_recovery.rs index b49c5af1..3f458798 100644 --- a/packages/relayer/src/abis/email_account_recovery.rs +++ b/packages/relayer/src/abis/email_account_recovery.rs @@ -369,6 +369,7 @@ pub mod email_account_recovery { ::ethers::core::abi::ethabi::ParamType::Bytes, ), ), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Tuple( ::std::vec![ ::ethers::core::abi::ethabi::ParamType::String, @@ -419,6 +420,7 @@ pub mod email_account_recovery { ::ethers::core::abi::ethabi::ParamType::Bytes, ), ), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Tuple( ::std::vec![ ::ethers::core::abi::ethabi::ParamType::String, @@ -745,24 +747,24 @@ pub mod email_account_recovery { .method_hash([165, 227, 238, 112], (command_params, template_idx)) .expect("method not found (this should never happen)") } - ///Calls the contract's `handleAcceptance` (0xd686b48a) function + ///Calls the contract's `handleAcceptance` (0x0481af67) function pub fn handle_acceptance( &self, email_auth_msg: EmailAuthMsg, template_idx: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([214, 134, 180, 138], (email_auth_msg, template_idx)) + .method_hash([4, 129, 175, 103], (email_auth_msg, template_idx)) .expect("method not found (this should never happen)") } - ///Calls the contract's `handleRecovery` (0xb684742f) function + ///Calls the contract's `handleRecovery` (0xb68126fa) function pub fn handle_recovery( &self, email_auth_msg: EmailAuthMsg, template_idx: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([182, 132, 116, 47], (email_auth_msg, template_idx)) + .method_hash([182, 129, 38, 250], (email_auth_msg, template_idx)) .expect("method not found (this should never happen)") } ///Calls the contract's `isActivated` (0xc9faa7c5) function @@ -999,7 +1001,7 @@ pub mod email_account_recovery { pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, pub template_idx: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `handleAcceptance` function with signature `handleAcceptance((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0xd686b48a` + ///Container type for all input parameters for the `handleAcceptance` function with signature `handleAcceptance((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0x0481af67` #[derive( Clone, ::ethers::contract::EthCall, @@ -1012,13 +1014,13 @@ pub mod email_account_recovery { )] #[ethcall( name = "handleAcceptance", - abi = "handleAcceptance((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)" + abi = "handleAcceptance((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)" )] pub struct HandleAcceptanceCall { pub email_auth_msg: EmailAuthMsg, pub template_idx: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `handleRecovery` function with signature `handleRecovery((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0xb684742f` + ///Container type for all input parameters for the `handleRecovery` function with signature `handleRecovery((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0xb68126fa` #[derive( Clone, ::ethers::contract::EthCall, @@ -1031,7 +1033,7 @@ pub mod email_account_recovery { )] #[ethcall( name = "handleRecovery", - abi = "handleRecovery((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)" + abi = "handleRecovery((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)" )] pub struct HandleRecoveryCall { pub email_auth_msg: EmailAuthMsg, @@ -1615,7 +1617,7 @@ pub mod email_account_recovery { Hash )] pub struct VerifierAddrReturn(pub ::ethers::core::types::Address); - ///`EmailAuthMsg(uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` + ///`EmailAuthMsg(uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -1629,6 +1631,7 @@ pub mod email_account_recovery { pub struct EmailAuthMsg { pub template_id: ::ethers::core::types::U256, pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, + pub skipped_command_prefix: ::ethers::core::types::U256, pub proof: EmailProof, } ///`EmailProof(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)` diff --git a/packages/relayer/src/abis/email_auth.rs b/packages/relayer/src/abis/email_auth.rs index 7db65267..01764e80 100644 --- a/packages/relayer/src/abis/email_auth.rs +++ b/packages/relayer/src/abis/email_auth.rs @@ -77,6 +77,7 @@ pub mod email_auth { ::ethers::core::abi::ethabi::ParamType::Bytes, ), ), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Tuple( ::std::vec![ ::ethers::core::abi::ethabi::ParamType::String, @@ -1056,13 +1057,13 @@ pub mod email_auth { .method_hash([108, 116, 146, 30], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `authEmail` (0xce207018) function + ///Calls the contract's `authEmail` (0xad3f5f9b) function pub fn auth_email( &self, email_auth_msg: EmailAuthMsg, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([206, 32, 112, 24], (email_auth_msg,)) + .method_hash([173, 63, 95, 155], (email_auth_msg,)) .expect("method not found (this should never happen)") } ///Calls the contract's `commandTemplates` (0x091c1650) function @@ -2114,7 +2115,7 @@ pub mod email_auth { )] #[ethcall(name = "accountSalt", abi = "accountSalt()")] pub struct AccountSaltCall; - ///Container type for all input parameters for the `authEmail` function with signature `authEmail((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))` and selector `0xce207018` + ///Container type for all input parameters for the `authEmail` function with signature `authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))` and selector `0xad3f5f9b` #[derive( Clone, ::ethers::contract::EthCall, @@ -2127,7 +2128,7 @@ pub mod email_auth { )] #[ethcall( name = "authEmail", - abi = "authEmail((uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))" + abi = "authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))" )] pub struct AuthEmailCall { pub email_auth_msg: EmailAuthMsg, @@ -3013,7 +3014,7 @@ pub mod email_auth { Hash )] pub struct VerifierAddrReturn(pub ::ethers::core::types::Address); - ///`EmailAuthMsg(uint256,bytes[],(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` + ///`EmailAuthMsg(uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3027,6 +3028,7 @@ pub mod email_auth { pub struct EmailAuthMsg { pub template_id: ::ethers::core::types::U256, pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, + pub skipped_command_prefix: ::ethers::core::types::U256, pub proof: EmailProof, } ///`EmailProof(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)` diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index cba3c4ee..bc28757e 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -143,6 +143,7 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), command_params: command_params_encoded, + skipped_command_prefix: U256::zero(), proof: email_proof.clone(), }; @@ -284,6 +285,7 @@ pub async fn handle_email(email: String) -> Result { let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), command_params: command_params_encoded, + skipped_command_prefix: U256::zero(), proof: email_proof.clone(), }; From 30e99de789e773c7d2a0f8886fb6332687155b0a Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Tue, 10 Sep 2024 17:27:15 +0900 Subject: [PATCH 046/121] Disable auto script tests in contracts --- packages/contracts/package.json | 4 +- packages/contracts/test/EmailAuth.t.sol | 42 ++++++++++--------- ...eOwners.t.sol => ChangeOwnersScript.t.sol} | 2 +- ...ignerInECDSAOwnedDKIMRegistryScript.t.sol} | 2 +- ...geSourceInForwardDKIMRegistryScript.t.sol} | 2 +- ...ommons.t.sol => DeployCommonsScript.t.sol} | 11 ++--- ...l => DeployRecoveryControllerScript.t.sol} | 14 +------ ...t.t.sol => DeploySimpleWalletScript.t.sol} | 33 ++++----------- ...wners.t.sol => RenounceOwnersScript.t.sol} | 2 +- .../{Upgrades.t.sol => UpgradesScript.t.sol} | 2 +- 10 files changed, 43 insertions(+), 71 deletions(-) rename packages/contracts/test/script/{ChangeOwners.t.sol => ChangeOwnersScript.t.sol} (97%) rename packages/contracts/test/script/{ChangeSignerInECDSAOwnedDKIMRegistry.t.sol => ChangeSignerInECDSAOwnedDKIMRegistryScript.t.sol} (94%) rename packages/contracts/test/script/{ChangeSourceInForwardDKIMRegistry.t.sol => ChangeSourceInForwardDKIMRegistryScript.t.sol} (95%) rename packages/contracts/test/script/{DeployCommons.t.sol => DeployCommonsScript.t.sol} (61%) rename packages/contracts/test/script/{DeployRecoveryController.t.sol => DeployRecoveryControllerScript.t.sol} (64%) rename packages/contracts/test/script/{DeploySimpleWallet.t.sol => DeploySimpleWalletScript.t.sol} (63%) rename packages/contracts/test/script/{RenounceOwners.t.sol => RenounceOwnersScript.t.sol} (96%) rename packages/contracts/test/script/{Upgrades.t.sol => UpgradesScript.t.sol} (98%) diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 2234fd85..bc701317 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -5,8 +5,8 @@ "scripts": { "build": "forge build", "zkbuild": "forge build --zksync", - "test": "forge test --no-match-test \"testIntegration\"", - "zktest": "forge test --no-match-test \"testIntegration\" --zksync --chain 300", + "test": "forge test --no-match-test \"testIntegration\" --no-match-contract \".*Script.*\"", + "zktest": "forge test --no-match-test \"testIntegration\" --no-match-contract \".*Script.*\" --zksync --chain 300", "lint": "solhint 'src/**/*.sol'" }, "dependencies": { diff --git a/packages/contracts/test/EmailAuth.t.sol b/packages/contracts/test/EmailAuth.t.sol index 55bb4845..d4010ff5 100644 --- a/packages/contracts/test/EmailAuth.t.sol +++ b/packages/contracts/test/EmailAuth.t.sol @@ -453,26 +453,28 @@ contract EmailAuthTest is StructHelper { vm.stopPrank(); } - // function testExpectRevertAuthEmailInvalidSizeOfTheSkippedSubjectPrefix() public { - // vm.startPrank(deployer); - // _testInsertSubjectTemplate(); - // EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - // vm.stopPrank(); - - // assertEq( - // emailAuth.usedNullifiers(emailAuthMsg.proof.emailNullifier), - // false - // ); - // assertEq(emailAuth.lastTimestamp(), 0); - - // // Set skipped subject prefix length to 605, it should be less than 605. - // emailAuthMsg.skipedSubjectPrefix = 605; - - // vm.startPrank(deployer); - // vm.expectRevert(bytes("invalid size of the skipped subject prefix")); - // emailAuth.authEmail(emailAuthMsg); - // vm.stopPrank(); - // } + function testExpectRevertAuthEmailInvalidSizeOfTheSkippedCommandPrefix() + public + { + vm.startPrank(deployer); + _testInsertCommandTemplate(); + EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); + vm.stopPrank(); + + assertEq( + emailAuth.usedNullifiers(emailAuthMsg.proof.emailNullifier), + false + ); + assertEq(emailAuth.lastTimestamp(), 0); + + // Set skipped command prefix length to 605, it should be less than 605. + emailAuthMsg.skippedCommandPrefix = 605; + + vm.startPrank(deployer); + vm.expectRevert(bytes("invalid size of the skipped command prefix")); + emailAuth.authEmail(emailAuthMsg); + vm.stopPrank(); + } function testSetTimestampCheckEnabled() public { vm.startPrank(deployer); diff --git a/packages/contracts/test/script/ChangeOwners.t.sol b/packages/contracts/test/script/ChangeOwnersScript.t.sol similarity index 97% rename from packages/contracts/test/script/ChangeOwners.t.sol rename to packages/contracts/test/script/ChangeOwnersScript.t.sol index f9c7b68d..88c3f4e4 100644 --- a/packages/contracts/test/script/ChangeOwners.t.sol +++ b/packages/contracts/test/script/ChangeOwnersScript.t.sol @@ -9,7 +9,7 @@ import {Deploy as Deploy2} from "../../script/DeployForwardDKIMRegistry.s.sol"; import {ChangeOwners} from "../../script/ChangeOwners.s.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -contract ChangeOwnersTest is Test { +contract ChangeOwnersScriptTest is Test { function setUp() public { vm.setEnv( "PRIVATE_KEY", diff --git a/packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistry.t.sol b/packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistryScript.t.sol similarity index 94% rename from packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistry.t.sol rename to packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistryScript.t.sol index 90208497..cfa19156 100644 --- a/packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistry.t.sol +++ b/packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistryScript.t.sol @@ -8,7 +8,7 @@ import {Deploy} from "../../script/DeployCommons.s.sol"; import {ChangeSigner} from "../../script/ChangeSignerInECDSAOwnedDKIMRegistry.s.sol"; import {ECDSAOwnedDKIMRegistry} from "../../src/utils/ECDSAOwnedDKIMRegistry.sol"; -contract ChangeSignerInECDSAOwnedDKIMRegistryTest is Test { +contract ChangeSignerInECDSAOwnedDKIMRegistryScriptTest is Test { function setUp() public { vm.setEnv( "PRIVATE_KEY", diff --git a/packages/contracts/test/script/ChangeSourceInForwardDKIMRegistry.t.sol b/packages/contracts/test/script/ChangeSourceInForwardDKIMRegistryScript.t.sol similarity index 95% rename from packages/contracts/test/script/ChangeSourceInForwardDKIMRegistry.t.sol rename to packages/contracts/test/script/ChangeSourceInForwardDKIMRegistryScript.t.sol index 96b72f0d..0296578f 100644 --- a/packages/contracts/test/script/ChangeSourceInForwardDKIMRegistry.t.sol +++ b/packages/contracts/test/script/ChangeSourceInForwardDKIMRegistryScript.t.sol @@ -9,7 +9,7 @@ import {Deploy as Deploy2} from "../../script/DeployForwardDKIMRegistry.s.sol"; import {ChangeSource} from "../../script/ChangeSourceInForwardDKIMRegistry.s.sol"; import {ForwardDKIMRegistry} from "../../src/utils/ForwardDKIMRegistry.sol"; -contract ChangeSourceInForwardDKIMRegistryTest is Test { +contract ChangeSourceInForwardDKIMRegistryScriptTest is Test { function setUp() public { vm.setEnv( "PRIVATE_KEY", diff --git a/packages/contracts/test/script/DeployCommons.t.sol b/packages/contracts/test/script/DeployCommonsScript.t.sol similarity index 61% rename from packages/contracts/test/script/DeployCommons.t.sol rename to packages/contracts/test/script/DeployCommonsScript.t.sol index c1583881..a6696c66 100644 --- a/packages/contracts/test/script/DeployCommons.t.sol +++ b/packages/contracts/test/script/DeployCommonsScript.t.sol @@ -4,18 +4,15 @@ pragma solidity ^0.8.12; import "forge-std/Test.sol"; import "forge-std/console.sol"; -import { Deploy } from "../../script/DeployCommons.s.sol"; +import {Deploy} from "../../script/DeployCommons.s.sol"; -contract DeployCommonsTest is Test { +contract DeployCommonsScriptTest is Test { function setUp() public { vm.setEnv( - "PRIVATE_KEY", + "PRIVATE_KEY", "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" ); - vm.setEnv( - "SIGNER", - "0x69bec2dd161d6bbcc91ec32aa44d9333ebc864c0" - ); + vm.setEnv("SIGNER", "0x69bec2dd161d6bbcc91ec32aa44d9333ebc864c0"); } function test_run() public { diff --git a/packages/contracts/test/script/DeployRecoveryController.t.sol b/packages/contracts/test/script/DeployRecoveryControllerScript.t.sol similarity index 64% rename from packages/contracts/test/script/DeployRecoveryController.t.sol rename to packages/contracts/test/script/DeployRecoveryControllerScript.t.sol index 770f5634..00fbbe67 100644 --- a/packages/contracts/test/script/DeployRecoveryController.t.sol +++ b/packages/contracts/test/script/DeployRecoveryControllerScript.t.sol @@ -7,7 +7,7 @@ import "forge-std/console.sol"; import {Deploy} from "../../script/DeployRecoveryController.s.sol"; import "../helpers/StructHelper.sol"; -contract DeployRecoveryControllerTest is Test { +contract DeployRecoveryControllerScriptTest is Test { function setUp() public { vm.setEnv( "PRIVATE_KEY", @@ -37,16 +37,4 @@ contract DeployRecoveryControllerTest is Test { "SIMPLE_WALLET is not set" ); } - - // TODO: Comment out this test case because removing environment variables will affect other tests - // If you want to run this test case, please run `forge test --match-test testFail_run_no_signer`. It works. - // function testFail_run_no_signer() public { - // // Remove DKIM and SIGNER from the environment variables - // vm.setEnv("DKIM", vm.toString(address(0))); - // vm.setEnv("SIGNER", vm.toString(address(0))); - - // Deploy deploy = new Deploy(); - // deploy.run(); - // require(vm.envAddress("DKIM") != address(0), "DKIM is not set"); - // } } diff --git a/packages/contracts/test/script/DeploySimpleWallet.t.sol b/packages/contracts/test/script/DeploySimpleWalletScript.t.sol similarity index 63% rename from packages/contracts/test/script/DeploySimpleWallet.t.sol rename to packages/contracts/test/script/DeploySimpleWalletScript.t.sol index 6bf3b052..83219407 100644 --- a/packages/contracts/test/script/DeploySimpleWallet.t.sol +++ b/packages/contracts/test/script/DeploySimpleWalletScript.t.sol @@ -4,37 +4,22 @@ pragma solidity ^0.8.12; import "forge-std/Test.sol"; import "forge-std/console.sol"; -import { Deploy } from "../../script/DeployCommons.s.sol"; +import {Deploy} from "../../script/DeployCommons.s.sol"; import "../helpers/StructHelper.sol"; -contract DeploySimpleWalletTest is StructHelper { +contract DeploySimpleWalletScriptTest is StructHelper { function setUp() public override { super.setUp(); vm.setEnv( - "PRIVATE_KEY", + "PRIVATE_KEY", "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" ); - vm.setEnv( - "SIGNER", - "0x69bec2dd161d6bbcc91ec32aa44d9333ebc864c0" - ); - - vm.setEnv( - "DKIM", - vm.toString(address(dkim)) - ); - vm.setEnv( - "VERIFIER", - vm.toString(address(verifier)) - ); - vm.setEnv( - "EMAIL_AUTH_IMPL", - vm.toString(address(emailAuth)) - ); - vm.setEnv( - "SIMPLE_WALLET_IMPL", - vm.toString(address(simpleWalletImpl)) - ); + vm.setEnv("SIGNER", "0x69bec2dd161d6bbcc91ec32aa44d9333ebc864c0"); + + vm.setEnv("DKIM", vm.toString(address(dkim))); + vm.setEnv("VERIFIER", vm.toString(address(verifier))); + vm.setEnv("EMAIL_AUTH_IMPL", vm.toString(address(emailAuth))); + vm.setEnv("SIMPLE_WALLET_IMPL", vm.toString(address(simpleWalletImpl))); } function test_run() public { diff --git a/packages/contracts/test/script/RenounceOwners.t.sol b/packages/contracts/test/script/RenounceOwnersScript.t.sol similarity index 96% rename from packages/contracts/test/script/RenounceOwners.t.sol rename to packages/contracts/test/script/RenounceOwnersScript.t.sol index 732169b8..cb0bbf0e 100644 --- a/packages/contracts/test/script/RenounceOwners.t.sol +++ b/packages/contracts/test/script/RenounceOwnersScript.t.sol @@ -9,7 +9,7 @@ import {Deploy as Deploy2} from "../../script/DeployForwardDKIMRegistry.s.sol"; import {RenounceOwners} from "../../script/RenounceOwners.s.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -contract RenounceOwnersTest is Test { +contract RenounceOwnersScriptTest is Test { function setUp() public { vm.setEnv( "PRIVATE_KEY", diff --git a/packages/contracts/test/script/Upgrades.t.sol b/packages/contracts/test/script/UpgradesScript.t.sol similarity index 98% rename from packages/contracts/test/script/Upgrades.t.sol rename to packages/contracts/test/script/UpgradesScript.t.sol index fe74bfbe..023bdc33 100644 --- a/packages/contracts/test/script/Upgrades.t.sol +++ b/packages/contracts/test/script/UpgradesScript.t.sol @@ -10,7 +10,7 @@ import {Upgrades} from "../../script/Upgrades.s.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; -contract UpgradesTest is Test { +contract UpgradesScriptTest is Test { uint256 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; From 8532cea8af408a7d3f5c888c4379949439e5b203 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Tue, 10 Sep 2024 23:21:50 +0900 Subject: [PATCH 047/121] Update verifier and proving key --- packages/contracts/README.md | 2 +- .../contracts/src/utils/Groth16Verifier.sol | 148 +++++++++--------- packages/contracts/test/Integration.t.sol | 6 +- .../contracts/test/emails/8453/accept.eml | 104 ++++++------ .../contracts/test/emails/8453/recovery.eml | 104 ++++++------ packages/prover/Dockerfile | 2 +- packages/prover/local_setup.sh | 2 +- packages/prover/modal_server.py | 2 +- 8 files changed, 185 insertions(+), 185 deletions(-) diff --git a/packages/contracts/README.md b/packages/contracts/README.md index 406c6006..742ceaff 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -25,7 +25,7 @@ $ yarn test Run integration tests Before running integration tests, you need to make a `packages/contracts/test/build_integration` directory, download the zip file from the following link, and place its unzipped directory under that directory. -https://drive.google.com/file/d/1Ybtxe1TCVUtHzCPUs9cuZAGbM-MVwigE/view?usp=drive_link +https://drive.google.com/file/d/1XDPFIL5YK8JzLGoTjmHLXO9zMDjSQcJH/view?usp=sharing Then, move `email_auth.zkey` and `email_auth.wasm` in the unzipped directory `params` to `build_integration`. diff --git a/packages/contracts/src/utils/Groth16Verifier.sol b/packages/contracts/src/utils/Groth16Verifier.sol index 990bf1ac..ef38a3b4 100644 --- a/packages/contracts/src/utils/Groth16Verifier.sol +++ b/packages/contracts/src/utils/Groth16Verifier.sol @@ -50,188 +50,188 @@ contract Groth16Verifier { uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; uint256 constant deltax1 = - 520994677997493400810773541476499788644902082984396453075685762761831850120; + 10433082117781289465772979793225448958552973147056379387107424694719430078183; uint256 constant deltax2 = - 10213897956116323293360574495863850733565743032313310303301962890191828600579; + 7275826864108750902980191877201544327099639445097295071715716197584022501217; uint256 constant deltay1 = - 7932164237875706492467150825847531456461165832347520966415283522471937964900; + 12045503589921692978672400276439014666986009309508030338062238114576580523348; uint256 constant deltay2 = - 13933167949481980812622491915190180689983098052228504440538951968850456401091; + 5167266045144281780726036397587954855586209241615262341293096620571928275241; uint256 constant IC0x = - 5535234085311902579901349478459196637795058221120958134445592343488246156733; + 14420976692606365609454257135434328632805959473973286981673284088060119898838; uint256 constant IC0y = - 5306640240432430234979242614873688760288740315547161616274789884917660992367; + 3237727173942946479267676846429217525953135300179916547171195052204761246016; uint256 constant IC1x = - 10707387490009252629078273089029959904307706408726467155680696001386854048915; + 11242243116165410418833602736488883618535128769898487771024836696023857465078; uint256 constant IC1y = - 17653533518649258839749460334216534095963029303372459441511113120126665109653; + 3944125875514495469428761178435611665072101970023736373804875966482548972424; uint256 constant IC2x = - 20865571486499188594003814476515099918525806346210086833881258772408663191533; + 13444687970779241874983655345748698054742845164432935489947273666155122460289; uint256 constant IC2y = - 7888240421702647837386220931474009495401756148617371230939296514314837098271; + 21224652167029042637908968340315123408212528634456523234010312093840631034658; uint256 constant IC3x = - 1912978194609077207430131695891867170745002253126750956906023142956794841865; + 6223278095306548402665889948737566703639314941454342116499455309193776009394; uint256 constant IC3y = - 17615941814906629303790964184866269246906472609406726939478790210268313990051; + 3166189940732838088289487889047362887677679902266639433494062252267843006033; uint256 constant IC4x = - 15066418251539359853074143581365946179824576559935306245174822608350324474776; + 10816631512908557343349023271022520591434729012608504881463056258162562470478; uint256 constant IC4y = - 3268372113574542796802111569975146953310662150883456386537997506424333670939; + 7553268499036051315278338406042049999218595304176271777756017758867657854668; uint256 constant IC5x = - 16726903819494555062907147643613770035747444680904544904305313872617709937814; + 4071416866028362268560008820862586961030580397814903526444213717756336978375; uint256 constant IC5y = - 17101225626470597533777593163737774333478931604126018373298094394038436070638; + 5882120478213084184478310869582676016227773303131677302373100370040076790180; uint256 constant IC6x = - 20641928936490067347238549514729636898746687294162031430805590421560903783440; + 11734717795004643123638327357128685172014034657612399074715429226722658631266; uint256 constant IC6y = - 67121451455228913817899520547955848577485738949760740559721896890970176103; + 16373602507399860749002874686406539840487965214428380629195095307329304471831; uint256 constant IC7x = - 14545357897180104829942737321629647336974601349904876305377785895976088498628; + 17995242574665353969882544970809346971980578867255316834879417403787422177779; uint256 constant IC7y = - 16314295394308016823245804523460668622871621620058982289202172672703214642909; + 19598869527810550137301357794896707958610742032745888008070796990675647167438; uint256 constant IC8x = - 21739153088746313904366793933727782582174946747904879487285317254557443015329; + 15333007330168660247285804146177263702283991094081656975888675677742499858801; uint256 constant IC8y = - 3132175803297520185172383705548796916566539464602625887509031362173771022843; + 3622983327849337081794030911901750861761088652919413360963959440884276356515; uint256 constant IC9x = - 20333233803298528081912583132659619517672056679176472634300802350468027326361; + 14592598453216971911118910753077725013203270532742585163748407745719533451518; uint256 constant IC9y = - 6238837794343377502421946404928002513039151091738403488064287245988205748593; + 1732486974024268892903158999835737802052796658580804609834621732126532847367; uint256 constant IC10x = - 16418874123357333544592669082833232850459535832174384729993255430764462500486; + 9608760299311764957965020896382267062379773438090355782074251684342995171221; uint256 constant IC10y = - 21771971202968985066744191573424980335377073332855742387685123535002522571529; + 18768971212393705710205169899071271227246850342771830091251994505002517649543; uint256 constant IC11x = - 19451975215864606845692411747435064359921385769371233821650301822958164252383; + 18229713854414772793917571039862241859243290635273907596834836608693704592373; uint256 constant IC11y = - 20892514595722901078388943250566322962503399436888984708776669059327181439790; + 1354957943711196195900175201625492118583365814055323140317564226352214552501; uint256 constant IC12x = - 7890932830092388862341624941690789312256479754725115142819338325966740669428; + 4540048316384448988784022044695474025704244408393204872837050282034324974955; uint256 constant IC12y = - 4418832493543398820840947134519317894746836913806654901909239755962388809991; + 12889131931011399139025112922332330923524276708703486137710524916145921772003; uint256 constant IC13x = - 8199473712814016100135467002253188985688335051507321176911775440880532334952; + 10260170402680733092165416374102715050316461777911507389592209476741076666114; uint256 constant IC13y = - 15997818842062211202600134971063758566999644777722172606469491329666812258276; + 10621497058496187206533851857372855187411269122792661496327887622312773096373; uint256 constant IC14x = - 12137522381148387733238329761055359894311504591070198713455315089652636842402; + 4211461709999443083034879779565627271437397337531026812125070026750873693080; uint256 constant IC14y = - 21339188004338495042416918774038965889032101950904198621697204175535425843091; + 18467608266766262084409632308104903215532489446465294776664019514313833622275; uint256 constant IC15x = - 20499263784776697905943622542054972660913496529317877469532325036659142860841; + 9139115676316577941242771581653053080955401927531325123468615971408706509241; uint256 constant IC15y = - 11428736355199483131940447330380125032711949052439215155046658645463458617674; + 9164313109700564988896172664560830764060639180869132590006516315434795315437; uint256 constant IC16x = - 5754299204496299424940297228286983528858894010778459654161035126221861884425; + 8055062813885465561166049536110231123741745748861232693686007271655092618041; uint256 constant IC16y = - 184143361306450555375946116665530361251584344793605929804900169497536069657; + 4510221627106525233912238941858162972422084397106560474450183916928061274103; uint256 constant IC17x = - 6863685095405518858940222663610976520118803865048723755871419028593531099958; + 1507186560667512546403688953670998250315628457214357234952217475451563331987; uint256 constant IC17y = - 18102099448859799403953336894017457656590279241400870825068223761138751757204; + 17071593518480573061174595519667499531902707878706006270613337175041459137032; uint256 constant IC18x = - 11617180898926442769507234462139371394680677212983320064407531026440672878535; + 16762847668396014973033660303062581513242379616013803571550493698889447450812; uint256 constant IC18y = - 4231987035195694511291113860396316866846277265956849978459149363401736899419; + 17006420456782153650908127824637694821957086423954188936477697337268237314792; uint256 constant IC19x = - 6338405922510297847509581085618085787266710988385331069423772530751893351108; + 17577663376594144399743129857840103856635877754916782842519048073412103543225; uint256 constant IC19y = - 2369188132617549234166848605509335807620667833570812871717711881712251941471; + 21284834289036339572765424015780927653463792202070493220185327060720557536153; uint256 constant IC20x = - 6534724304493884898998457959752744402731711456639277994605971968266824841921; + 16974417587802350668283436092050410822135612040525093207677793563266434898899; uint256 constant IC20y = - 3616930696544290755224333216672259977980824937811778199173736509869170686624; + 10577911945362631640255946262746706583221370481437827188366150551549490701563; uint256 constant IC21x = - 18296109485859597664201013922077450611537275721380521453297622562810889903055; + 7648089745961110787060572088126537400868566614244157722652493282774570897306; uint256 constant IC21y = - 3895545879384074505865915948837152152498358964611960941429309095904181030693; + 5771535376772212949945259105932244016275600714895136777592719710059589930578; uint256 constant IC22x = - 12343813894528681582898501974195928908758133920463632788058140152731464749914; + 14921736432665742630629608167623006910311804948046840596497195761330490353359; uint256 constant IC22y = - 21505758529614139837798769683411075306857597005036383220173003789253857347751; + 14215720104074512767679668828223147475518903442603114867950535356580700634265; uint256 constant IC23x = - 16230461810715823239242025482008567032302510218301798998030587563164759203923; + 14807951812496054917199644721274028450973199590549199626326743360499724939100; uint256 constant IC23y = - 1994949152609869198152052650904921912838643069265165983919780834335733459441; + 13396573693115293914922022639761946049996991749562789764893885956377368829023; uint256 constant IC24x = - 373995982353912590050571385234870501485812926774804412495284185340492728591; + 946959077341401468258673477010661575493350299894729588837485560993685482032; uint256 constant IC24y = - 4424414072575513799911234230042788376840811362954861538886070866583770853757; + 20570356357018532028601279688731350534146086904670254722628961938492868330345; uint256 constant IC25x = - 73053181031153871276946499443822334078747902352960726679539712950424139587; + 2148991523060877253038248533639729462350984432768284099241119419519252893539; uint256 constant IC25y = - 1540570167066699022838327597833448980761202822749917678465275227142577692420; + 19770588615554020041636512722294181393662192009340177424932751009199907422519; uint256 constant IC26x = - 19743666564083954842724375605301868007217803605683850153936265256536005058028; + 3747878854274778152623809873153099102641291773237420658483003597255752380852; uint256 constant IC26y = - 17989815625617579036436769970865806048561975460718195347202285390279820435349; + 9101065225212227091551571514843375002653632703977216400939979268283954265300; uint256 constant IC27x = - 8021544724659208314956854536191758170410161794829262652377062879718582077619; + 21031066699877095106651494566013301499428447799745230410837452349553101774320; uint256 constant IC27y = - 11242343205078067027061957056593092382351538151124811098324850161004134673555; + 16064211054461593402319195858630318172586733205260338032143803066661211213772; uint256 constant IC28x = - 3078234746564587714000443808454353377587938001919200323959521327347201776344; + 7134851187269606902216669356694699867879169670464902433281001074684321873924; uint256 constant IC28y = - 2745006783235117142840024866060647109576786923760899534870847030757937709480; + 8200092285454074110879487215112662564626493123135666536713788988496182625169; uint256 constant IC29x = - 5964844476592478242407630507799027172948004079052748175556332403023505609276; + 16783075251656600287266260045074464061567969583063942600473764372418413016777; uint256 constant IC29y = - 12768841436519508981792953013446512028720534352691237119399120037998541137224; + 16335574261246374092454229631189633336308135807569085967237651070836039968818; uint256 constant IC30x = - 15371609663317589294806761513526368989695520686639615266578243336031459611909; + 18767147382384409410413363730064028585638124996514027800481404559552256526; uint256 constant IC30y = - 16994646314587748959724789317702812017993403087486552388242926535433658915883; + 5893729199256651364790555780931353184898130539524140758522955719432990189455; uint256 constant IC31x = - 6683739596768676873248624858087923536398042926812221220245863544486923422711; + 16673100255008534170974248428282891797220989026129402665363975376767488775417; uint256 constant IC31y = - 12457051898274801033654726559510059327583138828424088437950360209133530872938; + 11242595605003176651284733632654591951414346866379786815099235732235467678271; uint256 constant IC32x = - 12960094561130886505165854876806731618571707898820633243029947918452735526807; + 14304354639208062657751514661745433699866474083874289024775056731428339652996; uint256 constant IC32y = - 6820833146511263887962056926524443259150994889983748875463240028627107473405; + 21067499116906247821838563471313426612497479641552212451088084053907374443686; uint256 constant IC33x = - 996044632338712992107340240713239518089208404641712342335139731510181571935; + 14695351664477545562934225515932933391739717812930861530027307263509227127839; uint256 constant IC33y = - 273204942495896233059800495345764298864994985906625498267135262620807809339; + 13797285223976228908447726624003414144346497900738839904003106351418953773996; uint256 constant IC34x = - 1813777432174456228797740790983800618055554859202869474902366329763076454717; + 16696383166685664550749463360579321447259768183797789828152025370318762267913; uint256 constant IC34y = - 18263062241351175416183473322099225631153099284041729083414647404711496873274; + 5539498916849826447504399176766255291145081992895211478547376199843753155197; // Memory data uint16 constant pVk = 0; diff --git a/packages/contracts/test/Integration.t.sol b/packages/contracts/test/Integration.t.sol index 007c1623..bc463d34 100644 --- a/packages/contracts/test/Integration.t.sol +++ b/packages/contracts/test/Integration.t.sol @@ -146,7 +146,7 @@ contract IntegrationTest is Test { console.log("SimpleWallet is at ", address(simpleWallet)); assertEq( address(simpleWallet), - 0xeb8E21A363Dce22ff6057dEEF7c074062037F571 + 0xf22ECf2028fe74129dB8e8946b56bef0cD8Ecd5E ); address simpleWalletOwner = simpleWallet.owner(); @@ -181,7 +181,7 @@ contract IntegrationTest is Test { emailProof.publicKeyHash = bytes32(vm.parseUint(pubSignals[9])); emailProof.timestamp = vm.parseUint(pubSignals[11]); emailProof - .maskedCommand = "Accept guardian request for 0xeb8E21A363Dce22ff6057dEEF7c074062037F571"; + .maskedCommand = "Accept guardian request for 0xf22ECf2028fe74129dB8e8946b56bef0cD8Ecd5E"; emailProof.emailNullifier = bytes32(vm.parseUint(pubSignals[10])); emailProof.accountSalt = bytes32(vm.parseUint(pubSignals[32])); accountSalt = emailProof.accountSalt; @@ -262,7 +262,7 @@ contract IntegrationTest is Test { // 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 is account 9 emailProof - .maskedCommand = "Set the new signer of 0xeb8E21A363Dce22ff6057dEEF7c074062037F571 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; + .maskedCommand = "Set the new signer of 0xf22ECf2028fe74129dB8e8946b56bef0cD8Ecd5E to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; emailProof.emailNullifier = bytes32(vm.parseUint(pubSignals[10])); emailProof.accountSalt = bytes32(vm.parseUint(pubSignals[32])); diff --git a/packages/contracts/test/emails/8453/accept.eml b/packages/contracts/test/emails/8453/accept.eml index d0999703..ff7fc182 100644 --- a/packages/contracts/test/emails/8453/accept.eml +++ b/packages/contracts/test/emails/8453/accept.eml @@ -1,86 +1,86 @@ Delivered-To: suegamisora@gmail.com -Received: by 2002:a05:7011:c08e:b0:3e7:b7d5:224d with SMTP id jk14csp176375mdc; - Fri, 6 Sep 2024 06:22:18 -0700 (PDT) -X-Received: by 2002:a05:6a21:e8c:b0:1ce:d125:f8ef with SMTP id adf61e73a8af0-1ced125fa1dmr22928965637.51.1725628938102; - Fri, 06 Sep 2024 06:22:18 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725628938; cv=none; +Received: by 2002:a05:7010:8c26:b0:403:8332:eb9c with SMTP id gq38csp1724905mdb; + Tue, 10 Sep 2024 07:09:58 -0700 (PDT) +X-Received: by 2002:a05:6300:42:b0:1cf:42bf:6af1 with SMTP id adf61e73a8af0-1cf5e051643mr1238931637.2.1725977398587; + Tue, 10 Sep 2024 07:09:58 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725977398; cv=none; d=google.com; s=arc-20160816; - b=C0Uiaaz8s45V/DXrIf+eFa4AWhHTg5mCaWt9mHGH2ha/Mf9T3mOjAfXQupd3v9o4uZ - nM//fJTtwnrJqSJyy2A9gFRBB/MoT5hglqI8eaQWtb1uXeeXyEBT9JH3N24nN6YO03e4 - Bn+ZI2Z+yLKrQL6Dh6Qswk8FSylsNTIbyKwXof/UorI/izBx20713GSa30Bus45Dm3nn - GqcqjJ5M6JHbfd4qvAZbjNV8DmbFkJ8+qWRuLN44Pd28B4iy3ItexEuM9vRYjeCLhpoG - 3voeOq9PZnAEuDonth7nYHkPWXXGCInenlCpmfetxWa7iKmjiSTn3MkeV9wqI/1e/i8j - ztvw== + b=h51zfKeIkjKkNUI7VK2C5oPZzRKSQa9XCcDF2ms/6wvtRpe6/bTOK7VgTKtw/9VZkl + ksmUkZHECkjiGeS87dEVbwE3xmPA+RRL0Xnzcb2OldZu/Qia0/Eeo+55DnSbIL1W8xuY + d9UvnInusZRZtkL8WCtaeQsMnc8xbL2V47J7L+CSnus4mHelRAq65xUhzD3gbeC5MnC9 + WT7/clwYPnBGEf1+giGujnFpYL1ipT8v7JO5g3usTISAzTlVFdoFZG5TbSZzxrYeMhAL + Q5PgB1ij6+9R5I3pWkw1kyVjQ2u6D1E/WCPbSx7DOX56Nj/mFqZn3epWtdhtjitVsiAb + Hm0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=subject:to:from:mime-version:date:message-id:dkim-signature; - bh=U/hETzVqi/RggWbN6N7AaudJ+V7s62JjqcrItueD+SE=; + bh=UtwrridezOg1yynyK4xAGQzZRbhS0kPTHkNHUnvvunw=; fh=r9ZW45D/4i7BIl/4UeFGrkYKwbplztqhOVKfbV+WD3I=; - b=RTSYWdGdudJMP0NxrGFgLGVbFLNFjIEL4VPVdyD4hU7Kg25XSPOwMusUrVZLZj1Ci2 - hGyjpt2BlLveWpZCfbgTFr+8HfktTW+sGeyyRD6KaF7sLsxHBowYgyXGKZEz+ivdJtpK - +nXCHVDc3WvWkrsJNk/9JPS/AMusv8ur5gYBwC9e7zxrozaHiuPO9OPU2iGMT8ZJ2T02 - p/HABL627ar6r2jZxYWCXwyidYvhvz6e9NphTM5GMXtKixOH0+qMFXq0TmRdFZtnzOKF - L93aSnigdJIGAuNEIFKqb8C1HFsZhv2mQx4UdFE9Duar/tdJ8R4itvBVC6hH9tEq2cnc - Xd0w==; + b=D3gxw/xgOKa6ZyN6wxlayhqA4WgBobKrSXyDhhtGlHOPND01KGxNwODR5vc2pnKIVk + 7l5wi3l50XN9JufwPXsbybIq4iBWRWO0/RthBkm6hCZO+adAkojP8+sVbOE/Ko46DSkQ + NZzgI0Hk8w/q6mefk8h96SwMN66ZN9Igi+3LKO3Ls9l/h3p/BRblyvNNFLbAtRzszRbw + cMQyNlwV0ChYtXbzPDTLWcYJvF9CODHiLu4r9mQMta09CPAQrpmjd+yHTXdky8/MeT1f + X9VhoGfl8HyI1yGd9P/dfQsCGDhhKPJtr6rV3EtkRywFZHhfKni4aDMpv4ORBFI7GRz2 + I8eg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=Zn5YD8bw; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=GPNlST0X; spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id d2e1a72fcca58-718816aabbasor1473227b3a.5.2024.09.06.06.22.17 + by mx.google.com with SMTPS id 98e67ed59e1d1-2db05482b66sor2447718a91.3.2024.09.10.07.09.58 for (Google Transport Security); - Fri, 06 Sep 2024 06:22:18 -0700 (PDT) + Tue, 10 Sep 2024 07:09:58 -0700 (PDT) Received-SPF: pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=Zn5YD8bw; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=GPNlST0X; spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725628937; x=1726233737; dara=google.com; + d=gmail.com; s=20230601; t=1725977398; x=1726582198; dara=google.com; h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=U/hETzVqi/RggWbN6N7AaudJ+V7s62JjqcrItueD+SE=; - b=Zn5YD8bwElKAckg4neNi2kXp1b3X7smPAWqq/Oq1xUlLjJpQtb9SE/3wF1X68Rm8Lf - hf5A3ELJ8nPRugtVtSRCSuMf4o8ULe65HNotlQbtsc0INdDXNBlWJNDnDwqbu+27t0uJ - y8sLbEuqgGF4TNnQJZMJ8vUJZ8qVoh0UXOa6ZWQjqmndohpwxNlTJ41hPKfeOw181GqT - Nq4Am6ag4IlZk7lsgAaWvULEbkAsMoQjk4kYX66WuafTbPjQGQ9il/+aPytPWrRX2/eW - gbgyHpCOV9qMovdPAx3NBWWHzW+6XRHdpt2jPLJR0BUIeQHFMaKg3rcguyzETk9qc2Ah - 4MRQ== + bh=UtwrridezOg1yynyK4xAGQzZRbhS0kPTHkNHUnvvunw=; + b=GPNlST0XPhYtAxuIP4oxTBILT9oe9jB7We3E3lMtv5LAHlty9DNpF+5jd9qbtsZ0/S + D3rxoRxKIELfXFnUzz+5sLWjT4Bt5yEW2foA4XPtOfRwuRncLQ1ULqyMPBTDjimqWoZ/ + rwiihBA3jub855tmcl3aeY3ACyoEh3puEf/kd20x6R7Hdku4P4VkJ5TGYDsyDBpvWG/q + 6ilMJvw2Nj89RgKQP7MTXwHsUjqUNFr6TTaC4/XcUALzaIkYBjdNr9qazVdJ+N1YOJvk + qlvzHkSakvX2kOY/Pa2goDmx+g2LdtOU7v/88CEu/RKOwPtmSBlM/ZJgc/GsJ6LhhZi2 + jXIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725628937; x=1726233737; + d=1e100.net; s=20230601; t=1725977398; x=1726582198; h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=U/hETzVqi/RggWbN6N7AaudJ+V7s62JjqcrItueD+SE=; - b=G6GBE4hN7llTSkiuOBoxhrEngL5wkI4ueW8jdPaDU95H0oZTDM6JLAXnRQImvhtU0w - slkuBX/GeRu8S13I0zb+OoatYgIIKelJc4A2KlT/P4gL+4jIJ6AqKpJJRKLuHyXk/JOH - U5X7HYOff95ZgjNhKU5fGt4hGxmrsFT6YbD4+EqkyOSCqIGcsDK3IuiwY+3pKWJoqGJv - UHuMmHTnttx0bByfrxyEMsSoBtokafkxVyBTeB3pm2/ROEbBf1DbfnQUrkVKaZea49tU - q8XOL8iGQHa2ryJQEIe75FtX80rtIYSrx+fmVuSmkTU/qEzOXyERWsaRovKw2hTyF1+m - i3iQ== -X-Gm-Message-State: AOJu0Yx3lbc0RipKC+OMeuNv8FIPDUwGpfPoIeB6Vr1arRKhB8A4F2M9 - 1MaG/v5US/X9/i66lFjWmRHFRPzh6UPt2UxSj5mvLwuYkGQrmYJEpQS3pg== -X-Google-Smtp-Source: AGHT+IHOoL6WU+9j0Nj9M5rytPIYrSUIFFYhKdyafbbrZrRUrbeYMT+b4sNoZe4+99M+t90YuA2pCw== -X-Received: by 2002:a05:6a20:d80b:b0:1ca:ccd0:1bf6 with SMTP id adf61e73a8af0-1cce0ffe3cemr28636292637.8.1725628937058; - Fri, 06 Sep 2024 06:22:17 -0700 (PDT) + bh=UtwrridezOg1yynyK4xAGQzZRbhS0kPTHkNHUnvvunw=; + b=bfb4wno6nAIfNU6Rr6/z4Q7sv6tqZMp2zBDR07DOtOTt8jeTmG31s9E7rfoYSZ94wt + mLcywAx9Cpa7jIb1PkNRGA2iJfxIB39sJU+Dmzg4xWTdUXWw3xS7AoRi5XvjmK9LCr4x + KXAt4OQQuNbts32ff45pvEsTw8/+VpljzNO0T25YfRnqmw6hTOHMP/NHFCA3UaM68bGP + tj6lVS+S+lbTn4DM4sI+O/1HfsmaLxG3t/h2+eYdjrDfRk8e9Y7pdq3WJyxGQVUxZXO8 + eEij6zmCApYta4dUlIubZRtj2z5qFzlHa8BjbUAxhehnMY6j0+gJSgXG06JuAR9B1oJQ + o1Lg== +X-Gm-Message-State: AOJu0YzOt9pHATxf9YFjGfzeI2fVHvdndEweZehQmNor0nTdEyoShAMi + BezzDgcpg0ecebGZhm8i3aSpX9jjyL+oyFHbqDUAOR9+ElScpUxDtjpT+g== +X-Google-Smtp-Source: AGHT+IGVehh8pageNW1PD8gAei8Gzq7aSvFjbZPUmxgtr0EXR/M0KwwGNeQk9HwE0ClARs5j+xryeA== +X-Received: by 2002:a17:90b:3d89:b0:2cf:2bf6:b030 with SMTP id 98e67ed59e1d1-2dad51348b6mr10003137a91.33.1725977397587; + Tue, 10 Sep 2024 07:09:57 -0700 (PDT) Return-Path: Received: from SoraMacBook-4.local ([86.48.13.220]) - by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-718295770a4sm1560089b3a.214.2024.09.06.06.22.15 + by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2db0419d202sm6478512a91.16.2024.09.10.07.09.56 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Fri, 06 Sep 2024 06:22:16 -0700 (PDT) -Message-ID: <66db0208.050a0220.1a717f.5b19@mx.google.com> -Date: Fri, 06 Sep 2024 06:22:16 -0700 (PDT) -Content-Type: multipart/alternative; boundary="===============8229076081096717965==" + Tue, 10 Sep 2024 07:09:57 -0700 (PDT) +Message-ID: <66e05335.170a0220.221d7f.3fb0@mx.google.com> +Date: Tue, 10 Sep 2024 07:09:57 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============6570435142598105272==" MIME-Version: 1.0 From: emaiwallet.alice@gmail.com To: suegamisora@gmail.com Subject: Email Account Recovery Test1 ---===============8229076081096717965== +--===============6570435142598105272== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable @@ -92,11 +92,11 @@ Content-Type: text/html; charset=utf-8

Hello!

This is a test email with a basic HTML body.

-
Accept guardian request for 0x0C06688e61C06466E= -2a5C6fE4E15c359260a33f3 Code 1162ebff40918afe5305e68396f0283eb675901d0387f9= +
Accept guardian request for 0xf22ECf2028fe74129= +dB8e8946b56bef0cD8Ecd5E Code 1162ebff40918afe5305e68396f0283eb675901d0387f9= 7d21928d423aaa0b54
=20 ---===============8229076081096717965==-- +--===============6570435142598105272==-- diff --git a/packages/contracts/test/emails/8453/recovery.eml b/packages/contracts/test/emails/8453/recovery.eml index b192a23f..b21a41bf 100644 --- a/packages/contracts/test/emails/8453/recovery.eml +++ b/packages/contracts/test/emails/8453/recovery.eml @@ -1,86 +1,86 @@ Delivered-To: suegamisora@gmail.com -Received: by 2002:a05:7011:c08e:b0:3e7:b7d5:224d with SMTP id jk14csp271764mdc; - Fri, 6 Sep 2024 08:50:39 -0700 (PDT) -X-Received: by 2002:a17:903:32cf:b0:205:68a4:b2d9 with SMTP id d9443c01a7336-206f05afdffmr38516325ad.48.1725637839417; - Fri, 06 Sep 2024 08:50:39 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725637839; cv=none; +Received: by 2002:a05:7010:8c26:b0:403:8332:eb9c with SMTP id gq38csp1725181mdb; + Tue, 10 Sep 2024 07:10:18 -0700 (PDT) +X-Received: by 2002:a05:6a21:4581:b0:1cf:4483:18cf with SMTP id adf61e73a8af0-1cf5e032211mr1253128637.9.1725977418263; + Tue, 10 Sep 2024 07:10:18 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725977418; cv=none; d=google.com; s=arc-20160816; - b=swnmCCO5fnfNvudit2Hp8Be43saZpYn8oi7H0GNNVB5PqC8YSj2xleA/Pf59nU09lv - 7rDjCoHHeAhJlOtMJicYVv5q6EgBefmVQIpeUfMAQKYGHJjLgy/1rudbeSYF0HoBohJt - q7xboOzgfAftztF3oqtYxmKtT4qTfCARDLWXc3w/dRY+45a+/rYGFXvow54XvFaQV/zo - qT19dc9jytkoROUp8tSnJ55PA5qI2RSR74bBuG74HCG9FsGJGzSudJusFa3CEoi1VBh+ - JxNn2/Pt/3erStuTPK7mRMMBV/FXJ/fPEkY541QFZs/pcwYcrCab/5jkk3yIrifaGnnu - /ZpQ== + b=zroQS7O/wy+4Xq65GFlkeS32J3ad9s5Rtn1ZZHHTIqht72Bt7nzQmCmD/MC6fcun0+ + ha/N5a09FR3yL/moVEwHvgoNL5GF4Jl6SQHtGb/XfJS+RLKDHGrmP4nSnqhm7IV1JA63 + TDQJqZMflQM4+J3/rqiSDnac1GT/0+cZeJqkhzcJ16E3MMjx9OMgwOVloJ/pKmUX5AzB + CW2YyV0f2dFTCMbSucVouQ7QORILBzdzQJbFKQxsuI+B0xfiJoBdWNfHz49pFfEFZ9H8 + Lae0UDJWRCu8PXUn8mNVGb9QAC66/mWnGQQWOVvQLn8vTBeVIPXDQtZLtNO40CF15sKO + H4sQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=subject:to:from:mime-version:date:message-id:dkim-signature; - bh=r7rF/jG1IIgCj5l2v1qn74V4v31Wj5mEk1ZeR+AbNFM=; + bh=DmuuCSkWIuDD9dHgMJvud0Des6CJSRGWEXWicibZGr0=; fh=r9ZW45D/4i7BIl/4UeFGrkYKwbplztqhOVKfbV+WD3I=; - b=O2BjkV3K6AsqDUL1M+z2g2jZxwZHFDn0VR2ocFHjf2dSGTxaWyJJrF4F1J6Ivn0xqu - 6wfXVj2vlm5SqvyJA5zySLuN/fMhqnNwWTtNC07JHVfWIQOurGVD6ADXb02wT3UrdRsX - Gi5Hnx7VWkVTN6tpnv9xUjQMGAcmz9OF2axehZBqYZiyVss31tDWucKgP3e4/zAd2KH3 - ohjL81q8uCWeQqteH87rdDapZpvvuTwddZ0wJIrXeru4qkkNYzf6kcQ3UiQnfpH8yjTA - P1b7JdnX2dZzok/UR10vrTt0Guw7GsesbiUF2TjffIkYl6NLGDy7VTR/nSwTEW34Ipu6 - UURQ==; + b=aQ7Y64foZ4iSgxa9/w3hCljESalXAl3JRQulhCEXVJAjBBEP55HXyl/AcPtT6V0M/H + gfLG8IIThWWfS0SeI5JUPunWO08UBfqNi7z3BfA89pIuTQFpuLHt6diB4twd9H3weyrF + raNsYoD9+UH2dXvh4UsOPRaQsLhvzuKipwVxjc513AMrSjZKREscvcS/2QJcY1Sc3HaZ + JhzCEHFlMyK06VrjHDeaqDVwDN0YY2ELFnTHvM0Ufy7JRa69yGVUXB53nneVTc5tU7iA + vMkVRxHeflLwMQyjbgty7tT12L4OU4jVGafrXUQmzf6ZLY1QZYPnWsl64HFZ9k/JhdHr + sdCA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=Y9Hw3mvz; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=ZauiTwkO; spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id d9443c01a7336-2068b78ea4asor83051425ad.12.2024.09.06.08.50.39 + by mx.google.com with SMTPS id 41be03b00d2f7-7d823cf3ccasor2234239a12.4.2024.09.10.07.10.18 for (Google Transport Security); - Fri, 06 Sep 2024 08:50:39 -0700 (PDT) + Tue, 10 Sep 2024 07:10:18 -0700 (PDT) Received-SPF: pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=Y9Hw3mvz; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=ZauiTwkO; spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725637839; x=1726242639; dara=google.com; + d=gmail.com; s=20230601; t=1725977417; x=1726582217; dara=google.com; h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=r7rF/jG1IIgCj5l2v1qn74V4v31Wj5mEk1ZeR+AbNFM=; - b=Y9Hw3mvz57NZD2prFl2siJqbw22eRla3tVnCYYP77QkwEjFMOfQOpsfqcWwClSSqJs - 4AHdJY+0CKOmLjKExQ/hYc/syVVfcqA8n4b5oVDbfy06XDdMJpfckOrlRDZ+Cbm08tKU - z4MaFcbBSwZt0NggdYhRHJp6VOP/wkemzlwwUK/CCZ5IYOUInXxwfF2ldwIY55M3bEQI - 687rn5XD+jc7QjtPkjZLA3YAWSkwLMjywWNkl4LExMPEbreQyVxSCXlDriZXTn2qntOD - dwC4cicih5wRfknqNxIIYIshvZDIylhV3Jf7fCqolNLYjYl8DMkBMC2uffrjERfo9eya - FxAQ== + bh=DmuuCSkWIuDD9dHgMJvud0Des6CJSRGWEXWicibZGr0=; + b=ZauiTwkO0G9psP/jSdnf1GpKbGHmYKiOobf+tkRD+/LNIJOT+0CtJo90O2s4B4fPBp + beeozEDQTmjrhsbIXjtmNk/NYfAhSC13WIIaN7LZ5BTAPlje++A8Rmy6awLdMoMo4iQ5 + qLRoQ9PyrzbnVGLlx0lTIPQSS07fq9G6jWjNujbTuGqgIWokYllK4W51mcn1PfeulA84 + mZxBV8gyDD0/LfxaMyEvf5RQVwznARZruZ+TndhSAVdT7U7U8ZxQoPzVSwTrpSOIzDAf + zl+bcDoGOC93EtLyakDOfaz0/bjAUgILWmT9CvP1dwdpUdAsAiRZRpFqdu2T3K0H2y/M + 07gQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725637839; x=1726242639; + d=1e100.net; s=20230601; t=1725977417; x=1726582217; h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=r7rF/jG1IIgCj5l2v1qn74V4v31Wj5mEk1ZeR+AbNFM=; - b=JStPHuR05VmxJ83N4tvsRWcPd4/IyvjM8qzKsk7gg2yIIn9Olqzm5RcmdzleYNItt8 - eScfIq+znAjmEX6sYIV6XzSraNdCRBoznnki0A9deJf8wpWAenU+G+j2kHnqNL0K8ZvH - tsB+g111feWk6j7Pb7+UmZwEhzW+hUPWEn8W1Y0HZA18eDm+KT535aE1Cmsn7a2EIsP4 - S60k4YxLXb6gycUEzB9duvoz/eM7cKcuC44le3Lpr5ThO9kWtYq3kt7TFeGU/B3oPHwY - Dz2A7WJMEHG+OW+XQql3m2BP0WSqrOFQejpn23LqluJ85wlz2MReV6eKATMi7zCiOlPs - b4FQ== -X-Gm-Message-State: AOJu0YxGAo0UMdPPmSJTQYE+xTbAo/8Bn7mhXy4ldHlUCBmJ3d0AWyje - xUKE6H/Ann2vBJmbW8db1ON1EvCpd/JQXnxIhXD92H2v+1eavqiMbbn/vA== -X-Google-Smtp-Source: AGHT+IEp1etgXiS/CaTTDtadiWXBD4axZ2BtEKvIwz2SYeOko6Ts6ncVN2SHuqpZVrBMd2E5CwET6g== -X-Received: by 2002:a17:90b:4b11:b0:2d3:dd48:992c with SMTP id 98e67ed59e1d1-2dad504aa69mr3827499a91.23.1725637838520; - Fri, 06 Sep 2024 08:50:38 -0700 (PDT) + bh=DmuuCSkWIuDD9dHgMJvud0Des6CJSRGWEXWicibZGr0=; + b=IClsEQnkrY6TPVcmxOe40ZQEBoyBSyFB3jGKEEQqzsP4zGoKOpKph2UbRk5aH9/OZz + WkOUPWqREizAU7FsTCWb3jS/U9TZUewoxn3g61BqJFmgFx2XzJ1ThQLxFTMg7CAoBKV/ + +FGRduV1dfOkR5g6cs7iazfQveoMQWxrM0AmsvpThwkG7CH+Z78pI1lD+jXKxCh6kvX1 + 8OpYbgMJpDc2lLdeMs3U2ejW8SztOFymn+79NcgRXO//JN4viWEeCLIYVEcfWovtRxux + pUCxDIHQBeBT/n8mokUXlkN9PmXSOXkK/BNruNA05Ev0JRzHi7ideRmD0hQ7zp6NT6Yg + ny7Q== +X-Gm-Message-State: AOJu0Yyv1FPIEsSugXjhy3NIGn1cAtOpylOvTyn6PGJkQWfR9/zPX5P7 + nIxfktgzxAcikwWZ5NL6FwdXmtuTv3xAGQiAl2ieLMXT+Bo+CbdblmuzRg== +X-Google-Smtp-Source: AGHT+IEPxmZOaNnijGPk2Bc4CN5tH+nr4V3Wi0BEUsnmyfIzOGljdhjYnfKAPSzMYvOx50KOU7K/IQ== +X-Received: by 2002:a05:6a20:ac43:b0:1cf:2513:89f6 with SMTP id adf61e73a8af0-1cf5e176b34mr1174390637.41.1725977417241; + Tue, 10 Sep 2024 07:10:17 -0700 (PDT) Return-Path: Received: from SoraMacBook-4.local ([86.48.13.220]) - by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2dadbfe45fbsm1753107a91.6.2024.09.06.08.50.37 + by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-7d8241bf55dsm4904204a12.49.2024.09.10.07.10.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Fri, 06 Sep 2024 08:50:38 -0700 (PDT) -Message-ID: <66db24ce.170a0220.2673da.5f04@mx.google.com> -Date: Fri, 06 Sep 2024 08:50:38 -0700 (PDT) -Content-Type: multipart/alternative; boundary="===============0012875658589814522==" + Tue, 10 Sep 2024 07:10:16 -0700 (PDT) +Message-ID: <66e05348.650a0220.340ca1.e715@mx.google.com> +Date: Tue, 10 Sep 2024 07:10:16 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============0526941080473938676==" MIME-Version: 1.0 From: emaiwallet.alice@gmail.com To: suegamisora@gmail.com Subject: Email Account Recovery Test2 ---===============0012875658589814522== +--===============0526941080473938676== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable @@ -92,10 +92,10 @@ Content-Type: text/html; charset=utf-8

Hello!

This is a test email with a basic HTML body.

-
Set the new signer of 0x0C06688e61C06466E2a5C6f= -E4E15c359260a33f3 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
+
Set the new signer of 0xf22ECf2028fe74129dB8e89= +46b56bef0cD8Ecd5E to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
=20 ---===============0012875658589814522==-- +--===============0526941080473938676==-- diff --git a/packages/prover/Dockerfile b/packages/prover/Dockerfile index 4e2428cb..bec65c85 100644 --- a/packages/prover/Dockerfile +++ b/packages/prover/Dockerfile @@ -23,7 +23,7 @@ RUN ls /root # RUN cp /email-wallet/packages/prover/params/email_sender.wasm /root/params RUN mkdir params WORKDIR /root/params -RUN gdown "https://drive.google.com/uc?id=1LLLTmUxqevSvMAKfQMOiJIdpYxZEPlSf" +RUN gdown "https://drive.google.com/uc?id=1XDPFIL5YK8JzLGoTjmHLXO9zMDjSQcJH" RUN unzip params.zip RUN mv params/* /root/params WORKDIR /root diff --git a/packages/prover/local_setup.sh b/packages/prover/local_setup.sh index 7fdda877..77bd4eb6 100755 --- a/packages/prover/local_setup.sh +++ b/packages/prover/local_setup.sh @@ -6,7 +6,7 @@ mkdir -p build npm install -g snarkjs@latest pip install -r requirements.txt mkdir build && cd build -gdown "https://drive.google.com/uc?id=1LLLTmUxqevSvMAKfQMOiJIdpYxZEPlSf" +gdown "https://drive.google.com/uc?id=1XDPFIL5YK8JzLGoTjmHLXO9zMDjSQcJH" unzip params.zip # curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-account-creation/contributions/emailwallet-account-creation_00019.zkey --output /root/params/account_creation.zkey # curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-account-init/contributions/emailwallet-account-init_00007.zkey --output /root/params/account_init.zkey diff --git a/packages/prover/modal_server.py b/packages/prover/modal_server.py index d727caa1..e59c239f 100644 --- a/packages/prover/modal_server.py +++ b/packages/prover/modal_server.py @@ -5,7 +5,7 @@ from google.cloud.logging_v2.handlers import setup_logging from google.oauth2 import service_account -app = modal.App("email-auth-prover-v1.2.0") +app = modal.App("email-auth-prover-v1.3.0") image = modal.Image.from_dockerfile("Dockerfile") From d10c8ad5aa64cc076d85033c9bf9294e2261d709 Mon Sep 17 00:00:00 2001 From: wshino Date: Wed, 11 Sep 2024 01:36:55 +0900 Subject: [PATCH 048/121] Feat/fix zksync impl (#60) * Fix yarn zkbuild * Fix yarn zktest * Fix integration test except for eml files * comment out specific zksync lines --- .../missing_library_dependencies.json | 14 ++++ packages/contracts/README.md | 12 +-- packages/contracts/foundry.toml | 14 +++- .../DeployRecoveryControllerZKSync.s.sol | 7 +- .../src/EmailAccountRecoveryZKSync.sol | 3 +- .../src/utils/ZKSyncCreate2Factory.sol | 3 +- ...countRecoveryZKSync_completeRecovery.t.sol | 14 ++-- ...countRecoveryZKSync_handleAcceptance.t.sol | 36 ++++----- ...AccountRecoveryZKSync_handleRecovery.t.sol | 76 +++++++++---------- ...AccountRecoveryZKSync_rejectRecovery.t.sol | 18 ++--- .../contracts/test/IntegrationZKSync.t.sol | 31 ++++---- 11 files changed, 131 insertions(+), 97 deletions(-) create mode 100644 packages/contracts/.zksolc-libraries-cache/missing_library_dependencies.json diff --git a/packages/contracts/.zksolc-libraries-cache/missing_library_dependencies.json b/packages/contracts/.zksolc-libraries-cache/missing_library_dependencies.json new file mode 100644 index 00000000..0e7f1f1b --- /dev/null +++ b/packages/contracts/.zksolc-libraries-cache/missing_library_dependencies.json @@ -0,0 +1,14 @@ +[ + { + "contract_name": "CommandUtils", + "contract_path": "src/libraries/CommandUtils.sol", + "missing_libraries": [ + "src/libraries/DecimalUtils.sol:DecimalUtils" + ] + }, + { + "contract_name": "DecimalUtils", + "contract_path": "src/libraries/DecimalUtils.sol", + "missing_libraries": [] + } +] \ No newline at end of file diff --git a/packages/contracts/README.md b/packages/contracts/README.md index 742ceaff..69382d4e 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -268,14 +268,14 @@ You can deploy them by the following command for example. ``` $ forge build --zksync --zk-detect-missing-libraries -Missing libraries detected: src/libraries/SubjectUtils.sol:SubjectUtils, src/libraries/DecimalUtils.sol:DecimalUtils +Missing libraries detected: src/libraries/CommandUtils.sol:CommandUtils, src/libraries/DecimalUtils.sol:DecimalUtils ``` Run the following command in order to deploy each missing library: ``` forge create src/libraries/DecimalUtils.sol:DecimalUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url https://sepolia.era.zksync.dev --chain 300 --zksync -forge create src/libraries/SubjectUtils.sol:SubjectUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url https://sepolia.era.zksync.dev --chain 300 --zksync --libraries src/libraries/DecimalUtils.sol:DecimalUtils:{DECIMAL_UTILS_DEPLOYED_ADDRESS} +forge create src/libraries/CommandUtils.sol:CommandUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url https://sepolia.era.zksync.dev --chain 300 --zksync --libraries src/libraries/DecimalUtils.sol:DecimalUtils:{DECIMAL_UTILS_DEPLOYED_ADDRESS} ``` After that, you can see the following line in foundry.toml. @@ -284,7 +284,7 @@ Also, this line is needed only for foundry-zksync, if you use foundry, please re ``` libraries = [ "{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:{DEPLOYED_ADDRESS}", - "{PROJECT_DIR}/packages/contracts/src/libraries/SubjectUtils.sol:SubjectUtils:{DEPLOYED_ADDRESS}"] + "{PROJECT_DIR}/packages/contracts/src/libraries/CommandUtils.sol:CommandUtils:{DEPLOYED_ADDRESS}"] ``` Incidentally, the above line already exists in `foundy.toml` with it commented out, if you uncomment it by replacing `{PROJECT_DIR}` with the appropriate path, it will also work. @@ -352,12 +352,12 @@ As you saw before, you need to deploy missing libraries. You can deploy them by the following command for example. ``` -Missing libraries detected: src/libraries/SubjectUtils.sol:SubjectUtils, src/libraries/DecimalUtils.sol:DecimalUtils +Missing libraries detected: src/libraries/CommandUtils.sol:CommandUtils, src/libraries/DecimalUtils.sol:DecimalUtils Run the following command in order to deploy each missing library: forge create src/libraries/DecimalUtils.sol:DecimalUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url http://127.0.0.1:8011 --chain 260 --zksync -forge create src/libraries/SubjectUtils.sol:SubjectUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url http://127.0.0.1:8011 --chain 260 --zksync --libraries src/libraries/DecimalUtils.sol:DecimalUtils:{DECIMAL_UTILS_DEPLOYED_ADDRESS} +forge create src/libraries/CommandUtils.sol:CommandUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url http://127.0.0.1:8011 --chain 260 --zksync --libraries src/libraries/DecimalUtils.sol:DecimalUtils:{DECIMAL_UTILS_DEPLOYED_ADDRESS} ``` Set the libraries in foundry.toml using the above deployed address. @@ -365,7 +365,7 @@ Set the libraries in foundry.toml using the above deployed address. And then, run the integration testing. ``` -forge test --match-contract "IntegrationZkSyncTest" --system-mode=true --zksync --gas-limit 1000000000 --chain 300 -vvv --ffi +forge test --match-contract "IntegrationZKSyncTest" --system-mode=true --zksync --gas-limit 1000000000 --chain 300 -vvv --ffi ``` # For zkSync deployment (For test net) diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index bf78c037..4edb0e0e 100644 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -21,8 +21,18 @@ solc = "0.8.26" build_info = true extra_output = ["storageLayout"] -# For missing libraries, please comment out this if you use foundry-zksync -#libraries = ["{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:0x91cc0f0a227b8dd56794f9391e8af48b40420a0b", "{PROJECT_DIR}/packages/contracts/src/libraries/CommandUtils.sol:CommandUtils:0x981e3df952358a57753c7b85de7949da4abcf54a"] +# For missing libraries, please comment out this if you use foundry-zksync for unit test +#libraries = [ +# "{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:0x91cc0f0a227b8dd56794f9391e8af48b40420a0b", +# "{PROJECT_DIR}/packages/contracts/src/libraries/CommandUtils.sol:CommandUtils:0x981e3df952358a57753c7b85de7949da4abcf54a" +#] + +# For missing libraries, please comment out this if you use foundry-zksync for integration test +#libraries = [ +# "{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:0x34eb91D6a0c6Cea4B3b2e4eE8176d6Fc120CB133", +# "{PROJECT_DIR}/packages/contracts/src/libraries/CommandUtils.sol:CommandUtils:0x3CE48a2c96889FeB67f2e3fb0285AEc9e3FCb68b" +#] + [rpc_endpoints] localhost = "${LOCALHOST_RPC_URL}" diff --git a/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol b/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol index 6767cc5f..f6c866df 100644 --- a/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol +++ b/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol @@ -7,6 +7,7 @@ import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "../test/helpers/SimpleWallet.sol"; import "../test/helpers/RecoveryControllerZKSync.sol"; import "../src/utils/Verifier.sol"; +import "../src/utils/Groth16Verifier.sol"; import "../src/utils/ECDSAOwnedDKIMRegistry.sol"; // import "../src/utils/ForwardDKIMRegistry.sol"; import "../src/EmailAuth.sol"; @@ -77,9 +78,13 @@ contract Deploy is Script { "Verifier implementation deployed at: %s", address(verifierImpl) ); + Groth16Verifier groth16Verifier = new Groth16Verifier(); ERC1967Proxy verifierProxy = new ERC1967Proxy( address(verifierImpl), - abi.encodeCall(verifierImpl.initialize, (initialOwner)) + abi.encodeCall( + verifierImpl.initialize, + (initialOwner, address(groth16Verifier)) + ) ); verifier = Verifier(address(verifierProxy)); console.log("Verifier deployed at: %s", address(verifier)); diff --git a/packages/contracts/src/EmailAccountRecoveryZKSync.sol b/packages/contracts/src/EmailAccountRecoveryZKSync.sol index fbd14a68..18916a4f 100644 --- a/packages/contracts/src/EmailAccountRecoveryZKSync.sol +++ b/packages/contracts/src/EmailAccountRecoveryZKSync.sol @@ -15,8 +15,7 @@ abstract contract EmailAccountRecoveryZKSync is EmailAccountRecovery { // The bytecodeHash is hardcoded here because type(ERC1967Proxy).creationCode doesn't work on eraVM currently // If you failed some test cases, check the bytecodeHash by yourself // see, test/ComputeCreate2Address.t.sol - bytes32 public constant proxyBytecodeHash = 0x0100008338d33e12c716a5b695c6f7f4e526cf162a9378c0713eea5386c09951; - + bytes32 public constant proxyBytecodeHash = 0x010000835b32e9a15f4b6353ad649fa33f4fbe4f5139126c07205e738b9f758e; /// @notice Returns the address of the zkSyncfactory contract. /// @dev This function is virtual and can be overridden by inheriting contracts. /// @return address The address of the zkSync factory contract. diff --git a/packages/contracts/src/utils/ZKSyncCreate2Factory.sol b/packages/contracts/src/utils/ZKSyncCreate2Factory.sol index ee3ba883..125b9a9a 100644 --- a/packages/contracts/src/utils/ZKSyncCreate2Factory.sol +++ b/packages/contracts/src/utils/ZKSyncCreate2Factory.sol @@ -10,12 +10,13 @@ import {ZKSyncCreate2FactoryBase} from "./ZKSyncCreate2FactoryBase.sol"; contract ZKSyncCreate2Factory is ZKSyncCreate2FactoryBase { // // FOR_ZKSYNC:START - // function computeAddress(bytes32 salt, bytes32 bytecodeHash, bytes memory input) external view returns (address) { + // function computeAddress(bytes32 salt, bytes32 bytecodeHash, bytes memory input) external override view returns (address) { // return L2ContractHelper.computeCreate2Address(address(this), salt, bytes32(bytecodeHash), keccak256(input)); // } // function deploy(bytes32 salt, bytes32 bytecodeHash, bytes memory input) // external + // override // returns (bool success, bytes memory returnData) // { // (success, returnData) = SystemContractsCaller.systemCallWithReturndata( diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_completeRecovery.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_completeRecovery.t.sol index 5d006eae..435a403b 100644 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_completeRecovery.t.sol +++ b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_completeRecovery.t.sol @@ -50,9 +50,9 @@ contract EmailAccountRecoveryZKSyncTest_completeRecovery is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), @@ -99,10 +99,10 @@ contract EmailAccountRecoveryZKSyncTest_completeRecovery is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleAcceptance.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleAcceptance.t.sol index 9db78895..fa88af64 100644 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleAcceptance.t.sol +++ b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleAcceptance.t.sol @@ -54,9 +54,9 @@ contract EmailAccountRecoveryZKSyncTest_handleAcceptance is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), @@ -97,9 +97,9 @@ contract EmailAccountRecoveryZKSyncTest_handleAcceptance is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; emailAuthMsg.proof.accountSalt = 0x0; vm.mockCall( @@ -131,9 +131,9 @@ contract EmailAccountRecoveryZKSyncTest_handleAcceptance is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), @@ -147,7 +147,7 @@ contract EmailAccountRecoveryZKSyncTest_handleAcceptance is StructHelper { vm.stopPrank(); } - function testExpectRevertHandleAcceptanceInvalidSubjectParams() public { + function testExpectRevertHandleAcceptanceInvalidcommandParams() public { skipIfNotZkSync(); requestGuardian(); @@ -164,10 +164,10 @@ contract EmailAccountRecoveryZKSyncTest_handleAcceptance is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](2); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - subjectParamsForAcceptance[1] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](2); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + commandParamsForAcceptance[1] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), @@ -176,7 +176,7 @@ contract EmailAccountRecoveryZKSyncTest_handleAcceptance is StructHelper { ); vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid subject params")); + vm.expectRevert(bytes("invalid command params")); recoveryControllerZKSync.handleAcceptance(emailAuthMsg, templateIdx); vm.stopPrank(); } @@ -200,9 +200,9 @@ contract EmailAccountRecoveryZKSyncTest_handleAcceptance is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(0x0)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(0x0)); + emailAuthMsg.commandParams = commandParamsForAcceptance; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleRecovery.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleRecovery.t.sol index 3a55ec9c..288b234f 100644 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleRecovery.t.sol +++ b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleRecovery.t.sol @@ -52,9 +52,9 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), @@ -98,10 +98,10 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), @@ -155,10 +155,10 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; emailAuthMsg.proof.accountSalt = 0x0; vm.mockCall( @@ -194,10 +194,10 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { uint templateIdx = 0; EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), @@ -241,10 +241,10 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; emailAuthMsg.proof.accountSalt = 0x0; // vm.mockCall( @@ -296,10 +296,10 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), @@ -313,7 +313,7 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { vm.stopPrank(); } - function testExpectRevertHandleRecoveryInvalidSubjectParams() public { + function testExpectRevertHandleRecoveryInvalidcommandParams() public { skipIfNotZkSync(); handleAcceptance(); @@ -337,11 +337,11 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](3); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - subjectParamsForRecovery[1] = abi.encode(address(0x0)); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](3); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + commandParamsForRecovery[1] = abi.encode(address(0x0)); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), @@ -350,7 +350,7 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { ); vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid subject params")); + vm.expectRevert(bytes("invalid command params")); recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); vm.stopPrank(); } @@ -373,10 +373,10 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { // EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); // uint templateId = recoveryControllerZKSync.computeRecoveryTemplateId(templateIdx); // emailAuthMsg.templateId = templateId; - // bytes[] memory subjectParamsForRecovery = new bytes[](2); - // subjectParamsForRecovery[0] = abi.encode(address(0x0)); - // subjectParamsForRecovery[1] = abi.encode(newSigner); - // emailAuthMsg.subjectParams = subjectParamsForRecovery; + // bytes[] memory commandParamsForRecovery = new bytes[](2); + // commandParamsForRecovery[0] = abi.encode(address(0x0)); + // commandParamsForRecovery[1] = abi.encode(newSigner); + // emailAuthMsg.commandParams = commandParamsForRecovery; // vm.mockCall( // address(recoveryControllerZKSync.emailAuthImplementationAddr()), @@ -414,10 +414,10 @@ contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(address(0x0)); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(address(0x0)); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_rejectRecovery.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_rejectRecovery.t.sol index 8293060b..e17c900e 100644 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_rejectRecovery.t.sol +++ b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_rejectRecovery.t.sol @@ -49,12 +49,12 @@ contract EmailAccountRecoveryZKSyncTest_rejectRecovery is StructHelper { uint templateIdx = 0; EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.subjectParams = subjectParamsForAcceptance; + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + emailAuthMsg.commandParams = commandParamsForAcceptance; address recoveredAccount = recoveryControllerZKSync - .extractRecoveredAccountFromAcceptanceSubject( - emailAuthMsg.subjectParams, + .extractRecoveredAccountFromAcceptanceCommand( + emailAuthMsg.commandParams, templateIdx ); address computedGuardian = recoveryControllerZKSync.computeEmailAuthAddress( @@ -107,10 +107,10 @@ contract EmailAccountRecoveryZKSyncTest_rejectRecovery is StructHelper { templateIdx ); emailAuthMsg.templateId = templateId; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(simpleWallet); - subjectParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.subjectParams = subjectParamsForRecovery; + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(simpleWallet); + commandParamsForRecovery[1] = abi.encode(newSigner); + emailAuthMsg.commandParams = commandParamsForRecovery; vm.mockCall( address(recoveryControllerZKSync.emailAuthImplementationAddr()), diff --git a/packages/contracts/test/IntegrationZKSync.t.sol b/packages/contracts/test/IntegrationZKSync.t.sol index f30cc72b..f6d6ed6c 100644 --- a/packages/contracts/test/IntegrationZKSync.t.sol +++ b/packages/contracts/test/IntegrationZKSync.t.sol @@ -9,6 +9,7 @@ import "@zk-email/contracts/DKIMRegistry.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "../src/EmailAuth.sol"; import "../src/utils/Verifier.sol"; +import "../src/utils/Groth16Verifier.sol"; import "../src/utils/ECDSAOwnedDKIMRegistry.sol"; import "./helpers/SimpleWallet.sol"; import "./helpers/RecoveryControllerZKSync.sol"; @@ -76,9 +77,13 @@ contract IntegrationZKSyncTest is Test { // Create Verifier { Verifier verifierImpl = new Verifier(); + Groth16Verifier groth16Verifier = new Groth16Verifier(); ERC1967Proxy verifierProxy = new ERC1967Proxy( address(verifierImpl), - abi.encodeCall(verifierImpl.initialize, (msg.sender)) + abi.encodeCall( + verifierImpl.initialize, + (msg.sender, address(groth16Verifier)) + ) ); verifier = Verifier(address(verifierProxy)); } @@ -142,7 +147,7 @@ contract IntegrationZKSyncTest is Test { console.log("SimpleWallet is at ", address(simpleWallet)); assertEq( address(simpleWallet), - 0x7c5E4b26643682AF77A196781A851c9Fe769472d + 0xc9a403a0f75924677Dc0b011Da7eD8dD902063A6 ); address simpleWalletOwner = simpleWallet.owner(); @@ -177,7 +182,7 @@ contract IntegrationZKSyncTest is Test { emailProof.publicKeyHash = bytes32(vm.parseUint(pubSignals[9])); emailProof.timestamp = vm.parseUint(pubSignals[11]); emailProof - .maskedSubject = "Accept guardian request for 0x7c5E4b26643682AF77A196781A851c9Fe769472d"; + .maskedCommand = "Accept guardian request for 0xc9a403a0f75924677Dc0b011Da7eD8dD902063A6"; emailProof.emailNullifier = bytes32(vm.parseUint(pubSignals[10])); emailProof.accountSalt = bytes32(vm.parseUint(pubSignals[32])); accountSalt = emailProof.accountSalt; @@ -211,14 +216,14 @@ contract IntegrationZKSyncTest is Test { ); // Call handleAcceptance -> GuardianStatus.ACCEPTED - bytes[] memory subjectParamsForAcceptance = new bytes[](1); - subjectParamsForAcceptance[0] = abi.encode(address(simpleWallet)); + bytes[] memory commandParamsForAcceptance = new bytes[](1); + commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); EmailAuthMsg memory emailAuthMsg = EmailAuthMsg({ templateId: recoveryControllerZKSync.computeAcceptanceTemplateId( templateIdx ), - subjectParams: subjectParamsForAcceptance, - skipedSubjectPrefix: 0, + commandParams: commandParamsForAcceptance, + skippedCommandPrefix: 0, proof: emailProof }); recoveryControllerZKSync.handleAcceptance(emailAuthMsg, templateIdx); @@ -258,7 +263,7 @@ contract IntegrationZKSyncTest is Test { // 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 is account 9 emailProof - .maskedSubject = "Set the new signer of 0x7c5E4b26643682AF77A196781A851c9Fe769472d to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; + .maskedCommand = "Set the new signer of 0xc9a403a0f75924677Dc0b011Da7eD8dD902063A6 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720"; emailProof.emailNullifier = bytes32(vm.parseUint(pubSignals[10])); emailProof.accountSalt = bytes32(vm.parseUint(pubSignals[32])); @@ -284,17 +289,17 @@ contract IntegrationZKSyncTest is Test { console.log("is code exist: ", vm.parseUint(pubSignals[33])); // Call handleRecovery -> isRecovering = true; - bytes[] memory subjectParamsForRecovery = new bytes[](2); - subjectParamsForRecovery[0] = abi.encode(address(simpleWallet)); - subjectParamsForRecovery[1] = abi.encode( + bytes[] memory commandParamsForRecovery = new bytes[](2); + commandParamsForRecovery[0] = abi.encode(address(simpleWallet)); + commandParamsForRecovery[1] = abi.encode( address(0xa0Ee7A142d267C1f36714E4a8F75612F20a79720) ); emailAuthMsg = EmailAuthMsg({ templateId: recoveryControllerZKSync.computeRecoveryTemplateId( templateIdx ), - subjectParams: subjectParamsForRecovery, - skipedSubjectPrefix: 0, + commandParams: commandParamsForRecovery, + skippedCommandPrefix: 0, proof: emailProof }); recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); From 4727741e9a0a82527e2d27bbe2312c8d9c4f0e88 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Wed, 11 Sep 2024 01:42:17 +0900 Subject: [PATCH 049/121] Update test emails for zksync --- packages/contracts/test/emails/300/accept.eml | 154 ++++++++++-------- .../contracts/test/emails/300/recovery.eml | 153 +++++++++-------- 2 files changed, 165 insertions(+), 142 deletions(-) diff --git a/packages/contracts/test/emails/300/accept.eml b/packages/contracts/test/emails/300/accept.eml index 7e10ce7a..b6491ad7 100644 --- a/packages/contracts/test/emails/300/accept.eml +++ b/packages/contracts/test/emails/300/accept.eml @@ -1,90 +1,102 @@ -Delivered-To: rrelayerbob@gmail.com -Received: by 2002:a05:6400:2670:b0:264:9270:cc66 with SMTP id jy48csp750570ecb; - Wed, 28 Aug 2024 00:53:22 -0700 (PDT) -X-Received: by 2002:a05:6214:5b0a:b0:6bf:8cb9:420 with SMTP id 6a1803df08f44-6c3362e69d4mr13631006d6.28.1724831602260; - Wed, 28 Aug 2024 00:53:22 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1724831602; cv=none; +Delivered-To: suegamisora@gmail.com +Received: by 2002:a05:7010:8c26:b0:403:8332:eb9c with SMTP id gq38csp1824832mdb; + Tue, 10 Sep 2024 09:38:37 -0700 (PDT) +X-Received: by 2002:a17:903:943:b0:207:18f5:7e78 with SMTP id d9443c01a7336-2074c70afcemr18749795ad.48.1725986317661; + Tue, 10 Sep 2024 09:38:37 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725986317; cv=none; d=google.com; s=arc-20160816; - b=XHYkOsPNkoh6Z/JlWBpmbftiVMlvTrQleXhtrViXaWIdnKIvwTAPXdaICvrHd/Gx6P - 3oVxnHb8Cuhi3cJ+ctMJ40RfT+f2+DRWXG2Csihny9ayIWeJ4mhPEy1Y6ZXkCEr3Gud8 - mVeHCXLthekdgQly8uhWxC6vn3wXtCEvx49iJM0gyfcyAI4Nt1eYDS0hr2gH6XNY4F+Q - mEiHfFbZj6s95egRsp2ZipfGz7yojKoKDTUWupDDPF4YpM9TxHrKyqVhk7mgT5PHaAWm - xkgUr8fWf+2/a+ini06UovznocNQCwGEHbRyPcIQ8SssjV21Xh0P3vwUSdKQKZYJJvTD - wUIg== + b=dfLhRCAZSEmyw8FkqKJk0waxN/95QBsbDUSCEX1OdRfdTxotPVdpR8WS1/K+pjWtAj + tMutbQqgaGxvu4m9mTotCIVPT/yu/YWA1ZCEEYIGRDv6CnFOxqdQJTOiPJm7k0PSq+WM + 92Thc03PWWdr6qbqUx0sMcEPWSeQA+51ehQIxfc03yjK7sYov3YLBherTHW55uy6vkgw + vImTmvEXm7PGMPdXlqf8erUf+lLNZRxFj2+kgXeFt98+/sq93tPJ9GmFxeDTNz2Ps6rB + 1zAXhl/A3humFOBEC/KpjkDPS/x+tq/u8IbHJZfsutZiu+ilusNpyswk1Qi5CjwWgkTH + hKVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; - h=to:subject:message-id:date:from:mime-version:dkim-signature; - bh=wfoUswYdacWo98C2NPNyTM5htDNHLSMk6+9pc8+wtuY=; - fh=OYPr0JdXtRRlM3Htj/E6+khbD9huvtdqkRTmPoW0wko=; - b=H8LtD87fAH1qc7wN2hssgsTYQ10genWfiNzNwL+379b1AP/AMubRu3Ekep9uRlkgle - K7AUiX3xkCtX0jmtFAm4EgRqByv9EgAaedHzXbrc/jOBWUq7g0zJM+uk6QffM7ETNNvt - aI263gbooi401SQK+epiPYQ+yF4nXX6cNidm/HyGR0LzxEKWio3NPblQUxihlUKbwN/T - 4MWYgM18G4/ebFrdkbe9707tKHDK6P/BuK9P4mWH6DJwHmGVK40Pyu7xKCtr0/L74/Zu - U04dV6Rho5On1vS0fiEjdhSJdQ5Co1UkyMhn2s8Oalxk9pm95yN6EIcMM+81l2l6dI4+ - GkbA==; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=Vk745v+8yhNcqTm1mm8X+W3Zd9/M2jmlVHdKY4AKXs0=; + fh=r9ZW45D/4i7BIl/4UeFGrkYKwbplztqhOVKfbV+WD3I=; + b=EfGIbo2tnRbkq2StKoKJb+7cJcwTt4XdwuNClcYnpQt9THcWWorOKP+MIgfE55paDy + U8EsHTtKYRf//a4qKhNAOJWrTWAcg3vs9zPx1Bxg2pXMpdEA0cKcvGGm+XYm5MNcxpXi + CpPU+cMD44aiqC9P7oGSARQSMZybhgBxIjzKF91d6P+KjkUvHXIha2cpi0i+676Xx4Y3 + 6IjQSQBdtaLjIvGN2lsW4dym9D8oeUfu0X7GiDu3njniQDvFWIhtdCviKALHw1/bDSA3 + RDQvzvkiHitGxvlNgC17wTFAnFdJvoxDpPHz5DsNcqZExkmxxVQGXwLIDBX7T3bo96o3 + pbyw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=kOFwnIGQ; - spf=pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emailwalletrelayer987@gmail.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=URaXcH62; + spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com -Return-Path: +Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id 6a1803df08f44-6c162e8aa5dsor71159546d6.9.2024.08.28.00.53.22 - for + by mx.google.com with SMTPS id d9443c01a7336-20710f0a568sor47682135ad.13.2024.09.10.09.38.37 + for (Google Transport Security); - Wed, 28 Aug 2024 00:53:22 -0700 (PDT) -Received-SPF: pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; + Tue, 10 Sep 2024 09:38:37 -0700 (PDT) +Received-SPF: pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=kOFwnIGQ; - spf=pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emailwalletrelayer987@gmail.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=URaXcH62; + spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1724831601; x=1725436401; dara=google.com; - h=to:subject:message-id:date:from:mime-version:from:to:cc:subject + d=gmail.com; s=20230601; t=1725986317; x=1726591117; dara=google.com; + h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=wfoUswYdacWo98C2NPNyTM5htDNHLSMk6+9pc8+wtuY=; - b=kOFwnIGQ8CiIR0+qd/kNcIr9AyL0k/UMnrM2nWMnTJPHgOVyYzJt1v9dGuP1MqNvrA - kHAigFUd6kPv6vYZna755EG9ciFpvWXvdb0IgigVfKH35jBxKA2kTdGfbgkfHlZA3KSj - fwsytkQrkSVFpp/5ZuOIZ7WWqRbLYjJ75ICYYjmzpCQwjAA6MDpMvSpYHOlxmXxBzE+c - 9VPDfEIhD8HsVMgTB3NSYRPkSX7M8Sl3aFOUWhNW6KU7W5yqgNXq28P2PiyiFGzsh2B3 - dTx6SR/HadkLihJGpkC5C8qNgeCoUf1crLTNjbGESClqzNHIyjJ5Q6wt3MuKlgu80olN - xJmg== + bh=Vk745v+8yhNcqTm1mm8X+W3Zd9/M2jmlVHdKY4AKXs0=; + b=URaXcH62e8a+xToD1KWt3fnQHANjXhBVee8M2K+juwj5Rxn0PkXLJf2LxG2tt6diss + waH1BH6hmcCXmlVS8lhim7UVCjDKaPj/HE+QYzfH9L9PUMCymvuvs1BgJhf9Q64K8gMs + b52OHxAgJpbSvuV6jqT2T3dXw0B0a9I5fBSnILUZFeMZvpRxl856TCU4dSROwZeDg6r8 + 5MGjxtAY38MSDSI91CpJxQ7R7BsXQaJFZJ/OnHa3UazzGOi5qiGNYrlg4c6B6+cU0SPa + eHc6yMWHmOKm6G6diBvrqsGfyIn1c30MdywKGFetTf1ImOSycPS3ovQV7rDYGg8Rs2pU + WbRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1724831601; x=1725436401; - h=to:subject:message-id:date:from:mime-version:x-gm-message-state + d=1e100.net; s=20230601; t=1725986317; x=1726591117; + h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=wfoUswYdacWo98C2NPNyTM5htDNHLSMk6+9pc8+wtuY=; - b=P8nKrBqskVA91k6q3XbmEdSc5BVCGGg2Utz+Ire/PS7MN3jnT1sQ5HxVqnWq/HiiDS - tVz4/wRFtUDmkkCNEzQ4DzLr2674IcS+vQ23hRaovrYEKos9yu2TKyV9xtNI/+zP3NNU - BmtuwCazEpMzK1BmOZ4NDX+Jd3DAha1uodiTxyfmKNxpoVg1QTluPlKtWALVc56Rk2tT - sGZXH6rpDalEF32vsi4hcGj7sA9n7pZIexLtjd1BZSILtJ0c0ImA2yyZIJwotFV/7Yn4 - DvC0VgQj5dtdrSI707fhUYXPZ+z1tEaVtINPNKz7X9Cy7TmTZ8dOdj05DaTA4eCixgFM - mgPQ== -X-Gm-Message-State: AOJu0YwrGQCEe9+PJ6Zepa+H3q3Cq2LyydJZATE3K+17Co3Iom94DUhW - vD7YwjhQbaLqC1niaQEOlycvMfVNNnTluvbVzbuYqqE/Kk5SBwcM7zJBcW5OBmSMV81PM0fPTWK - mLt1/FTNquOh5CWZ8GAsjw2p44F0k -X-Google-Smtp-Source: AGHT+IF9+HGRRMj6SjPxYPjB7WJiyoxKQSEitAal6QSa9IbQzWwfeh3hSAdLj9EMUwnFSJLGcixB1gy28cyAeKaW51A= -X-Received: by 2002:a05:6214:4306:b0:6bf:7474:348f with SMTP id - 6a1803df08f44-6c3362d2fa8mr9836466d6.21.1724831601609; Wed, 28 Aug 2024 - 00:53:21 -0700 (PDT) + bh=Vk745v+8yhNcqTm1mm8X+W3Zd9/M2jmlVHdKY4AKXs0=; + b=kSCLRefsgNYivbpbeVRdxMMskpimcwrLK8TTdoF5ajfN0W58vWld/YIiPkzrTO8gCD + QwhAAA6vugSb7WqlEld8WzJn0qtB5pBdILk7+T0TPr8JtYb+/XRwkVqfXx8XCedI7a4O + 8Oaym+ifI1TWRJue88GYJdiGl57KBVK3iWRgcr8OKR3A/73BWPOMog/2NnP4YYwOdmWa + VJRarvSld2LQ4SHjPS4tbYMI1IxV7F1kzwO2UXgz7WwdUMdqsCdAV9RELlh4tQ+wlRl+ + UDMVoXk15JGTGvBc2g/BDiydyjSNiWl78QCxHvUQ8Z4O+67n0eBgfFWp/qRwQ7xNFf49 + urOA== +X-Gm-Message-State: AOJu0YwV3kqbPCQbvMXXLgJIO57qHGl1hoF/rOtXDBw6jyr0OK5JQ9ZY + pVrU8iJS+K59sRA5a0BCr0qwVjQdhohx6ylxkRK21+Zhi+1xomxRO2AcDQ== +X-Google-Smtp-Source: AGHT+IHX/XOGVHjmOfuRpK4Pptr2iau2tiFhqn+uqJV/ZLH1Nfh89Fkg1poZvvmlL9Lb9OC31tTjjg== +X-Received: by 2002:a17:902:d54e:b0:206:d6ac:85e0 with SMTP id d9443c01a7336-2074c4c4fd7mr17261935ad.4.1725986316733; + Tue, 10 Sep 2024 09:38:36 -0700 (PDT) +Return-Path: +Received: from SoraMacBook-4.local ([86.48.13.220]) + by smtp.gmail.com with ESMTPSA id d9443c01a7336-20710e324bbsm50756575ad.87.2024.09.10.09.38.35 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Tue, 10 Sep 2024 09:38:36 -0700 (PDT) +Message-ID: <66e0760c.170a0220.109a28.0a9e@mx.google.com> +Date: Tue, 10 Sep 2024 09:38:36 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============7312056348872157310==" MIME-Version: 1.0 -From: "emailwallet.relayer.2" -Date: Wed, 28 Aug 2024 16:53:10 +0900 -Message-ID: -Subject: Accept guardian request for 0x7c5E4b26643682AF77A196781A851c9Fe769472d - Code 1162ebff40918afe5305e68396f0283eb675901d0387f97d21928d423aaa0b54 -To: rrelayerbob@gmail.com -Content-Type: multipart/alternative; boundary="000000000000e9559a0620b9a62f" +From: emaiwallet.alice@gmail.com +To: suegamisora@gmail.com +Subject: Email Account Recovery Test1 ---000000000000e9559a0620b9a62f -Content-Type: text/plain; charset="UTF-8" - - - ---000000000000e9559a0620b9a62f -Content-Type: text/html; charset="UTF-8" +--===============7312056348872157310== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 -

---000000000000e9559a0620b9a62f-- + + +

Hello!

+

This is a test email with a basic HTML body.

+
+
Accept guardian request for 0xc9a403a0f75924677= +Dc0b011Da7eD8dD902063A6 Code 1162ebff40918afe5305e68396f0283eb675901d0387f9= +7d21928d423aaa0b54
+
+ + + =20 +--===============7312056348872157310==-- diff --git a/packages/contracts/test/emails/300/recovery.eml b/packages/contracts/test/emails/300/recovery.eml index 5b795415..b1b1be5d 100644 --- a/packages/contracts/test/emails/300/recovery.eml +++ b/packages/contracts/test/emails/300/recovery.eml @@ -1,90 +1,101 @@ -Delivered-To: rrelayerbob@gmail.com -Received: by 2002:a05:6400:2670:b0:264:9270:cc66 with SMTP id jy48csp750751ecb; - Wed, 28 Aug 2024 00:54:02 -0700 (PDT) -X-Received: by 2002:a05:6102:26c9:b0:492:a9f8:4a71 with SMTP id ada2fe7eead31-49a4ed30da9mr1309811137.8.1724831642136; - Wed, 28 Aug 2024 00:54:02 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1724831642; cv=none; +Delivered-To: suegamisora@gmail.com +Received: by 2002:a05:7010:8c26:b0:403:8332:eb9c with SMTP id gq38csp1825082mdb; + Tue, 10 Sep 2024 09:39:06 -0700 (PDT) +X-Received: by 2002:a05:6a20:e609:b0:1cf:42ab:5776 with SMTP id adf61e73a8af0-1cf62d5ca4amr429112637.32.1725986345693; + Tue, 10 Sep 2024 09:39:05 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1725986345; cv=none; d=google.com; s=arc-20160816; - b=cpTbX87GQyaBGaVXbNadJs8tRJ3H6JwDzUCyAR6zbLifi7OvRIHe/CqXAdOjD88MEN - S5Vri34IQ0pQX+/0KPKejM0sKlvuQXSca6+H87JzalG4kkXOChT58Wjm5zrWcY9Xslh5 - s275+Zh5T6gx7IBZZZtXLcOgtRgZgsHhpF2DkzgSiRh1FtJC35ewsspFC1VtqWZqUAZh - +41nK1p++/vFWBqpB3YZXSdWFDGsyJ7QtHFfi3vG/x8b/h6c4vHrvT0zx5lDwZB+YmV+ - xXROwXhRH2ND5375vtZz8OyfaQHhY43HVSP4dOfrHgeUbtVzcQiYW+SR3Q6FPHCUqStc - EycQ== + b=b0EtK1nljCR3bWa33hL+U9UOs6bxgLbIDEWs+/NW+WPtgxuadYjIdDXgR3gqPAeQ6C + XdasCPKLFxl+ioOj8RmjMo+gfNU4wZQhEbM/plNiliwXlMAA54+ZeilxbdPH2wo34YN2 + 8qF3EeRf9IOg8yw2hBIn6KxZ1vLGvbHoA+1Ojy9HpsN3VoSNBZbMihBAEdeiEqEJoNAF + 5S0dCnLy2Koz3fxfWWh30wx/tuStkzDWAzwhs//43Fj+qBNug3GR8IE+gQDs3HYW1mjG + wqS7lEyPzf7LKoiV420U1ulVeVFxmvC5jWwtkd3xDTJiUoHgsqbI0Y+GYkESzvQ9YWmr + 6HlA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; - h=to:subject:message-id:date:from:mime-version:dkim-signature; - bh=IehaSA/JR4L/KX7NlPKK5B7zTFO/0C8UNbHTPhhIN84=; - fh=OYPr0JdXtRRlM3Htj/E6+khbD9huvtdqkRTmPoW0wko=; - b=OUQ5TcZbiTNRl396nTBZH0uojnYZfc5tChwa5yntVLuQouy9qXfZXnKWHKNwRb/MiT - P2sVT7nG4DDbzSMdsOi7fG06vsBJfq4Oetaco5s1zyL7T7dCC0L4PnwJ2sRQbpSoh/Zb - YAknwfYkp1F0bjeYw2HBdfqlT93kzDLe7sI6zk2uADL1gp9oUMzKpotSMIrbzBIX6nGv - 26ASehd6ceNdxqCKCFCagi8WOuQQBNjN8E+G2m+7Zx1YjGif1LTgmzh6RxtpYT/M02gW - 4eidLLTEv6bQzFwKo9rwJq3iD1A9H9HESrEJGGWjAd5dTDxOLRQXge3igywzFjOnwPq0 - 9huw==; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=6hPBp+vlBrxTRnD9R3qQENApN0jmx2Fg0r+sci7UQ0w=; + fh=r9ZW45D/4i7BIl/4UeFGrkYKwbplztqhOVKfbV+WD3I=; + b=krFTcSGb5iLOt44J//Vp1U9YZ1zRjGjhSOqgtqOknaMcE5aE3+stluCK1VqjGEBKl7 + 5eyiuSOvK0sJj8vWIQITdZt+mk3JEEBS3O04ZZq70NarB+WzKhPvwQmxkE6LHhPIMwqV + e9gKBNFn/Vk499qWjrpnxCb+22+KWfhQrFwSLiMp8j30UpMe9hn4I9u8uAQbZ03q5m02 + XDstL7Nnz9ocpv2rA5gTD4jMaHTOKuXQFrv6N+36c9dqfIkp0AzNDB8cv/Z9Z9kyyxuv + ILq4EGk5hQA7Bg/ld2z0EuPDt08zeQNk834N0WfiK+o1hWby/1vEcRZ4ZLXyGgBJhRQ1 + aI4g==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=XTkwK+MJ; - spf=pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emailwalletrelayer987@gmail.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=WQF01ftP; + spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com -Return-Path: +Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) - by mx.google.com with SMTPS id ada2fe7eead31-498e47e8b90sor1864165137.5.2024.08.28.00.54.02 - for + by mx.google.com with SMTPS id d2e1a72fcca58-718e58aa24fsor5451141b3a.2.2024.09.10.09.39.05 + for (Google Transport Security); - Wed, 28 Aug 2024 00:54:02 -0700 (PDT) -Received-SPF: pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; + Tue, 10 Sep 2024 09:39:05 -0700 (PDT) +Received-SPF: pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; - dkim=pass header.i=@gmail.com header.s=20230601 header.b=XTkwK+MJ; - spf=pass (google.com: domain of emailwalletrelayer987@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emailwalletrelayer987@gmail.com; + dkim=pass header.i=@gmail.com header.s=20230601 header.b=WQF01ftP; + spf=pass (google.com: domain of emaiwallet.alice@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=emaiwallet.alice@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com; dara=pass header.i=@gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1724831641; x=1725436441; dara=google.com; - h=to:subject:message-id:date:from:mime-version:from:to:cc:subject + d=gmail.com; s=20230601; t=1725986345; x=1726591145; dara=google.com; + h=subject:to:from:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; - bh=IehaSA/JR4L/KX7NlPKK5B7zTFO/0C8UNbHTPhhIN84=; - b=XTkwK+MJbzJP7Sy/I5oNWMkuJ7jrQZc5ovy3+4meyBwreJFQ1+F5UZOtUKd1svPC+u - v3TNvLvzlUTeXHW7TujG7U2WOxNOqqyYF18mgBIRlw5FXtgjz9j+bbALp0fo61e7gKhS - PHiRPocLWJpLgsMFy5nHod39aqcLWv0uMkCzwveMnDzlZYQFVxEKotyumIHUKLPIj2DI - BhOM5LhSml1qRzpB3eKpXGzEaLnyesPrOQNPwKB4ZfiSaP3xPYNfeAZhwohVEBTigi0h - ZnrH0DwfaJ6P1UdTTfG1YPfY1qm8BpEi4qFrYUUeZL1fK341NNq0y08egz0R6Q/CPJKL - l0KA== + bh=6hPBp+vlBrxTRnD9R3qQENApN0jmx2Fg0r+sci7UQ0w=; + b=WQF01ftPVMiaUjCYDZz8WK3Srm+Qj3ziX4IZgRW2Izftw60jPHQ0EGoSNp27hQPTqs + zAaWql3QRMGe560f5QbtA08ZYJA7siGA/Nxjm0hgLe3vDbn/he5j1Ephd3wHj1oort2h + Zh5+cz6C+L1wRWlsDdgoco5laVYDl0j0ASo04G3lqDOvO0uGv2JeLLXyFQEgdtBbB8xm + M+qrDkzTjZurCTEEyzw4lGzY21YnmFMEer9FCUST/jjHts6GMO5/iQdBunn+WJ7IVHGX + 7n8YH7Nu2wH7gD3HleSsqhfO4GgleYR6/hgTKs0OJK5aw/iz7HVPkvVymNxOzulykEhW + nguQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1724831641; x=1725436441; - h=to:subject:message-id:date:from:mime-version:x-gm-message-state + d=1e100.net; s=20230601; t=1725986345; x=1726591145; + h=subject:to:from:mime-version:date:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; - bh=IehaSA/JR4L/KX7NlPKK5B7zTFO/0C8UNbHTPhhIN84=; - b=tlCjTjy8XCtY9U/SDWIKjLwWqYynJdQR9tV9VMWBcf37cDm9UpUVw5Ey9aScTxPLq+ - gadkjTGfA6ljpL8UsTbM1A2/b296DjfVZ2bYiCzZ58z/Httf8lSd9nInC1Tmd0iRIm3O - 8L/X9hWHkcbPGm8EhXNRiUKNBAFxshxpr24+jE2gWoPa7FVUmD1uY/nlYKMRGvvARqkq - RGQ9qpCa8LnWEPyRsE8AaV/g16kksprSEOoZocT3bwL+r/4O+s45ZNEHn9X0jEFPmb4U - 18/92ludL29pZ/PYgmz39iKbTEucY/7lZz3oKq2iNmWZPVKSjEf5kfYKMzIycQauxeN8 - lBDw== -X-Gm-Message-State: AOJu0YwP8OnzV4z4jcMcybAydVxa6xFnitsmWGjgRtqw9ENgSBo5ki6u - RGO9v2uhgEZvUHgR0fuGEYNoi7DCCDKFWePFH0ZVWNRGylHSvGShhFUZfztJ/KnOeUFE3KO+JyG - 8/1vz6i+Tu9quIYwBMxTsxItL1LJD -X-Google-Smtp-Source: AGHT+IFGI8kUAMWkx4LUP4o9Lv0V2QzLQJZlC8zeOQeO/P2VdPkPSYJrFwDo+q0Ez3VMetqJIH7d4YaBQI3E5y+sAWA= -X-Received: by 2002:a05:6102:c0b:b0:498:e21c:cc66 with SMTP id - ada2fe7eead31-49a4ecd79bemr1392977137.6.1724831641483; Wed, 28 Aug 2024 - 00:54:01 -0700 (PDT) + bh=6hPBp+vlBrxTRnD9R3qQENApN0jmx2Fg0r+sci7UQ0w=; + b=ndgpWipFYNnMEVBNIbCTo3hdq5s52SsqIP2LfGHcLj0kbHBFztnbYyf08mpOnUKYCt + tSuR4ED24iFR12YoMTVI31jtAqhByXPRjeBWO9VKMyJsbkR+HMg/1SaQRKnVT51KF7Jf + +IvSVrPDnUfXeanD0EqBehUVO0BIdBVfIfaKn9ya0ErWCYlSZVHxDiM5/WOgYphkJJAo + /3qYe3QL9mcO3fX1vJHvWc9coC8g/zZHUCf/8ZahG1oJ163+RimHW5ueFHqfqq4i0nQR + 3OKdUYT2Tor63eDcQRAwK+B5VSX+argK66GL5x6k3VUePLc//Ll6FHruKWoq+ZxheZA8 + a0SA== +X-Gm-Message-State: AOJu0YzDzcmXKL8yByi8uaoBwACQ6HWU3v6fHrKeHX0Plvt4T9+0YWN0 + zoZqnrz82ZiXcW6I6F6Fr83+uAHZK12qLVMWexGex5cY76CmUgCfdJQa1g== +X-Google-Smtp-Source: AGHT+IGC5giELSCCqz3HQwGE5mzWv/EdRWKwbUShbjJyGhn1VHDRtGXTvmcEnuecT/hH8BVTri8BiA== +X-Received: by 2002:a05:6a00:9484:b0:718:d7de:3be2 with SMTP id d2e1a72fcca58-71916df1f89mr30323b3a.14.1725986344787; + Tue, 10 Sep 2024 09:39:04 -0700 (PDT) +Return-Path: +Received: from SoraMacBook-4.local ([86.48.13.220]) + by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-71909005869sm1616801b3a.91.2024.09.10.09.39.03 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Tue, 10 Sep 2024 09:39:04 -0700 (PDT) +Message-ID: <66e07628.050a0220.1ba7d6.6f5b@mx.google.com> +Date: Tue, 10 Sep 2024 09:39:04 -0700 (PDT) +Content-Type: multipart/alternative; boundary="===============3282306698450311126==" MIME-Version: 1.0 -From: "emailwallet.relayer.2" -Date: Wed, 28 Aug 2024 16:53:50 +0900 -Message-ID: -Subject: Set the new signer of 0x7c5E4b26643682AF77A196781A851c9Fe769472d to - 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 Code 1162ebff40918afe5305e68396f0283eb675901d0387f97d21928d423aaa0b54 -To: rrelayerbob@gmail.com -Content-Type: multipart/alternative; boundary="00000000000049c5260620b9a9a6" +From: emaiwallet.alice@gmail.com +To: suegamisora@gmail.com +Subject: Email Account Recovery Test2 ---00000000000049c5260620b9a9a6 -Content-Type: text/plain; charset="UTF-8" - - - ---00000000000049c5260620b9a9a6 -Content-Type: text/html; charset="UTF-8" +--===============3282306698450311126== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 -

---00000000000049c5260620b9a9a6-- + + +

Hello!

+

This is a test email with a basic HTML body.

+
+
Set the new signer of 0xc9a403a0f75924677Dc0b01= +1Da7eD8dD902063A6 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
+
+ + + =20 +--===============3282306698450311126==-- From 2191baab0d4c9474476f1c94c77dc8971f677eb8 Mon Sep 17 00:00:00 2001 From: wshino Date: Wed, 11 Sep 2024 02:32:54 +0900 Subject: [PATCH 050/121] Update integration test for zksync --- packages/contracts/test/IntegrationZKSync.t.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/contracts/test/IntegrationZKSync.t.sol b/packages/contracts/test/IntegrationZKSync.t.sol index f6d6ed6c..cfa27b4a 100644 --- a/packages/contracts/test/IntegrationZKSync.t.sol +++ b/packages/contracts/test/IntegrationZKSync.t.sol @@ -169,7 +169,7 @@ contract IntegrationZKSyncTest is Test { string memory publicInputFile = vm.readFile( string.concat( vm.projectRoot(), - "/test/build_integration/email_auth_public.json" + "/test/build_integration/email_auth_with_body_parsing_with_qp_encoding_public.json" ) ); string[] memory pubSignals = abi.decode( @@ -251,7 +251,7 @@ contract IntegrationZKSyncTest is Test { publicInputFile = vm.readFile( string.concat( vm.projectRoot(), - "/test/build_integration/email_auth_public.json" + "/test/build_integration/email_auth_with_body_parsing_with_qp_encoding_proof.json" ) ); pubSignals = abi.decode(vm.parseJson(publicInputFile), (string[])); @@ -275,7 +275,7 @@ contract IntegrationZKSyncTest is Test { emailProof.proof = proofToBytes( string.concat( vm.projectRoot(), - "/test/build_integration/email_auth_proof.json" + "/test/build_integration/email_auth_with_body_parsing_with_qp_encoding_proof.json" ) ); From 10b7c60227f6965a48032f366d530757250ff4a0 Mon Sep 17 00:00:00 2001 From: wshino Date: Wed, 11 Sep 2024 03:02:10 +0900 Subject: [PATCH 051/121] Update bytecode hash --- packages/contracts/src/EmailAccountRecoveryZKSync.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts/src/EmailAccountRecoveryZKSync.sol b/packages/contracts/src/EmailAccountRecoveryZKSync.sol index 18916a4f..c6bb1420 100644 --- a/packages/contracts/src/EmailAccountRecoveryZKSync.sol +++ b/packages/contracts/src/EmailAccountRecoveryZKSync.sol @@ -15,7 +15,7 @@ abstract contract EmailAccountRecoveryZKSync is EmailAccountRecovery { // The bytecodeHash is hardcoded here because type(ERC1967Proxy).creationCode doesn't work on eraVM currently // If you failed some test cases, check the bytecodeHash by yourself // see, test/ComputeCreate2Address.t.sol - bytes32 public constant proxyBytecodeHash = 0x010000835b32e9a15f4b6353ad649fa33f4fbe4f5139126c07205e738b9f758e; + bytes32 public constant proxyBytecodeHash = 0x010000834ad8a271023fa874e71183d1576cc95a540c8dc0f3c980064b3008b1; /// @notice Returns the address of the zkSyncfactory contract. /// @dev This function is virtual and can be overridden by inheriting contracts. /// @return address The address of the zkSync factory contract. From c759ca5de79b2e6d3181c08cd6a1c43645ee093b Mon Sep 17 00:00:00 2001 From: wshino Date: Wed, 11 Sep 2024 03:12:39 +0900 Subject: [PATCH 052/121] Update proof.json path --- packages/contracts/test/IntegrationZKSync.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts/test/IntegrationZKSync.t.sol b/packages/contracts/test/IntegrationZKSync.t.sol index cfa27b4a..be0a528e 100644 --- a/packages/contracts/test/IntegrationZKSync.t.sol +++ b/packages/contracts/test/IntegrationZKSync.t.sol @@ -190,7 +190,7 @@ contract IntegrationZKSyncTest is Test { emailProof.proof = proofToBytes( string.concat( vm.projectRoot(), - "/test/build_integration/email_auth_proof.json" + "/test/build_integration/email_auth_with_body_parsing_with_qp_encoding_proof.json" ) ); From 3fb09045688c9b5d291efb03bf1e785ec424aeff Mon Sep 17 00:00:00 2001 From: wshino Date: Wed, 11 Sep 2024 03:27:14 +0900 Subject: [PATCH 053/121] Update publicInputFile path --- packages/contracts/test/IntegrationZKSync.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts/test/IntegrationZKSync.t.sol b/packages/contracts/test/IntegrationZKSync.t.sol index be0a528e..806b8696 100644 --- a/packages/contracts/test/IntegrationZKSync.t.sol +++ b/packages/contracts/test/IntegrationZKSync.t.sol @@ -251,7 +251,7 @@ contract IntegrationZKSyncTest is Test { publicInputFile = vm.readFile( string.concat( vm.projectRoot(), - "/test/build_integration/email_auth_with_body_parsing_with_qp_encoding_proof.json" + "/test/build_integration/email_auth_with_body_parsing_with_qp_encoding_public.json" ) ); pubSignals = abi.decode(vm.parseJson(publicInputFile), (string[])); From e96b68de8bc308e1c99e48deeabecf308069f442 Mon Sep 17 00:00:00 2001 From: wshino Date: Wed, 11 Sep 2024 20:39:38 +0900 Subject: [PATCH 054/121] Update bytecode hash --- packages/contracts/src/EmailAccountRecoveryZKSync.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/contracts/src/EmailAccountRecoveryZKSync.sol b/packages/contracts/src/EmailAccountRecoveryZKSync.sol index c6bb1420..963418e1 100644 --- a/packages/contracts/src/EmailAccountRecoveryZKSync.sol +++ b/packages/contracts/src/EmailAccountRecoveryZKSync.sol @@ -15,7 +15,8 @@ abstract contract EmailAccountRecoveryZKSync is EmailAccountRecovery { // The bytecodeHash is hardcoded here because type(ERC1967Proxy).creationCode doesn't work on eraVM currently // If you failed some test cases, check the bytecodeHash by yourself // see, test/ComputeCreate2Address.t.sol - bytes32 public constant proxyBytecodeHash = 0x010000834ad8a271023fa874e71183d1576cc95a540c8dc0f3c980064b3008b1; + bytes32 public constant proxyBytecodeHash = 0x010000835b32e9a15f4b6353ad649fa33f4fbe4f5139126c07205e738b9f758e; + /// @notice Returns the address of the zkSyncfactory contract. /// @dev This function is virtual and can be overridden by inheriting contracts. /// @return address The address of the zkSync factory contract. From 6607fd2ab4981d014275fd33d34f05b7e83dcbad Mon Sep 17 00:00:00 2001 From: wshino Date: Thu, 12 Sep 2024 02:51:26 +0900 Subject: [PATCH 055/121] Update docs for integration tests for zksync --- packages/contracts/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/contracts/README.md b/packages/contracts/README.md index 69382d4e..e3a36040 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -362,6 +362,8 @@ forge create src/libraries/CommandUtils.sol:CommandUtils --private-key {YOUR_PRI Set the libraries in foundry.toml using the above deployed address. +Due to this change in the address of the missing libraries, the value of the proxyBytecodeHash must also be changed: change the value of the proxyBytecodeHash in E-mailAccountRecoveryZKSync.sol. + And then, run the integration testing. ``` From 9104be65e2432aeb89a925695a0f455f6c454ef9 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Thu, 12 Sep 2024 15:47:58 +0900 Subject: [PATCH 056/121] Update package.json in contracts --- packages/contracts/package.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/contracts/package.json b/packages/contracts/package.json index b6e26824..e136ad12 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@zk-email/ether-email-auth-contracts", - "version": "1.0.0", + "version": "0.0.1-preview", "license": "MIT", "scripts": { "build": "forge build --skip '*ZKSync*'", @@ -20,5 +20,12 @@ "ds-test": "https://github.com/dapphub/ds-test", "forge-std": "https://github.com/foundry-rs/forge-std", "solhint": "^3.6.1" - } + }, + "files": [ + "/src", + "foundry.toml", + "package.json", + "README.md", + "remappings.txt" + ] } \ No newline at end of file From e210be9a915891f5a232fe7dcdd9f5e421a59938 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Thu, 12 Sep 2024 17:20:59 +0900 Subject: [PATCH 057/121] Let functions in EmailAccountRecoveryZKSync be virtual --- packages/contracts/package.json | 2 +- .../src/EmailAccountRecoveryZKSync.sol | 59 +++++++++---------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/packages/contracts/package.json b/packages/contracts/package.json index e136ad12..3fc1d004 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@zk-email/ether-email-auth-contracts", - "version": "0.0.1-preview", + "version": "0.0.2-preview", "license": "MIT", "scripts": { "build": "forge build --skip '*ZKSync*'", diff --git a/packages/contracts/src/EmailAccountRecoveryZKSync.sol b/packages/contracts/src/EmailAccountRecoveryZKSync.sol index 963418e1..95ec720b 100644 --- a/packages/contracts/src/EmailAccountRecoveryZKSync.sol +++ b/packages/contracts/src/EmailAccountRecoveryZKSync.sol @@ -9,14 +9,14 @@ import {ZKSyncCreate2Factory} from "./utils/ZKSyncCreate2Factory.sol"; /// @notice Provides mechanisms for email-based account recovery, leveraging guardians and template-based email verification. /// @dev This contract is abstract and requires implementation of several methods for configuring a new guardian and recovering an account contract. abstract contract EmailAccountRecoveryZKSync is EmailAccountRecovery { - // This is the address of the zkSync factory contract address public factoryAddr; // The bytecodeHash is hardcoded here because type(ERC1967Proxy).creationCode doesn't work on eraVM currently // If you failed some test cases, check the bytecodeHash by yourself // see, test/ComputeCreate2Address.t.sol - bytes32 public constant proxyBytecodeHash = 0x010000835b32e9a15f4b6353ad649fa33f4fbe4f5139126c07205e738b9f758e; - + bytes32 public constant proxyBytecodeHash = + 0x010000835b32e9a15f4b6353ad649fa33f4fbe4f5139126c07205e738b9f758e; + /// @notice Returns the address of the zkSyncfactory contract. /// @dev This function is virtual and can be overridden by inheriting contracts. /// @return address The address of the zkSync factory contract. @@ -34,19 +34,20 @@ abstract contract EmailAccountRecoveryZKSync is EmailAccountRecovery { function computeEmailAuthAddress( address recoveredAccount, bytes32 accountSalt - ) public view override returns (address) { + ) public view virtual override returns (address) { // If on zksync, we use another logic to calculate create2 address. - return ZKSyncCreate2Factory(factory()).computeAddress( - accountSalt, - proxyBytecodeHash, - abi.encode( - emailAuthImplementation(), - abi.encodeCall( - EmailAuth.initialize, - (recoveredAccount, accountSalt, address(this)) + return + ZKSyncCreate2Factory(factory()).computeAddress( + accountSalt, + proxyBytecodeHash, + abi.encode( + emailAuthImplementation(), + abi.encodeCall( + EmailAuth.initialize, + (recoveredAccount, accountSalt, address(this)) + ) ) - ) - ); + ); } /// @notice Deploys a proxy contract for email authentication using the CREATE2 opcode. @@ -57,25 +58,23 @@ abstract contract EmailAccountRecoveryZKSync is EmailAccountRecovery { /// @param accountSalt A bytes32 salt value defined as a hash of the guardian's email address and an account code. This is assumed to be unique to a pair of the guardian's email address and the wallet address to be recovered. /// @return address The address of the deployed proxy contract. function deployEmailAuthProxy( - address recoveredAccount, + address recoveredAccount, bytes32 accountSalt - ) internal override returns (address) { - (bool success, bytes memory returnData) = ZKSyncCreate2Factory(factory()).deploy( - accountSalt, - proxyBytecodeHash, - abi.encode( - emailAuthImplementation(), - abi.encodeCall( - EmailAuth.initialize, - ( - recoveredAccount, - accountSalt, - address(this) + ) internal virtual override returns (address) { + (bool success, bytes memory returnData) = ZKSyncCreate2Factory( + factory() + ).deploy( + accountSalt, + proxyBytecodeHash, + abi.encode( + emailAuthImplementation(), + abi.encodeCall( + EmailAuth.initialize, + (recoveredAccount, accountSalt, address(this)) ) ) - ) - ); + ); address payable proxyAddress = abi.decode(returnData, (address)); return proxyAddress; } -} \ No newline at end of file +} From 5c21f4b4eea750aa97887236dbe518ceea101e06 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Thu, 12 Sep 2024 17:05:16 +0530 Subject: [PATCH 058/121] fix: subject template parsing --- packages/relayer/.env.example | 2 +- packages/relayer/src/core.rs | 2 ++ .../relayer/src/utils/subject_templates.rs | 26 ++++++++++++++----- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example index 5b1428cb..0f696907 100644 --- a/packages/relayer/.env.example +++ b/packages/relayer/.env.example @@ -6,7 +6,7 @@ CHAIN_ID=11155111 # Chain ID of the testnet. SMTP_SERVER= -PROVER_ADDRESS="https://zkemail--email-auth-prover-body-parsing-v1-0-0-flask-app.modal.run" +PROVER_ADDRESS="https://zkemail--email-auth-prover-v1-3-0-flask-app.modal.run" DATABASE_URL= "postgres://test@localhost/emailauth_test" RELAYER_EMAIL_ADDR= diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index bc28757e..9939ab04 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -289,6 +289,8 @@ pub async fn handle_email(email: String) -> Result { proof: email_proof.clone(), }; + println!("Email Auth Msg: {:?}", email_auth_msg); + match CLIENT .handle_recovery( &request.controller_eth_addr, diff --git a/packages/relayer/src/utils/subject_templates.rs b/packages/relayer/src/utils/subject_templates.rs index fbffde21..e8ccd734 100644 --- a/packages/relayer/src/utils/subject_templates.rs +++ b/packages/relayer/src/utils/subject_templates.rs @@ -102,12 +102,13 @@ pub fn extract_template_vals(input: &str, templates: Vec) -> Result") { + string = string.split("
").collect::>()[0].to_string(); + } template_vals.push(TemplateValue::String(string)); } "{uint}" => { @@ -119,7 +120,11 @@ pub fn extract_template_vals(input: &str, templates: Vec) -> Result") { + uint_match = uint_match.split("
").collect::>()[0]; + } + let uint = U256::from_dec_str(uint_match).unwrap(); template_vals.push(TemplateValue::Uint(uint)); } "{int}" => { @@ -130,7 +135,11 @@ pub fn extract_template_vals(input: &str, templates: Vec) -> Result") { + int_match = int_match.split("
").collect::>()[0]; + } + let int = I256::from_dec_str(int_match).unwrap(); template_vals.push(TemplateValue::Int(int)); } "{decimals}" => { @@ -143,7 +152,10 @@ pub fn extract_template_vals(input: &str, templates: Vec) -> Result") { + decimals = decimals.split("
").collect::>()[0].to_string(); + } template_vals.push(TemplateValue::Decimals(decimals)); } "{ethAddr}" => { From 581a8454639f282290d0b74a35e90cb07e311f30 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Fri, 13 Sep 2024 21:43:38 +0900 Subject: [PATCH 059/121] Add requestGuardian to SimpleWallet --- packages/contracts/test/helpers/SimpleWallet.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/contracts/test/helpers/SimpleWallet.sol b/packages/contracts/test/helpers/SimpleWallet.sol index 27678ebb..c5d476d3 100644 --- a/packages/contracts/test/helpers/SimpleWallet.sol +++ b/packages/contracts/test/helpers/SimpleWallet.sol @@ -49,4 +49,9 @@ contract SimpleWallet is OwnableUpgradeable { ); _transferOwnership(newOwner); } + + function requestGuardian(address guardian) public { + require(msg.sender == owner(), "only owner"); + RecoveryController(recoveryController).requestGuardian(guardian); + } } From 5342f0a15f1c453edf7232796bc1c7c83355c260 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Sat, 14 Sep 2024 00:11:40 +0900 Subject: [PATCH 060/121] Fix scripts --- .../script/DeployRecoveryController.s.sol | 2 +- .../DeployRecoveryControllerZKSync.s.sol | 2 +- .../contracts/script/DeploySimpleWallet.s.sol | 29 +++---------------- 3 files changed, 6 insertions(+), 27 deletions(-) diff --git a/packages/contracts/script/DeployRecoveryController.s.sol b/packages/contracts/script/DeployRecoveryController.s.sol index 0251e36d..032516d3 100644 --- a/packages/contracts/script/DeployRecoveryController.s.sol +++ b/packages/contracts/script/DeployRecoveryController.s.sol @@ -35,7 +35,7 @@ contract Deploy is Script { } vm.startBroadcast(deployerPrivateKey); - address initialOwner = msg.sender; + address initialOwner = vm.addr(deployerPrivateKey); // Deploy ECDSAOwned DKIM registry dkim = ECDSAOwnedDKIMRegistry(vm.envOr("ECDSA_DKIM", address(0))); diff --git a/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol b/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol index f6c866df..a817f7dd 100644 --- a/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol +++ b/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol @@ -37,7 +37,7 @@ contract Deploy is Script { } vm.startBroadcast(deployerPrivateKey); - address initialOwner = msg.sender; + address initialOwner = vm.addr(deployerPrivateKey); // Deploy ECDSAOwned DKIM registry dkim = ECDSAOwnedDKIMRegistry(vm.envOr("ECDSA_DKIM", address(0))); diff --git a/packages/contracts/script/DeploySimpleWallet.s.sol b/packages/contracts/script/DeploySimpleWallet.s.sol index e2f4321e..3c22adcb 100644 --- a/packages/contracts/script/DeploySimpleWallet.s.sol +++ b/packages/contracts/script/DeploySimpleWallet.s.sol @@ -3,37 +3,18 @@ pragma solidity ^0.8.13; import "forge-std/Script.sol"; -import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import "../test/helpers/SimpleWallet.sol"; -import "../src/utils/Verifier.sol"; -import "../src/utils/ECDSAOwnedDKIMRegistry.sol"; -import "../src/EmailAuth.sol"; contract Deploy is Script { - using ECDSA for *; - function run() external { uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); if (deployerPrivateKey == 0) { console.log("PRIVATE_KEY env var not set"); return; } - address dkim = vm.envAddress("DKIM"); - if (dkim == address(0)) { - console.log("DKIM env var not set"); - return; - } - address verifier = vm.envAddress("VERIFIER"); - if (verifier == address(0)) { - console.log("VERIFIER env var not set"); - return; - } - address emailAuthImpl = vm.envAddress("EMAIL_AUTH_IMPL"); - if (emailAuthImpl == address(0)) { - console.log("EMAIL_AUTH_IMPL env var not set"); - return; - } + address initOwner = vm.addr(deployerPrivateKey); + address controller = vm.envAddress("CONTROLLER"); address simpleWalletImpl = vm.envAddress("SIMPLE_WALLET_IMPL"); if (simpleWalletImpl == address(0)) { console.log("SIMPLE_WALLET_IMPL env var not set"); @@ -43,10 +24,8 @@ contract Deploy is Script { vm.startBroadcast(deployerPrivateKey); bytes memory data = abi.encodeWithSelector( SimpleWallet(payable(simpleWalletImpl)).initialize.selector, - vm.addr(deployerPrivateKey), - verifier, - dkim, - emailAuthImpl + initOwner, + controller ); ERC1967Proxy proxy = new ERC1967Proxy(address(simpleWalletImpl), data); console.log("SimpleWallet deployed at: %s", address(proxy)); From 57acb0052b55c7dafe46efcc0458dc90aa425153 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Sat, 14 Sep 2024 00:42:44 +0900 Subject: [PATCH 061/121] Fix scripts --- packages/contracts/script/DeployRecoveryController.s.sol | 4 ++-- .../contracts/script/DeployRecoveryControllerZKSync.s.sol | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/contracts/script/DeployRecoveryController.s.sol b/packages/contracts/script/DeployRecoveryController.s.sol index 032516d3..c69db0f2 100644 --- a/packages/contracts/script/DeployRecoveryController.s.sol +++ b/packages/contracts/script/DeployRecoveryController.s.sol @@ -108,7 +108,7 @@ contract Deploy is Script { abi.encodeCall( recoveryControllerImpl.initialize, ( - signer, + initialOwner, address(verifier), address(dkim), address(emailAuthImpl) @@ -143,7 +143,7 @@ contract Deploy is Script { address(simpleWalletImpl), abi.encodeCall( simpleWalletImpl.initialize, - (signer, address(recoveryController)) + (initialOwner, address(recoveryController)) ) ); simpleWallet = SimpleWallet(payable(address(simpleWalletProxy))); diff --git a/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol b/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol index a817f7dd..60b5484b 100644 --- a/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol +++ b/packages/contracts/script/DeployRecoveryControllerZKSync.s.sol @@ -121,7 +121,7 @@ contract Deploy is Script { abi.encodeCall( recoveryControllerZKSyncImpl.initialize, ( - signer, + initialOwner, address(verifier), address(dkim), address(emailAuthImpl), @@ -157,7 +157,7 @@ contract Deploy is Script { address(simpleWalletImpl), abi.encodeCall( simpleWalletImpl.initialize, - (signer, address(recoveryControllerZKSync)) + (initialOwner, address(recoveryControllerZKSync)) ) ); simpleWallet = SimpleWallet(payable(address(simpleWalletProxy))); From 8a62db1e676aedbb20a403be95fffebef12b97e4 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Sun, 15 Sep 2024 01:19:18 +0900 Subject: [PATCH 062/121] Update READMEs --- README.md | 52 +- packages/circuits/README.md | 12 +- packages/circuits/input.json | 2136 ++++++++++++++++++++++++++++++++++ packages/contracts/README.md | 224 +++- 4 files changed, 2341 insertions(+), 83 deletions(-) create mode 100644 packages/circuits/input.json diff --git a/README.md b/README.md index 83c14a93..ec39f0c9 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ One issue with existing applications on Ethereum is that all users who execute t Our ether email-auth SDK solves this issue: it allows users to execute any transaction on-chain simply by sending an email. Using the SDK, a developer can build a smart contract with the following features without new ZKP circuits. -1. (Authorization) The contract can authorize any message in the Subject of the email that the user sends with a DKIM signature generated by an email provider, e.g., Gmail. +1. (Authorization) The contract can authorize any message in the email body that the user sends with a DKIM signature generated by an email provider, e.g., Gmail. 2. (Authentication) The contract can authenticate that the given Ethereum address corresponds to the email address in the From field of the email. 3. (Privacy) No on-chain information reveals the user's email address itself. In other words, any adversary who learns only public data cannot estimate the corresponding email address from the Ethereum address. @@ -19,10 +19,10 @@ Using the ether email-auth SDK, we construct a library and tools for any smart a In addition to a user and a smart contract employing our SDK, there is a permissionless server called Relayer. The Relayer connects the off-chain world, where the users are, with the on-chain world, where the contracts reside, without compromising security. Specifically, the user, the Relayer, and the contract collaborate as follows: -1. (Off-chain) The user sends the Relayer an email containing a message to the contract in the Subject. -2. (Off-chain) The Relayer generates **an email-auth message for the given email, consisting of data about the Subject, an Ethereum address corresponding to the user's email address, a ZK proof of the email, and so on**. +1. (Off-chain) The user sends the Relayer an email containing a message called command. +2. (Off-chain) The Relayer generates **an email-auth message for the given email, consisting of data about the command, an Ethereum address corresponding to the user's email address, a ZK proof of the email, and so on**. 3. (Off-chain -> On-chain) The Relayer broadcasts an Ethereum transaction to call the contract with the email-auth message. -4. (On-chain) After verifying the given email-auth message, the contract executes application-specific logic depending on the message in the Subject and the user's Ethereum address. +4. (On-chain) After verifying the given email-auth message, the contract executes application-specific logic according to the command in that message for an Ethereum account derived from the user's email address. 5. (On-chain -> Off-chain) The Relayer sends the user an email to report the execution result of the contract. ![Architecture Flow](./docs/images/architecture-flow.png) @@ -35,35 +35,35 @@ That CREATE2 salt is called account salt, which is published on-chain. **As long as the account code is hidden, no adversary can learn the user's email address from on-chain data.** ### Invitation Code -An invitation code is a hex string of the account code along with a prefix, contained in any field of the email header to be inherited by its reply, e.g., Subject. +An invitation code is a hex string of the account code along with a prefix, contained in the email body and inherited by the user's reply. By confirming that a user sends an email with the invitation code, the contract can ensure that the account code is available to that user. It ensures the user’s liveness even when a malicious relayer or another user generates the user's account code because it prevents them from withholding the account code. **It suggests that the contract must check if the given email sent by the user contains the invitation code before confirming that user’s account for the first time.** Notably, the email-auth message, which represents data in the user's email along with its ZK proof, has a boolean field `isCodeExist` such that the value is true if the invitation code is in the email. -However, the Subject message in the email-auth message masks characters for the invitation code. +However, a command in the email-auth message masks characters for the invitation code. **Consequently, no information beyond the existence of the invitation code is disclosed.** -### Subject Template -A subject template defines the expected format of the message in the Subject for each application. -**It allows developers to constrain that message to be in the application-specific format without new ZKP circuits.** +### Command Template +Each application defines expected formats for a command in the email body as command templates. +**To define the command templates, a developer does not need to write any ZKP circuits.** -Specifically, the subject template is an array of strings, each of which has some fixed strings without space and the following variable parts: +Specifically, the command template is an array of strings, each of which has some fixed strings without space and the following variable parts: - `"{string}"`: a string. Its Solidity type is `string`. - `"{uint}"`: a decimal string of the unsigned integer. Its Solidity type is `uint256`. - `"{int}"`: a decimal string of the signed integer. Its Solidity type is `int256`. - `"{decimals}"`: a decimal string of the decimals. Its Solidity type is `uint256`. Its decimal size is fixed to 18. E.g., “2.7” ⇒ `abi.encode(2.7 * (10**18))`. -- `"{ethAddr}"`: a hex string of the Ethereum address. Its Solidity type is `address`. Its value MUST satisfy the checksum of the Ethereum address. +- `"{ethAddr}"`: a hex string of the Ethereum address. Its Solidity type is `address`. Its value MUST be either 0x+lowercase, 0x+uppercase, or 0x+checksumed addresses. ## Package Components There are four significant packages in this repo: ### `circuits` Package -It has a main circom circuit for verifying the email along with its DKIM signature, revealing a Subject message that masks an email address and an invitation code, and deriving an account salt from the email address in the From field and the given account code, which should match with the invitation code if it exists in the email. -The circuit is agnostic to application contexts such as subject templates. +It has a main circom circuit for verifying the email along with its DKIM signature, revealing a command message that masks an email address and an invitation code, and deriving an account salt from the email address in the From field and the given account code, which should match with the invitation code if it exists in the email. +The circuit is agnostic to application specifications such as command templates. **Therefore, a developer does not need to make new circuits.** -In a nutshell, our circuit 1) verifies the given RSA signature for the given email header and the RSA public key, 2) exposes the string in the Subject field except for the invitation code and the email address that appears in the Subject, and 3) computes the account salt derived from the email address in the From field and the given account code, which must be the same as the invitation code if it exists. -In this way, it allows our on-chain verifier to authenticate the email sender and authorize the message in the Subject while protecting privacy. +In a nutshell, our circuit 1) verifies the given RSA signature for the given email header and the RSA public key, 2) exposes a substring between predefined prefix and suffix as a command from the email body while masking the invitation code and email address, and 3) computes the account salt derived from the email address in the From field and the given account code, which must match the invitation code, if present. +This allows our on-chain verifier to authenticate the email sender and authorize the command in the email body while protecting privacy. For detailed setup instructions, see [here](./packages/circuits/README.md). @@ -81,11 +81,11 @@ If you use the common trusted custodians for all users, you can deploy a new DKI If each user should be able to modify the registered public keys, a new DKIM registry contract needs to be deployed for each user. The email-auth contract in `EmailAuth.sol` is a contract for each email user. -Its contract Ethereum address is derived from 1) its initial owner address, 2) an address of a controller contract that can define the supported subject templates and 3) the account salt, i.e., the hash of the user's email address and one account code held by the user, through CREATE2. +Its contract Ethereum address is derived from 1) its initial owner address, 2) an address of a controller contract that can define the supported command templates and 3) the account salt, i.e., the hash of the user's email address and one account code held by the user, through CREATE2. It provides a function `authEmail` to verify the email-auth message by calling the verifier and the DKIM registry contracts. Your application contract can employ those contracts in the following manner: -1. For a new email user, the application contract deploys (a proxy of) the email-auth contract. Subsequently, the application contract sets the addresses of the verifier and the DKIM registry contracts and some subject templates for your application to the email-auth contract. Here, the email-auth contract registers the application contract as a controller contract that has permissions to modify the subject templates. +1. For a new email user, the application contract deploys (a proxy of) the email-auth contract. Subsequently, the application contract sets the addresses of the verifier and the DKIM registry contracts and some command templates for your application to the email-auth contract. Here, the email-auth contract registers the application contract as a controller contract that has permissions to modify the command templates. 2. Given a new email-auth message from the email user, the application contract calls the `authEmail` function in the email-auth contract for that user. If it returns no error, the application contract can execute any processes based on the message in the email-auth message. For detailed setup instructions, see [here](./packages/contracts/README.md). @@ -108,7 +108,7 @@ Our SDK only performs the verification of the email-auth message. Here, we present a list of security notes that you should check. - As described in the Subsection of "Invitation Code", for each email user, your application contract must ensure that the value of `isCodeExist` in the first email-auth message is true. -- The application contract can configure multiple subject templates for the same email-auth contract. However, the Relayer can choose any of the configured templates, as long as the message in the Subject matches with the chosen template. For example, if there are two templates "Send {decimals} {string}" and "Send {string}", the message "Send 1.23 ETH" matches with both templates. We recommend defining the subject templates without such ambiguities. +- The application contract can configure multiple command templates for the same email-auth contract. However, the Relayer can choose any of the configured templates, as long as the message in the command matches with the chosen template. For example, if there are two templates "Send {decimals} {string}" and "Send {string}", the message "Send 1.23 ETH" matches with both templates. We recommend defining the command templates without such ambiguities. - To protect the privacy of the users' email addresses, you should carefully design not only the contracts but also the Relayer server, which stores the users' account codes. For example, an adversary can breach that privacy by exploiting an API provided by the Relayer that returns the Ethereum address for the given email address and its stored account code. Additionally, if any Relayer's API returns an error when no account code is stored for the given email address, the adversary can learn which email addresses are registered. ## Application: Email-based Account Recovery @@ -147,16 +147,16 @@ Our SDK cannot ensure security and privacy in the entire process without your ca Specifically, you can integrate the email-based account recovery into your smart accounts in the following steps. 1. (Contracts 1/6) First, you build a new controller contract with imports of the `EmailAccountRecovery` abstract contract in `EmailAccountRecovery.sol`. Your Solidity compiler will require you to implement the following seven functions: `isActivated`, -`acceptanceSubjectTemplates`, `recoverySubjectTemplates`, `extractRecoveredAccountFromAcceptanceSubject`, `extractRecoveredAccountFromRecoverySubject`, `acceptGuardian`, `processRecovery`, and `completeRecovery`. -2. (Contracts 2/6) You define expected subject templates for two types of emails sent from guardians, one for accepting the role of the guardian, and the other for confirming the account recovery. You can implement the former and latter subject templates in the `acceptanceSubjectTemplates` and `recoverySubjectTemplates` functions, respectively. This is an example of the subject templates: - - Template in `acceptanceSubjectTemplates`: `"Accept guardian request for {ethAddr}"`, where the value of `"{ethAddr}"` represents the account address. - - Template in `recoverySubjectTemplates`: `"Set the new signer of {ethAddr} to {ethAddr}"`, where the values of the first and second `"{ethAddr}"`, respectively, represent the account address and the new owner address. -3. (Contracts 3/6) You also define how to extract an account address to be recovered from the subject parameters for the templates in `acceptanceSubjectTemplates` and `recoverySubjectTemplates`, respectively. +`acceptanceCommandTemplates`, `recoveryCommandTemplates`, `extractRecoveredAccountFromAcceptanceCommand`, `extractRecoveredAccountFromRecoveryCommand`, `acceptGuardian`, `processRecovery`, and `completeRecovery`. +2. (Contracts 2/6) You define expected command templates for two types of emails sent from guardians, one for accepting the role of the guardian, and the other for confirming the account recovery. You can implement the former and latter command templates in the `acceptanceCommandTemplates` and `recoveryCommandTemplates` functions, respectively. This is an example of the command templates: + - Template in `acceptanceCommandTemplates`: `"Accept guardian request for {ethAddr}"`, where the value of `"{ethAddr}"` represents the account address. + - Template in `recoveryCommandTemplates`: `"Set the new signer of {ethAddr} to {ethAddr}"`, where the values of the first and second `"{ethAddr}"`, respectively, represent the account address and the new owner address. +3. (Contracts 3/6) You also define how to extract an account address to be recovered from the command parameters for the templates in `acceptanceCommandTemplates` and `recoveryCommandTemplates`, respectively. 3. (Contracts 4/6) Before implementing the remaining functions in `EmailAccountRecovery`, you implement a requesting function into the controller that allows the account owner to request a guardian, which is expected to be called by the account owner directly. Our SDK **does not** specify any interface or implementation of this function. For example, the function can simply take as input a new guardian's email-auth contract address computed by CREATE2, and store it as a guardian candidate. If you want to set a timelock for each guardian, the requesting function can additionally take the timelock length as input. -4. (Contracts 5/6) You implement the `acceptGuardian` and `processRecovery` functions into the controller. These two functions are, respectively, called by the controller itself after verifying the email-auth messages for accepting a guardian and processing a recovery. Each of them takes as input the guardian's email-auth contract address, an index of the chosen subject template, the values for the variable parts of the message in the Subject, and the email nullifier. You can assume these arguments are already verified. For example, the `acceptGuardian` function stores the given guardian's address as the confirmed guardian, and the `processRecovery` function stores the given new owner's address or sets a timelock. +4. (Contracts 5/6) You implement the `acceptGuardian` and `processRecovery` functions into the controller. These two functions are, respectively, called by the controller itself after verifying the email-auth messages for accepting a guardian and processing a recovery. Each of them takes as input the guardian's email-auth contract address, an index of the chosen command template, the values for the variable parts of the message in the command, and the email nullifier. You can assume these arguments are already verified. For example, the `acceptGuardian` function stores the given guardian's address as the confirmed guardian, and the `processRecovery` function stores the given new owner's address or sets a timelock. 5. (Contracts 6/6) You finally implement the `completeRecovery` function into the controller. It should rotate the owner's address in the smart account if some required conditions hold. This function can be called by anyone, but is assumed to be called by the Relayer and can take as input arbitrary bytes. -6. (Frontend 1/3) Next, you build a frontend for the account recovery. You prepare a page where the account owner configures guardians. It requests the account owner to input the account address (`account_eth_addr`) and the guardian's email address (`guardian_email_addr`), generates a random account code (`account_code`), constructs an expected subject (`subject`) for the subject template whose index is `template_idx` in the output of the `acceptanceSubjectTemplates()` function. It then requests the account owner to call the requesting function in the controller contract. After that, it calls the Relayer's `acceptanceRequest` API with `guardian_email_addr`, `account_code`, `template_idx`, and the address of the controller contract `controller_eth_addr`. -7. (Frontend 2/3) You also prepare a page where the account owner requests guardians to recover the account. It requests the account owner to input the account address (`account_eth_addr`) and the guardian's email address (`guardian_email_addr`), and constructs an expected subject (`subject`) for the subject template whose index is `template_idx` in the output of the `recoverySubjectTemplates()` function. It calls the Relayer's `recoveryRequest` API with those data and `controller_eth_addr`. +6. (Frontend 1/3) Next, you build a frontend for the account recovery. You prepare a page where the account owner configures guardians. It requests the account owner to input the account address (`account_eth_addr`) and the guardian's email address (`guardian_email_addr`), generates a random account code (`account_code`), constructs an expected command (`command`) for the command template whose index is `template_idx` in the output of the `acceptanceCommandTemplates()` function. It then requests the account owner to call the requesting function in the controller contract. After that, it calls the Relayer's `acceptanceRequest` API with `guardian_email_addr`, `account_code`, `template_idx`, and the address of the controller contract `controller_eth_addr`. +7. (Frontend 2/3) You also prepare a page where the account owner requests guardians to recover the account. It requests the account owner to input the account address (`account_eth_addr`) and the guardian's email address (`guardian_email_addr`), and constructs an expected command (`command`) for the command template whose index is `template_idx` in the output of the `recoveryCommandTemplates()` function. It calls the Relayer's `recoveryRequest` API with those data and `controller_eth_addr`. 8. (Frontend 3/3) It simulates off-chain if the `completeRecovery` function in the smart account will return no error at regular time intervals. When it stands, the frontend calls the Relayer's `completeRequest` API with sending `account_eth_addr`, `controller_eth_addr`, and a calldata for the `completeRecovery` function `complete_calldata`. We show some important points to implement the email-based account recovery for your smart accounts securely. diff --git a/packages/circuits/README.md b/packages/circuits/README.md index 74f58d13..f76f3ac0 100644 --- a/packages/circuits/README.md +++ b/packages/circuits/README.md @@ -60,6 +60,14 @@ The `email_auth.circom` makes constraints and computes the public output as foll 12. Let `embedded_code` be an integer parsing `code_str` as a hex string. 13. If `is_code_exist` is 1, assert that `embedded_code` is equal to `account_code`. 14. Let `account_salt` be `PoseidonHash(from_addr|0..0, account_code, 0)`. -15. Let `masked_subject` be a string that removes `code_str`, the prefix of the invitation code, and one email address from `subject`, if they appear in `subject`. +15. Let `masked_subject` be a string that removes the invitation code with the prefix `code_str` and one email address from `subject`, if they appear in `subject`. -Note that the email address in the subject is assumbed not to overlap with the invitation code. \ No newline at end of file +Note that the email address in the subject is assumbed not to overlap with the invitation code. + + +#### `email_auth_with_body_parsing_with_qp_encoding.circom` +A circuit to verify that a message in the email body, called command, is authorized by a user of an account salt, derived from an email address in the From field and a random field value called account code. +This is basically the same as the `email_auth.circom` described above except for the following features: +- Instead of `subject_idx`, it additionally takes as a private input a padded email body `padded_cleaned_body` and an index of the command in the email body `command_idx`. +- It extracts a substring `command` between a prefix `(
]*>)"` and a suffix `
` from `padded_cleaned_body`. +- It outputs `masked_command` instead of `masked_subject`, which removes the invitation code with the prefix and one email address from `command`. \ No newline at end of file diff --git a/packages/circuits/input.json b/packages/circuits/input.json new file mode 100644 index 00000000..7aec4db2 --- /dev/null +++ b/packages/circuits/input.json @@ -0,0 +1,2136 @@ +{ + "padded_header": [ + 115, + 117, + 98, + 106, + 101, + 99, + 116, + 58, + 69, + 109, + 97, + 105, + 108, + 32, + 65, + 99, + 99, + 111, + 117, + 110, + 116, + 32, + 82, + 101, + 99, + 111, + 118, + 101, + 114, + 121, + 32, + 84, + 101, + 115, + 116, + 49, + 13, + 10, + 116, + 111, + 58, + 115, + 117, + 101, + 103, + 97, + 109, + 105, + 115, + 111, + 114, + 97, + 64, + 103, + 109, + 97, + 105, + 108, + 46, + 99, + 111, + 109, + 13, + 10, + 102, + 114, + 111, + 109, + 58, + 101, + 109, + 97, + 105, + 119, + 97, + 108, + 108, + 101, + 116, + 46, + 97, + 108, + 105, + 99, + 101, + 64, + 103, + 109, + 97, + 105, + 108, + 46, + 99, + 111, + 109, + 13, + 10, + 109, + 105, + 109, + 101, + 45, + 118, + 101, + 114, + 115, + 105, + 111, + 110, + 58, + 49, + 46, + 48, + 13, + 10, + 100, + 97, + 116, + 101, + 58, + 70, + 114, + 105, + 44, + 32, + 48, + 54, + 32, + 83, + 101, + 112, + 32, + 50, + 48, + 50, + 52, + 32, + 48, + 53, + 58, + 53, + 55, + 58, + 52, + 52, + 32, + 45, + 48, + 55, + 48, + 48, + 32, + 40, + 80, + 68, + 84, + 41, + 13, + 10, + 109, + 101, + 115, + 115, + 97, + 103, + 101, + 45, + 105, + 100, + 58, + 60, + 54, + 54, + 100, + 97, + 102, + 99, + 52, + 56, + 46, + 49, + 55, + 48, + 97, + 48, + 50, + 50, + 48, + 46, + 51, + 51, + 99, + 51, + 100, + 48, + 46, + 102, + 99, + 98, + 48, + 64, + 109, + 120, + 46, + 103, + 111, + 111, + 103, + 108, + 101, + 46, + 99, + 111, + 109, + 62, + 13, + 10, + 100, + 107, + 105, + 109, + 45, + 115, + 105, + 103, + 110, + 97, + 116, + 117, + 114, + 101, + 58, + 118, + 61, + 49, + 59, + 32, + 97, + 61, + 114, + 115, + 97, + 45, + 115, + 104, + 97, + 50, + 53, + 54, + 59, + 32, + 99, + 61, + 114, + 101, + 108, + 97, + 120, + 101, + 100, + 47, + 114, + 101, + 108, + 97, + 120, + 101, + 100, + 59, + 32, + 100, + 61, + 103, + 109, + 97, + 105, + 108, + 46, + 99, + 111, + 109, + 59, + 32, + 115, + 61, + 50, + 48, + 50, + 51, + 48, + 54, + 48, + 49, + 59, + 32, + 116, + 61, + 49, + 55, + 50, + 53, + 54, + 50, + 55, + 52, + 54, + 53, + 59, + 32, + 120, + 61, + 49, + 55, + 50, + 54, + 50, + 51, + 50, + 50, + 54, + 53, + 59, + 32, + 100, + 97, + 114, + 97, + 61, + 103, + 111, + 111, + 103, + 108, + 101, + 46, + 99, + 111, + 109, + 59, + 32, + 104, + 61, + 115, + 117, + 98, + 106, + 101, + 99, + 116, + 58, + 116, + 111, + 58, + 102, + 114, + 111, + 109, + 58, + 109, + 105, + 109, + 101, + 45, + 118, + 101, + 114, + 115, + 105, + 111, + 110, + 58, + 100, + 97, + 116, + 101, + 58, + 109, + 101, + 115, + 115, + 97, + 103, + 101, + 45, + 105, + 100, + 58, + 102, + 114, + 111, + 109, + 58, + 116, + 111, + 58, + 99, + 99, + 58, + 115, + 117, + 98, + 106, + 101, + 99, + 116, + 32, + 58, + 100, + 97, + 116, + 101, + 58, + 109, + 101, + 115, + 115, + 97, + 103, + 101, + 45, + 105, + 100, + 58, + 114, + 101, + 112, + 108, + 121, + 45, + 116, + 111, + 59, + 32, + 98, + 104, + 61, + 50, + 110, + 99, + 84, + 75, + 79, + 68, + 78, + 43, + 108, + 98, + 48, + 68, + 57, + 43, + 90, + 97, + 67, + 85, + 104, + 57, + 118, + 84, + 106, + 111, + 109, + 72, + 78, + 80, + 110, + 73, + 54, + 57, + 109, + 107, + 55, + 119, + 101, + 87, + 115, + 54, + 65, + 56, + 61, + 59, + 32, + 98, + 61, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 15, + 32, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "padded_body": [ + 45, + 45, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 54, + 48, + 53, + 48, + 48, + 49, + 54, + 56, + 53, + 53, + 54, + 56, + 48, + 56, + 51, + 55, + 50, + 54, + 57, + 61, + 61, + 13, + 10, + 67, + 111, + 110, + 116, + 101, + 110, + 116, + 45, + 84, + 121, + 112, + 101, + 58, + 32, + 116, + 101, + 120, + 116, + 47, + 104, + 116, + 109, + 108, + 59, + 32, + 99, + 104, + 97, + 114, + 115, + 101, + 116, + 61, + 34, + 117, + 116, + 102, + 45, + 56, + 34, + 13, + 10, + 77, + 73, + 77, + 69, + 45, + 86, + 101, + 114, + 115, + 105, + 111, + 110, + 58, + 32, + 49, + 46, + 48, + 13, + 10, + 67, + 111, + 110, + 116, + 101, + 110, + 116, + 45, + 84, + 114, + 97, + 110, + 115, + 102, + 101, + 114, + 45, + 69, + 110, + 99, + 111, + 100, + 105, + 110, + 103, + 58, + 32, + 113, + 117, + 111, + 116, + 101, + 100, + 45, + 112, + 114, + 105, + 110, + 116, + 97, + 98, + 108, + 101, + 13, + 10, + 67, + 111, + 110, + 116, + 101, + 110, + 116, + 45, + 84, + 121, + 112, + 101, + 58, + 32, + 116, + 101, + 120, + 116, + 47, + 104, + 116, + 109, + 108, + 59, + 32, + 99, + 104, + 97, + 114, + 115, + 101, + 116, + 61, + 117, + 116, + 102, + 45, + 56, + 13, + 10, + 13, + 10, + 13, + 10, + 32, + 60, + 104, + 116, + 109, + 108, + 62, + 13, + 10, + 32, + 60, + 98, + 111, + 100, + 121, + 62, + 13, + 10, + 32, + 60, + 104, + 49, + 62, + 72, + 101, + 108, + 108, + 111, + 33, + 60, + 47, + 104, + 49, + 62, + 13, + 10, + 32, + 60, + 112, + 62, + 84, + 104, + 105, + 115, + 32, + 105, + 115, + 32, + 97, + 32, + 116, + 101, + 115, + 116, + 32, + 101, + 109, + 97, + 105, + 108, + 32, + 119, + 105, + 116, + 104, + 32, + 97, + 32, + 98, + 97, + 115, + 105, + 99, + 32, + 72, + 84, + 77, + 76, + 32, + 98, + 111, + 100, + 121, + 46, + 60, + 47, + 112, + 62, + 13, + 10, + 32, + 60, + 100, + 105, + 118, + 32, + 105, + 100, + 61, + 51, + 68, + 34, + 122, + 107, + 101, + 109, + 97, + 105, + 108, + 34, + 62, + 65, + 99, + 99, + 101, + 112, + 116, + 32, + 103, + 117, + 97, + 114, + 100, + 105, + 97, + 110, + 32, + 114, + 101, + 113, + 117, + 101, + 115, + 116, + 32, + 102, + 111, + 114, + 32, + 48, + 120, + 48, + 67, + 48, + 54, + 54, + 56, + 56, + 101, + 54, + 49, + 67, + 48, + 54, + 52, + 54, + 54, + 69, + 61, + 13, + 10, + 50, + 97, + 53, + 67, + 54, + 102, + 69, + 52, + 69, + 49, + 53, + 99, + 51, + 53, + 57, + 50, + 54, + 48, + 97, + 51, + 51, + 102, + 51, + 32, + 67, + 111, + 100, + 101, + 32, + 49, + 49, + 54, + 50, + 101, + 98, + 102, + 102, + 52, + 48, + 57, + 49, + 56, + 97, + 102, + 101, + 53, + 51, + 48, + 53, + 101, + 54, + 56, + 51, + 57, + 54, + 102, + 48, + 50, + 56, + 51, + 101, + 98, + 54, + 55, + 53, + 57, + 48, + 49, + 100, + 48, + 51, + 56, + 55, + 102, + 57, + 61, + 13, + 10, + 55, + 100, + 50, + 49, + 57, + 50, + 56, + 100, + 52, + 50, + 51, + 97, + 97, + 97, + 48, + 98, + 53, + 52, + 60, + 47, + 100, + 105, + 118, + 62, + 61, + 50, + 48, + 13, + 10, + 32, + 60, + 47, + 98, + 111, + 100, + 121, + 62, + 13, + 10, + 32, + 60, + 47, + 104, + 116, + 109, + 108, + 62, + 13, + 10, + 32, + 61, + 50, + 48, + 13, + 10, + 45, + 45, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 61, + 54, + 48, + 53, + 48, + 48, + 49, + 54, + 56, + 53, + 53, + 54, + 56, + 48, + 56, + 51, + 55, + 50, + 54, + 57, + 61, + 61, + 45, + 45, + 13, + 10, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16, + 112, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "body_hash_idx": 436, + "public_key": [ + "2107195391459410975264579855291297887", + "2562632063603354817278035230349645235", + "1868388447387859563289339873373526818", + "2159353473203648408714805618210333973", + "351789365378952303483249084740952389", + "659717315519250910761248850885776286", + "1321773785542335225811636767147612036", + "258646249156909342262859240016844424", + "644872192691135519287736182201377504", + "174898460680981733302111356557122107", + "1068744134187917319695255728151595132", + "1870792114609696396265442109963534232", + "8288818605536063568933922407756344", + "1446710439657393605686016190803199177", + "2256068140678002554491951090436701670", + "518946826903468667178458656376730744", + "3222036726675473160989497427257757" + ], + "signature": [ + "170161271844255892981997056109468295", + "2042410320678089637820651285407478756", + "2235307951907446725362990721960277744", + "2558650872283482274023232178928077002", + "1125115414447411231828809260942904609", + "2396701783176084287341878147443533109", + "2128856280301536390906877240389145121", + "2428098792522595894701475799989919597", + "1647552530172515032677576620955308208", + "2527537180972491287857094609185809092", + "2132950398601810533565118801188358141", + "160538878880934704009688085302112521", + "898519688023416454463467167922781011", + "258221678414411925992593903157944861", + "1423180960707426692015227448675294049", + "1156922850624474726553341869246641892", + "1773570027362757618569452574560009" + ], + "padded_header_len": 512, + "padded_body_len": 576, + "precomputed_sha": [ + 106, + 9, + 230, + 103, + 187, + 103, + 174, + 133, + 60, + 110, + 243, + 114, + 165, + 79, + 245, + 58, + 81, + 14, + 82, + 127, + 155, + 5, + 104, + 140, + 31, + 131, + 217, + 171, + 91, + 224, + 205, + 25 + ], + "account_code": "0x1162ebff40918afe5305e68396f0283eb675901d0387f97d21928d423aaa0b54", + "from_addr_idx": 69, + "domain_idx": 17, + "timestamp_idx": 297, + "code_idx": 380, + "command_idx": 0, + "padded_cleaned_body": null +} \ No newline at end of file diff --git a/packages/contracts/README.md b/packages/contracts/README.md index e3a36040..0df21735 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -27,10 +27,10 @@ Run integration tests Before running integration tests, you need to make a `packages/contracts/test/build_integration` directory, download the zip file from the following link, and place its unzipped directory under that directory. https://drive.google.com/file/d/1XDPFIL5YK8JzLGoTjmHLXO9zMDjSQcJH/view?usp=sharing -Then, move `email_auth.zkey` and `email_auth.wasm` in the unzipped directory `params` to `build_integration`. +Then, move `email_auth_with_body_parsing_with_qp_encoding.zkey` and `email_auth_with_body_parsing_with_qp_encoding.wasm` in the unzipped directory `params` to `build_integration`. -Run each integration tests **one by one** as each test will consume lot of memory. +Run each integration tests **one by one** as each test will consume a lot of memory. ```bash Eg: contracts % forge test --skip '*ZKSync*' --match-contract "IntegrationTest" -vvv --chain 8453 --ffi ``` @@ -48,20 +48,20 @@ After deploying common contracts, you can deploy a proxy contract of `SimpleWall ## Specification There are four main contracts that developers should understand: `IDKIMRegistry`, `Verifier`, `EmailAuth` and `EmailAccountRecovery`. -While the first three contracts are agnostic to usecases of our SDK, the last one is an abstract contract only for our email-based account recovery. +While the first three contracts are agnostic to use cases of our SDK, the last one is an abstract contract only for our email-based account recovery. ### `IDKIMRegistry` Contract It is an interface of the DKIM registry contract that traces public keys registered for each email domain in DNS. It is defined in [the zk-email library](https://github.com/zkemail/zk-email-verify/blob/main/packages/contracts/interfaces/IDKIMRegistry.sol). -It requires a function `isDKIMPublicKeyHashValid(string domainName, bytes32 publicKeyHash) view returns (bool)`: it returns true iff the given hash of the public key `publicKeyHash` is registered for the given email-domain name `domainName`. +It requires a function `isDKIMPublicKeyHashValid(string domainName, bytes32 publicKeyHash) view returns (bool)`: it returns true if the given hash of the public key `publicKeyHash` is registered for the given email-domain name `domainName`. One of its implementations is [`ECDSAOwnedDKIMRegistry`](https://github.com/zkemail/ether-email-auth/blob/main/packages/contracts/src/utils/ECDSAOwnedDKIMRegistry.sol). It stores the Ethereum address `signer` who can update the registry. -We also provide another implementation called [`ForwardDKIMRegistry`](https://github.com/zkemail/ether-email-auth/blob/main/packages/contracts/src/utils/ForwardDKIMRegistry.sol). It stores an address of any internal DKIM registry and forwards its outputs. We can use it to upgrade a proxy of the ECDSAOwnedDKIMRegistry registry to a new DKIM registry with a different storage slots design by 1) upgrading its implementation into ForwardDKIMRegistry and 2) calling resetStorageForUpgradeFromECDSAOwnedDKIMRegistry function with an address of the internal DKIM registry. +We also provide another implementation called [`ForwardDKIMRegistry`](https://github.com/zkemail/ether-email-auth/blob/main/packages/contracts/src/utils/ForwardDKIMRegistry.sol). It stores an address of any internal DKIM registry and forwards its outputs. We can use it to upgrade a proxy of the ECDSAOwnedDKIMRegistry registry to a new DKIM registry with a different storage slots design by 1) upgrading its implementation into ForwardDKIMRegistry and 2) calling `resetStorageForUpgradeFromECDSAOwnedDKIMRegistry` function with an address of the internal DKIM registry. ### `Verifier` Contract -It has a responsibility to verify a ZK proof for the [`email_auth.circom` circuit](https://github.com/zkemail/ether-email-auth/blob/main/packages/circuits/src/email_auth.circom). +It has the responsibility to verify a ZK proof for the [`email_auth_with_body_parsing_with_qp_encoding.circom` circuit](https://github.com/zkemail/ether-email-auth/blob/main/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom). It is implemented in [`utils/Verifier.sol`](https://github.com/zkemail/ether-email-auth/blob/main/packages/contracts/src/utils/Verifier.sol). It defines a structure `EmailProof` consisting of the ZK proof and data of the instances necessary for proof verification as follows: @@ -70,34 +70,34 @@ struct EmailProof { string domainName; // Domain name of the sender's email bytes32 publicKeyHash; // Hash of the DKIM public key used in email/proof uint timestamp; // Timestamp of the email - string maskedSubject; // Masked subject of the email + string maskedCommand; // Masked command of the email bytes32 emailNullifier; // Nullifier of the email to prevent its reuse. bytes32 accountSalt; // Create2 salt of the account - bool isCodeExist; // Check if the account code is exist + bool isCodeExist; // Check if the account code exists bytes proof; // ZK Proof of Email } ``` -Using that, it provides a function `function verifyEmailProof(EmailProof memory proof) public view returns (bool)`: it takes as input the `EmailProof proof` and returns true iff the proof is valid. Notably, it internally calls [`Groth16Verifier.sol`](https://github.com/zkemail/ether-email-auth/blob/main/packages/contracts/src/utils/Groth16Verifier.sol) generated by snarkjs from the verifying key of the [`email_auth.circom` circuit](https://github.com/zkemail/ether-email-auth/blob/main/packages/circuits/src/email_auth.circom). +Using that, it provides a function `function verifyEmailProof(EmailProof memory proof) public view returns (bool)`: it takes as input the `EmailProof proof` and returns true if the proof is valid. Notably, it internally calls [`Groth16Verifier.sol`](https://github.com/zkemail/ether-email-auth/blob/main/packages/contracts/src/utils/Groth16Verifier.sol) generated by snarkjs from the verifying key of the [`email_auth_with_body_parsing_with_qp_encoding.circom` circuit](https://github.com/zkemail/ether-email-auth/blob/main/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom). ### `EmailAuth` Contract It is a contract deployed for each email user to verify an email-auth message from that user. The structure of the email-auth message is defined as follows: ``` struct EmailAuthMsg { - uint templateId; // The ID of the subject template that the email subject should satisfy. - bytes[] subjectParams; // The parameters in the email subject, which should be taken according to the specified subject template. - uint skipedSubjectPrefix; // The number of skiiped bytes in the email subject. + uint templateId; // The ID of the command template that the email command should satisfy. + bytes[] commandParams; // The parameters in the email command, which should be taken according to the specified command template. + uint skippedCommandPrefix; // The number of skipped bytes in the email command. EmailProof proof; // The email proof containing the zk proof and other necessary information for the email verification by the verifier contract. -} -``` +} +``` It has the following storage variables. - `address owner`: an address of the contract owner. - `bytes32 accountSalt`: an `accountSalt` used for the CREATE2 salt of this contract. - `DKIMRegistry dkim`: an instance of the DKIM registry contract. - `Verifier verifier`: an instance of the Verifier contract. -- `address controller`: an address of a controller contract, defining the subject templates supported by this contract. -- `mapping(uint=>string[]) subjectTemplates`: a mapping of the supported subject templates associated with its ID. +- `address controller`: an address of a controller contract, defining the command templates supported by this contract. +- `mapping(uint=>string[]) commandTemplates`: a mapping of the supported command templates associated with its ID. - `mapping(bytes32⇒bytes32) authedHash`: a mapping of the hash of the authorized message associated with its `emailNullifier`. - `uint lastTimestamp`: the latest `timestamp` in the verified `EmailAuthMsg`. - `mapping(bytes32=>bool) usedNullifiers`: a mapping storing the used `emailNullifier` bytes. @@ -137,33 +137,33 @@ It provides the following functions. 1. Assert `msg.sender==owner` . 2. Assert `_dkimRegistryAddr!=0`. 3. Update `dkim` to `DKIMRegistry(_dkimRegistryAddr)`. -- `getSubjectTemplate(uint _templateId) public view returns (string[] memory)` - 1. Assert that the template for `_templateId` exists, i.e., `subjectTemplates[_templateId].length >0` holds. - 2. Return `subjectTemplates[_templateId]`. -- `insertSubjectTemplate(uint _templateId, string[] _subjectTemplate)` - 1. Assert `_subjectTemplate.length>0` . +- `getCommandTemplate(uint _templateId) public view returns (string[] memory)` + 1. Assert that the template for `_templateId` exists, i.e., `commandTemplates[_templateId].length >0` holds. + 2. Return `commandTemplates[_templateId]`. +- `insertCommandTemplate(uint _templateId, string[] _commandTemplate)` + 1. Assert `_commandTemplate.length>0` . 2. Assert `msg.sender==controller`. - 3. Assert `subjectTemplates[_templateId].length == 0`, i.e., no template has not been registered with `_templateId`. - 4. Set `subjectTemplates[_templateId]=_subjectTemplate`. -- `updateSubjectTemplate(uint _templateId, string[] _subjectTemplate)` - 1. Assert `_subjectTemplate.length>0` . + 3. Assert `commandTemplates[_templateId].length == 0`, i.e., no template has not been registered with `_templateId`. + 4. Set `commandTemplates[_templateId]=_commandTemplate`. +- `updateCommandTemplate(uint _templateId, string[] _commandTemplate)` + 1. Assert `_commandTemplate.length>0` . 2. Assert `msg.sender==controller`. - 3. Assert `subjectTemplates[_templateId].length != 0` , i.e., any template has been already registered with `_templateId`. - 4. Set `subjectTemplates[_templateId]=_subjectTemplate`. -- `deleteSubjectTemplate(uint _templateId)` + 3. Assert `commandTemplates[_templateId].length != 0` , i.e., any template has been already registered with `_templateId`. + 4. Set `commandTemplates[_templateId]=_commandTemplate`. +- `deleteCommandTemplate(uint _templateId)` 1. Assert `msg.sender==controller`. - 2. Assert `subjectTemplates[_templateId].length > 0`, i.e., any template has been already registered with `_templateId`. - 3. `delete subjectTemplates[_templateId]`. + 2. Assert `commandTemplates[_templateId].length > 0`, i.e., any template has been already registered with `_templateId`. + 3. `delete commandTemplates[_templateId]`. - `authEmail(EmailAuthMsg emailAuthMsg) returns (bytes32)` 1. Assert `msg.sender==controller`. - 2. Let `string[] memory template = subjectTemplates[emailAuthMsg.templateId]`. + 2. Let `string[] memory template = commandTemplates[emailAuthMsg.templateId]`. 3. Assert `template.length > 0`. 4. Assert `dkim.isDKIMPublicKeyHashValid(emailAuthMsg.proof.domain, emailAuthMsg.proof.publicKeyHash)==true`. 5. Assert `usedNullifiers[emailAuthMsg.proof.emailNullifier]==false` and set `usedNullifiers[emailAuthMsg.proof.emailNullifier]` to `true`. 6. Assert `accountSalt==emailAuthMsg.proof.accountSalt`. 7. If `timestampCheckEnabled` is true, assert that `emailAuthMsg.proof.timestamp` is zero OR `lastTimestamp < emailAuthMsg.proof.timestamp`, and update `lastTimestamp` to `emailAuthMsg.proof.timestamp`. - 8. Construct an expected subject `expectedSubject` from `template` and the values of `emailAuthMsg.subjectParams`. - 9. Assert that `expectedSubject` is equal to `emailAuthMsg.proof.maskedSubject[skipedSubjectPrefix:]` , i.e., the string of `emailAuthMsg.proof.maskedSubject` from the `skipedSubjectPrefix`-th byte. + 8. Construct an expected command `expectedCommand` from `template` and the values of `emailAuthMsg.commandParams`. + 9. Assert that `expectedCommand` is equal to `emailAuthMsg.proof.maskedCommand[skippedCommandPrefix:]` , i.e., the string of `emailAuthMsg.proof.maskedCommand` from the `skippedCommandPrefix`-th byte. 10. Assert `verifier.verifyEmailProof(emailAuthMsg.proof)==true`. - `isValidSignature(bytes32 _hash, bytes memory _signature) public view returns (bytes4 magicValue)` 1. Parse `_signature` as `(bytes32 emailNullifier)`. @@ -173,20 +173,20 @@ It provides the following functions. 2. Set `timestampCheckEnabled` to `enabled`. ### `EmailAccountRecovery` Contract -It is an abstract contract for each smart account brand to implement the email-based account recovery. **Each smart account provider only needs to implement the following functions in a new contract called controller.** In the following, the `templateIdx` is different from `templateId` in the email-auth contract in the sense that the `templateIdx` is an incremental index defined for each of the subject templates in `acceptanceSubjectTemplates()` and `recoverySubjectTemplates()`. +It is an abstract contract for each smart account brand to implement the email-based account recovery. **Each smart account provider only needs to implement the following functions in a new contract called controller.** In the following, the `templateIdx` is different from `templateId` in the email-auth contract in the sense that the `templateIdx` is an incremental index defined for each of the command templates in `acceptanceCommandTemplates()` and `recoveryCommandTemplates()`. - `isActivated(address recoveredAccount) public view virtual returns (bool)`: it returns if the account to be recovered has already activated the controller (the contract implementing `EmailAccountRecovery`). -- `acceptanceSubjectTemplates() public view virtual returns (string[][])`: it returns multiple subject templates for an email to accept becoming a guardian (acceptance email). -- `recoverySubjectTemplates() public view virtual returns (string[][])`: it returns multiple subject templates for an email to confirm the account recovery (recovery email). -- `extractRecoveredAccountFromAcceptanceSubject(bytes[] memory subjectParams, uint templateIdx) public view virtual returns (address)`: it takes as input the parameters `subjectParams` and the index of the chosen subject template `templateIdx` in those for acceptance emails. -- `extractRecoveredAccountFromRecoverySubject(bytes[] memory subjectParams, uint templateIdx) public view virtual returns (address)`: it takes as input the parameters `subjectParams` and the index of the chosen subject template `templateIdx` in those for recovery emails. -- `acceptGuardian(address guardian, uint templateIdx, bytes[] subjectParams, bytes32 emailNullifier) internal virtual`: it takes as input the Ethereum address `guardian` corresponding to the guardian's email address, the index `templateIdx` of the subject template in the output of `acceptanceSubjectTemplates()`, the parameter values of the variable parts `subjectParams` in the template `acceptanceSubjectTemplates()[templateIdx]`, and an email nullifier `emailNullifier`. It is called after verifying the email-auth message to accept the role of the guardian; thus you can assume the arguments are already verified. -- `processRecovery(address guardian, uint templateIdx, bytes[] subjectParams, bytes32 emailNullifier) internal virtual`: it takes as input the Ethereum address `guardian` corresponding to the guardian's email address, the index `templateIdx` of the subject template in the output of `recoverySubjectTemplates()`, the parameter values of the variable parts `subjectParams` in the template `recoverySubjectTemplates()[templateIdx]`, and an email nullifier `emailNullifier`. It is called after verifying the email-auth message to confirm the recovery; thus you can assume the arguments are already verified. +- `acceptanceCommandTemplates() public view virtual returns (string[][])`: it returns multiple command templates for an email to accept becoming a guardian (acceptance email). +- `recoveryCommandTemplates() public view virtual returns (string[][])`: it returns multiple command templates for an email to confirm the account recovery (recovery email). +- `extractRecoveredAccountFromAcceptanceCommand(bytes[] memory commandParams, uint templateIdx) public view virtual returns (address)`: it takes as input the parameters `commandParams` and the index of the chosen command template `templateIdx` in those for acceptance emails. +- `extractRecoveredAccountFromRecoveryCommand(bytes[] memory commandParams, uint templateIdx) public view virtual returns (address)`: it takes as input the parameters `commandParams` and the index of the chosen command template `templateIdx` in those for recovery emails. +- `acceptGuardian(address guardian, uint templateIdx, bytes[] commandParams, bytes32 emailNullifier) internal virtual`: it takes as input the Ethereum address `guardian` corresponding to the guardian's email address, the index `templateIdx` of the command template in the output of `acceptanceCommandTemplates()`, the parameter values of the variable parts `commandParams` in the template `acceptanceCommandTemplates()[templateIdx]`, and an email nullifier `emailNullifier`. It is called after verifying the email-auth message to accept the role of the guardian; thus you can assume the arguments are already verified. +- `processRecovery(address guardian, uint templateIdx, bytes[] commandParams, bytes32 emailNullifier) internal virtual`: it takes as input the Ethereum address `guardian` corresponding to the guardian's email address, the index `templateIdx` of the command template in the output of `recoveryCommandTemplates()`, the parameter values of the variable parts `commandParams` in the template `recoveryCommandTemplates()[templateIdx]`, and an email nullifier `emailNullifier`. It is called after verifying the email-auth message to confirm the recovery; thus you can assume the arguments are already verified. - `completeRecovery(address account, bytes memory completeCalldata) external virtual`: it can be called by anyone, in particular a Relayer, when completing the account recovery. It should first check if the condition for the recovery of `account` holds and then update its owner's address in the wallet contract. It also provides the following entry functions with their default implementations, called by the Relayer. - `handleAcceptance(EmailAuthMsg emailAuthMsg, uint templateIdx) external` - 1. Extract an account address to be recovered `recoveredAccount` by calling `extractRecoveredAccountFromAcceptanceSubject`. + 1. Extract an account address to be recovered `recoveredAccount` by calling `extractRecoveredAccountFromAcceptanceCommand`. 2. Let `address guardian = CREATE2(emailAuthMsg.proof.accountSalt, ERC1967Proxy.creationCode, emailAuthImplementation(), (emailAuthMsg.proof.accountSalt))`. 3. Let `uint templateId = keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "ACCEPTANCE", templateIdx)`. 4. Assert that `templateId` is equal to `emailAuthMsg.templateId`. @@ -194,19 +194,19 @@ It also provides the following entry functions with their default implementation 6. If the `EmailAuth` contract of `guardian` has not been deployed, deploy the proxy contract of `emailAuthImplementation()`. Its salt is `emailAuthMsg.proof.accountSalt` and its initialization parameter is `recoveredAccount`, `emailAuthMsg.proof.accountSalt`, and `address(this)`, which is a controller of the deployed contract. 7. If the `EmailAuth` contract of `guardian` has not been deployed, call `EmailAuth(guardian).initDKIMRegistry(dkim())`. 8. If the `EmailAuth` contract of `guardian` has not been deployed, call `EmailAuth(guardian).initVerifier(verifier())`. - 9. If the `EmailAuth` contract of `guardian` has not been deployed, for each `template` in `acceptanceSubjectTemplates()` along with its index `idx`, call `EmailAuth(guardian).insertSubjectTemplate(keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "ACCEPTANCE", idx), template)`. - 10. If the `EmailAuth` contract of `guardian` has not been deployed, for each `template` in `recoverySubjectTemplates()` along with its index `idx`, call `EmailAuth(guardian).insertSubjectTemplate(keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "RECOVERY", idx), template)`. + 9. If the `EmailAuth` contract of `guardian` has not been deployed, for each `template` in `acceptanceCommandTemplates()` along with its index `idx`, call `EmailAuth(guardian).insertCommandTemplate(keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "ACCEPTANCE", idx), template)`. + 10. If the `EmailAuth` contract of `guardian` has not been deployed, for each `template` in `recoveryCommandTemplates()` along with its index `idx`, call `EmailAuth(guardian).insertCommandTemplate(keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "RECOVERY", idx), template)`. 11. If the `EmailAuth` contract of `guardian` has been already deployed, assert that its `controller` is equal to `address(this)`. - 11. Assert that `EmailAuth(guardian).authEmail(1emailAuthMsg)` returns no error. - 12. Call `acceptGuardian(guardian, templateIdx, emailAuthMsg.subjectParams, emailAuthMsg.proof.emailNullifier)`. + 11. Assert that `EmailAuth(guardian).authEmail(emailAuthMsg)` returns no error. + 12. Call `acceptGuardian(guardian, templateIdx, emailAuthMsg.commandParams, emailAuthMsg.proof.emailNullifier)`. - `handleRecovery(EmailAuthMsg emailAuthMsg, uint templateIdx) external` - 1. Extract an account address to be recovered `recoveredAccount` by calling `extractRecoveredAccountFromRecoverySubject`. + 1. Extract an account address to be recovered `recoveredAccount` by calling `extractRecoveredAccountFromRecoveryCommand`. 1. Let `address guardian = CREATE2(emailAuthMsg.proof.accountSalt, ERC1967Proxy.creationCode, emailAuthImplementation(), (emailAuthMsg.proof.accountSalt))`. 2. Assert that the contract of `guardian` has been already deployed. 3. Let `uint templateId=keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "RECOVERY", templateIdx)`. 4. Assert that `templateId` is equal to `emailAuthMsg.templateId`. 5. Assert that `EmailAuth(guardian).authEmail(emailAuthMsg)` returns no error. - 6. Call `processRecovery(guardian, templateIdx, emailAuthMsg.subjectParams, emailAuthMsg.proof.emailNullifier)`. + 6. Call `processRecovery(guardian, templateIdx, emailAuthMsg.commandParams, emailAuthMsg.proof.emailNullifier)`. # For zkSync @@ -239,11 +239,11 @@ chmod a+x {BINARY_NAME} mv {BINARY_NAME} ~/.zksync/. ``` -In addition, there are the problem with foundy-zksync. Currently they can't resolve contracts in monorepo's node_modules. +In addition, there are problems with foundry-zksync. Currently, they can't resolve contracts in monorepo's node_modules. https://github.com/matter-labs/foundry-zksync/issues/411 -To fix this, you should copy `node_modules` in the project root dir to `packages/contracts/node_modules`. And then you should replace `libs = ["../../node_modules", "lib"]` to `libs = ["node_modules", "lib"]` in `foundry.toml`. At the end, you should replace `../../node_modules` to `node_modules` in `remappings.txt`. +To fix this, you should copy `node_modules` in the project root dir to `packages/contracts/node_modules`. And then you should replace `libs = ["../../node_modules", "lib"]` with `libs = ["node_modules", "lib"]` in `foundry.toml`. At the end, you should replace `../../node_modules` with `node_modules` in `remappings.txt`. Next, you should uncomment the following lines in `foundry.toml`. @@ -292,7 +292,121 @@ Incidentally, the above line already exists in `foundy.toml` with it commented o About Create2, `L2ContractHelper.computeCreate2Address` should be used. And `type(ERC1967Proxy).creationCode` doesn't work correctly in zkSync. We need to hardcode the `type(ERC1967Proxy).creationCode` to bytecodeHash. -Perhaps that is different value in each compiler version. +Perhaps that is a different value in each compiler version. + +You should replace the following line to the correct hash. +packages/contracts/src/EmailAccountRecovery.sol:L111 + +See, test/ComputeCreate2Address.t.sol + +# For zkSync testing + +Run `yarn zktest`. + +Current foundry-zksync overrides the foundry behavior. If you installed foundry-zksync, some EVM code will be different and some test cases will fail. If you want to test on other EVM, please install foundry. + +Even if the contract size is fine for EVM, it may exceed the bytecode size limit for zksync, and the test may not be executed. +Therefore, EmailAccountRecovery.t.sol has been split. + +Currently, some test cases are not working correctly because there is an issue about missing libraries. + +https://github.com/matter-labs/foundry-zksync/issues/382 + +Failing test cases are here. + +DKIMRegistryUpgrade.t.sol + +- testAuthEmail() + +EmailAuth.t.sol + +- testAuthEmail() +- testExpectRevertAuthEmailEmailNullifierAlreadyUsed() +- testExpectRevertAuthEmailInvalidEmailProof() +- testExpectRevertAuthEmailInvalidCommand() +- testExpectRevertAuthEmailInvalidTimestamp() + +EmailAuthWithUserOverrideableDkim.t.sol + +- testAuthEmail() + +# For integration testing + +To pass the integration testing, you should use era-test-node. +See the following URL and install it. +https://github.com/matter-labs/era-test-node + +Run the era-test-node + +``` +era_test_node fork https://sepolia.era.zksync.dev +``` + +You remove .zksolc-libraries-cache directory, and run the following command. + +``` +forge build --zksync --zk-detect-missing-libraries +``` + +As you saw before, you need to deploy missing libraries. +You can deploy them by the following command for example. + +``` +Missing libraries detected: src/libraries/CommandUtils.sol:CommandUtils, src/libraries/DecimalUtils.sol:DecimalUtils + +Run the following command in order to deploy each missing library: + +forge create src/libraries/DecimalUtils.sol:DecimalUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url http://127.0.0.1:8011 --chain 260 --zksync +forge create src/libraries/CommandUtils.sol:CommandUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url http://127.0.0.1:8011 --chain 260 --zksync --libraries src/libraries/DecimalUtils.sol:DecimalUtils:{DECIMAL_UTILS_DEPLOYED_ADDRESS} +``` + +Set the libraries in foundry.toml using the above deployed address. + +Due to this change in the address of the missing libraries, the value of the proxyBytecodeHash must also be changed: change the value of the proxyBytecodeHash in E-mailAccountRecoveryZKSync.sol. + +And then, run the integration testing. + +``` +forge test --match-contract "IntegrationZKSyncTest" --system-mode=true --zksync --gas-limit 1000000000 --chain 300 -vvv --ffi +``` + +# For zkSync deployment (For test net) + +You need to edit .env at first. +Second, just run the following commands with `--zksync` + +``` +source .env +forge script script/DeployRecoveryControllerZKSync.s.sol:Deploy --zksync --rpc-url $RPC_URL --broadcast --slow --via-ir --system-mode true -vvvv +``` + +As you saw before, you need to deploy missing libraries. +You can deploy them by the following command for example. + +``` +Missing libraries detected: src/libraries/CommandUtils.sol:CommandUtils, src/libraries/DecimalUtils.sol:DecimalUtils + +Run the following command in order to deploy each missing library: + +forge create src/libraries/DecimalUtils.sol:DecimalUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url https://sepolia.era.zksync.dev --chain 300 --zksync +forge create src/libraries/CommandUtils.sol:CommandUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url https://sepolia.era.zksync.dev --chain 300 --zksync --libraries src/libraries/DecimalUtils.sol:DecimalUtils:{DECIMAL_UTILS_DEPLOYED_ADDRESS} +``` + +After that, you can see the following line in foundry.toml. +Also, this line is needed only for foundry-zksync, if you use foundry, please remove this line. Otherwise, the test will fail. + +``` +libraries = [ + "{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:{DEPLOYED_ADDRESS}", + "{PROJECT_DIR}/packages/contracts/src/libraries/CommandUtils.sol:CommandUtils:{DEPLOYED_ADDRESS}"] +``` + +Incidentally, the above line already exists in `foundy.toml` with it commented out, if you uncomment it by replacing `{PROJECT_DIR}` with the appropriate path, it will also work. + +About Create2, `L2ContractHelper.computeCreate2Address` should be used. +And `type(ERC1967Proxy).creationCode` doesn't work correctly in zkSync. +We need to hardcode the `type(ERC1967Proxy).creationCode` to bytecodeHash. +Perhaps that is a different value in each compiler version. You should replace the following line to the correct hash. packages/contracts/src/EmailAccountRecovery.sol:L111 @@ -303,12 +417,12 @@ See, test/ComputeCreate2Address.t.sol Run `yarn zktest`. -Current foundry-zksync overrides the foundry behavior. If you installed foundry-zksync, some EVM code will be different and some test cases will be failed. If you want to test on other EVM, please install foundry. +Current foundry-zksync overrides the foundry behavior. If you installed foundry-zksync, some EVM code will be different and some test cases will fail. If you want to test on other EVM, please install foundry. Even if the contract size is fine for EVM, it may exceed the bytecode size limit for zksync, and the test may not be executed. -Therefore, EmailAccountRecovery.t.sol has been splited. +Therefore, EmailAccountRecovery.t.sol has been split. -Currently some test cases are not work correctly because there is a issue about missing libraries. +Currently, some test cases are not working correctly because there is an issue about missing libraries. https://github.com/matter-labs/foundry-zksync/issues/382 @@ -323,7 +437,7 @@ EmailAuth.t.sol - testAuthEmail() - testExpectRevertAuthEmailEmailNullifierAlreadyUsed() - testExpectRevertAuthEmailInvalidEmailProof() -- testExpectRevertAuthEmailInvalidSubject() +- testExpectRevertAuthEmailInvalidCommand() - testExpectRevertAuthEmailInvalidTimestamp() EmailAuthWithUserOverrideableDkim.t.sol @@ -332,7 +446,7 @@ EmailAuthWithUserOverrideableDkim.t.sol # For integration testing -To pass the instegration testing, you should use era-test-node. +To pass the integration testing, you should use era-test-node. See the following URL and install it. https://github.com/matter-labs/era-test-node From ce2fc6d0d278ed6cbf511daf606b97162b8a1ee8 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Tue, 24 Sep 2024 08:55:40 +0900 Subject: [PATCH 063/121] Fix typo and remove unnecessary file --- packages/circuits/input.json | 2136 ------------------------------- packages/contracts/package.json | 2 +- 2 files changed, 1 insertion(+), 2137 deletions(-) delete mode 100644 packages/circuits/input.json diff --git a/packages/circuits/input.json b/packages/circuits/input.json deleted file mode 100644 index 7aec4db2..00000000 --- a/packages/circuits/input.json +++ /dev/null @@ -1,2136 +0,0 @@ -{ - "padded_header": [ - 115, - 117, - 98, - 106, - 101, - 99, - 116, - 58, - 69, - 109, - 97, - 105, - 108, - 32, - 65, - 99, - 99, - 111, - 117, - 110, - 116, - 32, - 82, - 101, - 99, - 111, - 118, - 101, - 114, - 121, - 32, - 84, - 101, - 115, - 116, - 49, - 13, - 10, - 116, - 111, - 58, - 115, - 117, - 101, - 103, - 97, - 109, - 105, - 115, - 111, - 114, - 97, - 64, - 103, - 109, - 97, - 105, - 108, - 46, - 99, - 111, - 109, - 13, - 10, - 102, - 114, - 111, - 109, - 58, - 101, - 109, - 97, - 105, - 119, - 97, - 108, - 108, - 101, - 116, - 46, - 97, - 108, - 105, - 99, - 101, - 64, - 103, - 109, - 97, - 105, - 108, - 46, - 99, - 111, - 109, - 13, - 10, - 109, - 105, - 109, - 101, - 45, - 118, - 101, - 114, - 115, - 105, - 111, - 110, - 58, - 49, - 46, - 48, - 13, - 10, - 100, - 97, - 116, - 101, - 58, - 70, - 114, - 105, - 44, - 32, - 48, - 54, - 32, - 83, - 101, - 112, - 32, - 50, - 48, - 50, - 52, - 32, - 48, - 53, - 58, - 53, - 55, - 58, - 52, - 52, - 32, - 45, - 48, - 55, - 48, - 48, - 32, - 40, - 80, - 68, - 84, - 41, - 13, - 10, - 109, - 101, - 115, - 115, - 97, - 103, - 101, - 45, - 105, - 100, - 58, - 60, - 54, - 54, - 100, - 97, - 102, - 99, - 52, - 56, - 46, - 49, - 55, - 48, - 97, - 48, - 50, - 50, - 48, - 46, - 51, - 51, - 99, - 51, - 100, - 48, - 46, - 102, - 99, - 98, - 48, - 64, - 109, - 120, - 46, - 103, - 111, - 111, - 103, - 108, - 101, - 46, - 99, - 111, - 109, - 62, - 13, - 10, - 100, - 107, - 105, - 109, - 45, - 115, - 105, - 103, - 110, - 97, - 116, - 117, - 114, - 101, - 58, - 118, - 61, - 49, - 59, - 32, - 97, - 61, - 114, - 115, - 97, - 45, - 115, - 104, - 97, - 50, - 53, - 54, - 59, - 32, - 99, - 61, - 114, - 101, - 108, - 97, - 120, - 101, - 100, - 47, - 114, - 101, - 108, - 97, - 120, - 101, - 100, - 59, - 32, - 100, - 61, - 103, - 109, - 97, - 105, - 108, - 46, - 99, - 111, - 109, - 59, - 32, - 115, - 61, - 50, - 48, - 50, - 51, - 48, - 54, - 48, - 49, - 59, - 32, - 116, - 61, - 49, - 55, - 50, - 53, - 54, - 50, - 55, - 52, - 54, - 53, - 59, - 32, - 120, - 61, - 49, - 55, - 50, - 54, - 50, - 51, - 50, - 50, - 54, - 53, - 59, - 32, - 100, - 97, - 114, - 97, - 61, - 103, - 111, - 111, - 103, - 108, - 101, - 46, - 99, - 111, - 109, - 59, - 32, - 104, - 61, - 115, - 117, - 98, - 106, - 101, - 99, - 116, - 58, - 116, - 111, - 58, - 102, - 114, - 111, - 109, - 58, - 109, - 105, - 109, - 101, - 45, - 118, - 101, - 114, - 115, - 105, - 111, - 110, - 58, - 100, - 97, - 116, - 101, - 58, - 109, - 101, - 115, - 115, - 97, - 103, - 101, - 45, - 105, - 100, - 58, - 102, - 114, - 111, - 109, - 58, - 116, - 111, - 58, - 99, - 99, - 58, - 115, - 117, - 98, - 106, - 101, - 99, - 116, - 32, - 58, - 100, - 97, - 116, - 101, - 58, - 109, - 101, - 115, - 115, - 97, - 103, - 101, - 45, - 105, - 100, - 58, - 114, - 101, - 112, - 108, - 121, - 45, - 116, - 111, - 59, - 32, - 98, - 104, - 61, - 50, - 110, - 99, - 84, - 75, - 79, - 68, - 78, - 43, - 108, - 98, - 48, - 68, - 57, - 43, - 90, - 97, - 67, - 85, - 104, - 57, - 118, - 84, - 106, - 111, - 109, - 72, - 78, - 80, - 110, - 73, - 54, - 57, - 109, - 107, - 55, - 119, - 101, - 87, - 115, - 54, - 65, - 56, - 61, - 59, - 32, - 98, - 61, - 128, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 15, - 32, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ], - "padded_body": [ - 45, - 45, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 54, - 48, - 53, - 48, - 48, - 49, - 54, - 56, - 53, - 53, - 54, - 56, - 48, - 56, - 51, - 55, - 50, - 54, - 57, - 61, - 61, - 13, - 10, - 67, - 111, - 110, - 116, - 101, - 110, - 116, - 45, - 84, - 121, - 112, - 101, - 58, - 32, - 116, - 101, - 120, - 116, - 47, - 104, - 116, - 109, - 108, - 59, - 32, - 99, - 104, - 97, - 114, - 115, - 101, - 116, - 61, - 34, - 117, - 116, - 102, - 45, - 56, - 34, - 13, - 10, - 77, - 73, - 77, - 69, - 45, - 86, - 101, - 114, - 115, - 105, - 111, - 110, - 58, - 32, - 49, - 46, - 48, - 13, - 10, - 67, - 111, - 110, - 116, - 101, - 110, - 116, - 45, - 84, - 114, - 97, - 110, - 115, - 102, - 101, - 114, - 45, - 69, - 110, - 99, - 111, - 100, - 105, - 110, - 103, - 58, - 32, - 113, - 117, - 111, - 116, - 101, - 100, - 45, - 112, - 114, - 105, - 110, - 116, - 97, - 98, - 108, - 101, - 13, - 10, - 67, - 111, - 110, - 116, - 101, - 110, - 116, - 45, - 84, - 121, - 112, - 101, - 58, - 32, - 116, - 101, - 120, - 116, - 47, - 104, - 116, - 109, - 108, - 59, - 32, - 99, - 104, - 97, - 114, - 115, - 101, - 116, - 61, - 117, - 116, - 102, - 45, - 56, - 13, - 10, - 13, - 10, - 13, - 10, - 32, - 60, - 104, - 116, - 109, - 108, - 62, - 13, - 10, - 32, - 60, - 98, - 111, - 100, - 121, - 62, - 13, - 10, - 32, - 60, - 104, - 49, - 62, - 72, - 101, - 108, - 108, - 111, - 33, - 60, - 47, - 104, - 49, - 62, - 13, - 10, - 32, - 60, - 112, - 62, - 84, - 104, - 105, - 115, - 32, - 105, - 115, - 32, - 97, - 32, - 116, - 101, - 115, - 116, - 32, - 101, - 109, - 97, - 105, - 108, - 32, - 119, - 105, - 116, - 104, - 32, - 97, - 32, - 98, - 97, - 115, - 105, - 99, - 32, - 72, - 84, - 77, - 76, - 32, - 98, - 111, - 100, - 121, - 46, - 60, - 47, - 112, - 62, - 13, - 10, - 32, - 60, - 100, - 105, - 118, - 32, - 105, - 100, - 61, - 51, - 68, - 34, - 122, - 107, - 101, - 109, - 97, - 105, - 108, - 34, - 62, - 65, - 99, - 99, - 101, - 112, - 116, - 32, - 103, - 117, - 97, - 114, - 100, - 105, - 97, - 110, - 32, - 114, - 101, - 113, - 117, - 101, - 115, - 116, - 32, - 102, - 111, - 114, - 32, - 48, - 120, - 48, - 67, - 48, - 54, - 54, - 56, - 56, - 101, - 54, - 49, - 67, - 48, - 54, - 52, - 54, - 54, - 69, - 61, - 13, - 10, - 50, - 97, - 53, - 67, - 54, - 102, - 69, - 52, - 69, - 49, - 53, - 99, - 51, - 53, - 57, - 50, - 54, - 48, - 97, - 51, - 51, - 102, - 51, - 32, - 67, - 111, - 100, - 101, - 32, - 49, - 49, - 54, - 50, - 101, - 98, - 102, - 102, - 52, - 48, - 57, - 49, - 56, - 97, - 102, - 101, - 53, - 51, - 48, - 53, - 101, - 54, - 56, - 51, - 57, - 54, - 102, - 48, - 50, - 56, - 51, - 101, - 98, - 54, - 55, - 53, - 57, - 48, - 49, - 100, - 48, - 51, - 56, - 55, - 102, - 57, - 61, - 13, - 10, - 55, - 100, - 50, - 49, - 57, - 50, - 56, - 100, - 52, - 50, - 51, - 97, - 97, - 97, - 48, - 98, - 53, - 52, - 60, - 47, - 100, - 105, - 118, - 62, - 61, - 50, - 48, - 13, - 10, - 32, - 60, - 47, - 98, - 111, - 100, - 121, - 62, - 13, - 10, - 32, - 60, - 47, - 104, - 116, - 109, - 108, - 62, - 13, - 10, - 32, - 61, - 50, - 48, - 13, - 10, - 45, - 45, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 61, - 54, - 48, - 53, - 48, - 48, - 49, - 54, - 56, - 53, - 53, - 54, - 56, - 48, - 56, - 51, - 55, - 50, - 54, - 57, - 61, - 61, - 45, - 45, - 13, - 10, - 128, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 16, - 112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ], - "body_hash_idx": 436, - "public_key": [ - "2107195391459410975264579855291297887", - "2562632063603354817278035230349645235", - "1868388447387859563289339873373526818", - "2159353473203648408714805618210333973", - "351789365378952303483249084740952389", - "659717315519250910761248850885776286", - "1321773785542335225811636767147612036", - "258646249156909342262859240016844424", - "644872192691135519287736182201377504", - "174898460680981733302111356557122107", - "1068744134187917319695255728151595132", - "1870792114609696396265442109963534232", - "8288818605536063568933922407756344", - "1446710439657393605686016190803199177", - "2256068140678002554491951090436701670", - "518946826903468667178458656376730744", - "3222036726675473160989497427257757" - ], - "signature": [ - "170161271844255892981997056109468295", - "2042410320678089637820651285407478756", - "2235307951907446725362990721960277744", - "2558650872283482274023232178928077002", - "1125115414447411231828809260942904609", - "2396701783176084287341878147443533109", - "2128856280301536390906877240389145121", - "2428098792522595894701475799989919597", - "1647552530172515032677576620955308208", - "2527537180972491287857094609185809092", - "2132950398601810533565118801188358141", - "160538878880934704009688085302112521", - "898519688023416454463467167922781011", - "258221678414411925992593903157944861", - "1423180960707426692015227448675294049", - "1156922850624474726553341869246641892", - "1773570027362757618569452574560009" - ], - "padded_header_len": 512, - "padded_body_len": 576, - "precomputed_sha": [ - 106, - 9, - 230, - 103, - 187, - 103, - 174, - 133, - 60, - 110, - 243, - 114, - 165, - 79, - 245, - 58, - 81, - 14, - 82, - 127, - 155, - 5, - 104, - 140, - 31, - 131, - 217, - 171, - 91, - 224, - 205, - 25 - ], - "account_code": "0x1162ebff40918afe5305e68396f0283eb675901d0387f97d21928d423aaa0b54", - "from_addr_idx": 69, - "domain_idx": 17, - "timestamp_idx": 297, - "code_idx": 380, - "command_idx": 0, - "padded_cleaned_body": null -} \ No newline at end of file diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 49b972d8..3fc1d004 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -6,7 +6,7 @@ "build": "forge build --skip '*ZKSync*'", "zkbuild": "forge build --zksync", "test": "forge test --no-match-test \"testIntegration\" --no-match-contract \".*Script.*\" --skip '*ZKSync*'", - "zktest": "forge test --no-match-test \"testIntegration\" --no-match-contract \".*Script.*\" --system-mode=true --zksync --gas-limit 1000000000 --chain 300",, + "zktest": "forge test --no-match-test \"testIntegration\" --no-match-contract \".*Script.*\" --system-mode=true --zksync --gas-limit 1000000000 --chain 300", "lint": "solhint 'src/**/*.sol'" }, "dependencies": { From 0f961e653b69a451da7f607cbca8cd0b1ddcc98b Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sun, 8 Sep 2024 20:03:56 +0530 Subject: [PATCH 064/121] chore: refactor --- .../eml_templates/credential_not_present.html | 3 ++- packages/relayer/src/core.rs | 8 +++---- packages/relayer/src/modules/mail.rs | 21 +++++++++++-------- .../src/modules/web_server/rest_api.rs | 6 ++---- ...ject_templates.rs => command_templates.rs} | 3 +-- packages/relayer/src/utils/mod.rs | 4 ++-- packages/relayer/src/utils/utils.rs | 4 ---- 7 files changed, 23 insertions(+), 26 deletions(-) rename packages/relayer/src/utils/{subject_templates.rs => command_templates.rs} (99%) diff --git a/packages/relayer/eml_templates/credential_not_present.html b/packages/relayer/eml_templates/credential_not_present.html index d823a014..b13ee178 100644 --- a/packages/relayer/eml_templates/credential_not_present.html +++ b/packages/relayer/eml_templates/credential_not_present.html @@ -167,7 +167,7 @@ " > You have received an guardian request from the wallet address {{walletAddress}}. - Add the guardian's account code in the subject and reply to this email. + Reply to this email.
Your request ID is #{{requestId}}.

@@ -414,5 +414,6 @@   +
{{command}}
diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 9939ab04..7a0a7e7c 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -85,7 +85,7 @@ pub async fn handle_email(email: String) -> Result { .await?; let command_params = - match extract_template_vals_from_command(&email_body, command_template) { + match extract_template_vals_from_command_template(&email_body, command_template) { Ok(command_params) => command_params, Err(e) => { return Ok(EmailAuthEvent::Error { @@ -134,7 +134,7 @@ pub async fn handle_email(email: String) -> Result { domain_name: parsed_email.get_email_domain()?, public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_command: masked_command, + masked_command, email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), account_salt, is_code_exist, @@ -229,7 +229,7 @@ pub async fn handle_email(email: String) -> Result { .await?; let command_params = - match extract_template_vals_from_command(&email_body, command_template) { + match extract_template_vals_from_command_template(&email_body, command_template) { Ok(command_params) => command_params, Err(e) => { return Ok(EmailAuthEvent::Error { @@ -276,7 +276,7 @@ pub async fn handle_email(email: String) -> Result { domain_name: parsed_email.get_email_domain()?, public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_command: masked_command, + masked_command, email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), account_salt, is_code_exist, diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs index fd189d4f..98c5d0db 100644 --- a/packages/relayer/src/modules/mail.rs +++ b/packages/relayer/src/modules/mail.rs @@ -44,12 +44,12 @@ pub enum EmailAuthEvent { GuardianNotRegistered { account_eth_addr: String, guardian_email_addr: String, - subject: String, + command: String, request_id: u32, }, Ack { email_addr: String, - subject: String, + command: String, original_message_id: Option, }, NoOp, @@ -296,14 +296,14 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<()> { EmailAuthEvent::GuardianNotRegistered { account_eth_addr, guardian_email_addr, - subject, + command, request_id, } => { - let subject = format!("{} Code ", subject); + let command = format!("{} Code ", command); let body_plain = format!( "You have received an guardian request from the wallet address {}. \ - Add the guardian's account code in the subject and reply to this email. \ + Reply to this email. \ Your request ID is #{}. \ If you did not initiate this request, please contact us immediately.", account_eth_addr, request_id @@ -313,7 +313,10 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<()> { "userEmailAddr": guardian_email_addr, "walletAddress": account_eth_addr, "requestId": request_id, + "command": command, }); + + let subject = "Guardian Not Registered".to_string(); let body_html = render_html("credential_not_present.html", render_data).await?; let email = EmailMessage { @@ -330,14 +333,14 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<()> { } EmailAuthEvent::Ack { email_addr, - subject, + command, original_message_id, } => { let body_plain = format!( - "Hi {}!\nYour email with the subject {} is received.", - email_addr, subject + "Hi {}!\nYour email with the command {} is received.", + email_addr, command ); - let render_data = serde_json::json!({"userEmailAddr": email_addr, "request": subject}); + let render_data = serde_json::json!({"userEmailAddr": email_addr, "request": command}); let body_html = render_html("acknowledgement.html", render_data).await?; let subject = format!("Re: {}", subject); let email = EmailMessage { diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 2812480f..aef07158 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -445,7 +445,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response handle_email_event(EmailAuthEvent::GuardianNotRegistered { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), - subject: payload.command.clone(), + command: payload.command.clone(), request_id, }) .await @@ -509,8 +509,6 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response handle_email_event(EmailAuthEvent::GuardianNotSet { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), - // request_id, - // subject: payload.subject.clone(), }) .await .expect("Failed to send Recovery event"); @@ -637,7 +635,7 @@ pub async fn receive_email_api_fn(email: String) -> Result<()> { tokio::spawn(async move { match handle_email_event(EmailAuthEvent::Ack { email_addr: from_addr.clone(), - subject: parsed_email.get_subject_all().unwrap_or_default(), + command: parsed_email.get_command(false).unwrap_or_default(), original_message_id: parsed_email.get_message_id().ok(), }) .await diff --git a/packages/relayer/src/utils/subject_templates.rs b/packages/relayer/src/utils/command_templates.rs similarity index 99% rename from packages/relayer/src/utils/subject_templates.rs rename to packages/relayer/src/utils/command_templates.rs index e8ccd734..c742a323 100644 --- a/packages/relayer/src/utils/subject_templates.rs +++ b/packages/relayer/src/utils/command_templates.rs @@ -49,7 +49,7 @@ impl TemplateValue { } } -pub fn extract_template_vals_from_command( +pub fn extract_template_vals_from_command_template( input: &str, templates: Vec, ) -> Result, anyhow::Error> { @@ -178,7 +178,6 @@ pub fn extract_template_vals(input: &str, templates: Vec) -> Result String { // Convert amount to string in wei format (no decimals) let uint_str = uint.to_string(); diff --git a/packages/relayer/src/utils/mod.rs b/packages/relayer/src/utils/mod.rs index 361a451a..11b1e85f 100644 --- a/packages/relayer/src/utils/mod.rs +++ b/packages/relayer/src/utils/mod.rs @@ -1,7 +1,7 @@ +pub mod command_templates; pub mod strings; -pub mod subject_templates; pub mod utils; +pub use command_templates::*; pub use strings::*; -pub use subject_templates::*; pub use utils::*; diff --git a/packages/relayer/src/utils/utils.rs b/packages/relayer/src/utils/utils.rs index 49c021c1..948c83fe 100644 --- a/packages/relayer/src/utils/utils.rs +++ b/packages/relayer/src/utils/utils.rs @@ -11,10 +11,6 @@ use relayer_utils::*; use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; -const DOMAIN_FIELDS: usize = 9; -const SUBJECT_FIELDS: usize = 17; -const EMAIL_ADDR_FIELDS: usize = 9; - #[derive(Debug, Clone, Deserialize)] pub struct ProverRes { proof: ProofJson, From 1245c2f994a9bfa00aaeb5bdf38695272a2a06d0 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Thu, 5 Sep 2024 17:26:01 +0200 Subject: [PATCH 065/121] WIP: Add custom errors --- packages/relayer/.env.example | 6 +- packages/relayer/Cargo.toml | 2 + packages/relayer/src/chain.rs | 103 +++++--- packages/relayer/src/database.rs | 83 ++++-- .../relayer/src/modules/web_server/errors.rs | 149 +++++++++++ .../relayer/src/modules/web_server/mod.rs | 2 + .../src/modules/web_server/rest_api.rs | 250 +++++++++++------- .../relayer/src/modules/web_server/server.rs | 159 +---------- packages/relayer/src/utils/utils.rs | 4 +- 9 files changed, 439 insertions(+), 319 deletions(-) create mode 100644 packages/relayer/src/modules/web_server/errors.rs diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example index 0f696907..041c1f22 100644 --- a/packages/relayer/.env.example +++ b/packages/relayer/.env.example @@ -1,5 +1,5 @@ -EMAIL_ACCOUNT_RECOVERY_VERSION_ID= # Version ID of the email account recovery. -PRIVATE_KEY= # Private key for Relayer's account. +EMAIL_ACCOUNT_RECOVERY_VERSION_ID=1 # Version ID of the email account recovery. +PRIVATE_KEY="0x1413e91f9aee429e70b145db739f72dcd7250bd2b8c7907cf9f6366440f6c76f" # Private key for Relayer's account. CHAIN_RPC_PROVIDER=http://127.0.0.1:8545 CHAIN_RPC_EXPLORER= CHAIN_ID=11155111 # Chain ID of the testnet. @@ -18,4 +18,4 @@ CANISTER_ID="q7eci-dyaaa-aaaak-qdbia-cai" PEM_PATH="./.ic.pem" IC_REPLICA_URL="https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.icp0.io/?id=q7eci-dyaaa-aaaak-qdbia-cai" -JSON_LOGGER=false \ No newline at end of file +JSON_LOGGER=false diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 7fac6c4e..c55e95bf 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -54,6 +54,8 @@ http = "1.1.0" ic-agent = { version = "0.37.1", features = ["pem", "reqwest"] } ic-utils = "0.37.0" candid = "0.10.10" +thiserror = "1.0.63" +rustc-hex = "2.1.0" [build-dependencies] ethers = "2.0.10" diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index 080cf388..fbc40f31 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -108,14 +108,16 @@ impl ChainClient { Ok(email_auth_addr) } - pub async fn is_wallet_deployed(&self, wallet_addr_str: &String) -> bool { - let wallet_addr: H160 = wallet_addr_str.parse().unwrap(); + pub async fn is_wallet_deployed(&self, wallet_addr_str: &String) -> Result { + let wallet_addr: H160 = wallet_addr_str.parse().map_err(ApiError::HexError)?; match self.client.get_code(wallet_addr, None).await { - Ok(code) => !code.is_empty(), + Ok(code) => Ok(!code.is_empty()), Err(e) => { // Log the error or handle it as needed - error!(LOG, "Error querying contract code: {:?}", e); - false + Err(ApiError::signer_middleware_error( + "Failed to check if wallet is deployed", + e, + )) } } } @@ -124,14 +126,16 @@ impl ChainClient { &self, controller_eth_addr: &String, template_idx: u64, - ) -> Result, anyhow::Error> { - let controller_eth_addr: H160 = controller_eth_addr.parse()?; + ) -> Result, ApiError> { + let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let templates = contract .acceptance_command_templates() .call() .await - .map_err(|e| anyhow::Error::from(e))?; + .map_err(|e| { + ApiError::contract_error("Failed to get acceptance subject templates", e) + })?; Ok(templates[template_idx as usize].clone()) } @@ -139,14 +143,14 @@ impl ChainClient { &self, controller_eth_addr: &String, template_idx: u64, - ) -> Result, anyhow::Error> { - let controller_eth_addr: H160 = controller_eth_addr.parse()?; + ) -> Result, ApiError> { + let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let templates = contract .recovery_command_templates() .call() .await - .map_err(|e| anyhow::Error::from(e))?; + .map_err(|e| ApiError::contract_error("Failed to get recovery subject templates", e))?; Ok(templates[template_idx as usize].clone()) } @@ -155,23 +159,27 @@ impl ChainClient { controller_eth_addr: &String, account_eth_addr: &String, complete_calldata: &String, - ) -> Result { - let controller_eth_addr: H160 = controller_eth_addr.parse()?; + ) -> Result { + let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let decoded_calldata = hex::decode(&complete_calldata.trim_start_matches("0x")).expect("Decoding failed"); - let call = contract.complete_recovery( - account_eth_addr - .parse::() - .expect("Invalid H160 address"), - Bytes::from(decoded_calldata), - ); - let tx = call.send().await?; + let account_eth_addr = account_eth_addr + .parse::() + .map_err(ApiError::HexError)?; + let call = contract.complete_recovery(account_eth_addr, Bytes::from(decoded_calldata)); + let tx = call + .send() + .await + .map_err(|e| ApiError::contract_error("Failed to call complete_recovery", e))?; // If the transaction is successful, the function will return true and false otherwise. let receipt = tx .log() .confirmations(CONFIRMATIONS) - .await? + .await + .map_err(|e| { + ApiError::provider_error("Failed to get receipt after calling complete_recovery", e) + })? .ok_or(anyhow!("No receipt"))?; Ok(receipt .status @@ -223,9 +231,14 @@ impl ChainClient { .unwrap_or(false)) } - pub async fn get_bytecode(&self, wallet_addr: &String) -> Result { - let wallet_address: H160 = wallet_addr.parse()?; - Ok(self.client.get_code(wallet_address, None).await?) + pub async fn get_bytecode(&self, wallet_addr: &String) -> Result { + let wallet_address: H160 = wallet_addr.parse().map_err(ApiError::HexError)?; + let client_code = self + .client + .get_code(wallet_address, None) + .await + .map_err(|e| ApiError::signer_middleware_error("Failed to get bytecode", e))?; + Ok(client_code) } pub async fn get_storage_at( @@ -245,8 +258,8 @@ impl ChainClient { controller_eth_addr: &String, command_params: Vec, template_idx: u64, - ) -> Result { - let controller_eth_addr: H160 = controller_eth_addr.parse()?; + ) -> Result { + let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let command_params_bytes = command_params .iter() // Change here: use iter() instead of map() directly on Vec @@ -261,7 +274,13 @@ impl ChainClient { template_idx.into(), ) .call() - .await?; + .await + .map_err(|e| { + ApiError::contract_error( + "Failed to get recovered account from acceptance subject", + e, + ) + })?; Ok(recovered_account) } @@ -270,23 +289,27 @@ impl ChainClient { controller_eth_addr: &String, command_params: Vec, template_idx: u64, - ) -> Result { - let controller_eth_addr: H160 = controller_eth_addr.parse()?; + ) -> Result { + let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let command_params_bytes = command_params .iter() // Change here: use iter() instead of map() directly on Vec .map(|s| { - s.abi_encode(None) // Assuming decimal_size is not needed or can be None - .unwrap_or_else(|_| Bytes::from("Error encoding".as_bytes().to_vec())) - }) // Error handling - .collect::>(); + s.abi_encode(None).map_err(|_| { + ApiError::Validation("Error encoding subject parameters".to_string()) + }) + }) + .collect::, ApiError>>()?; let recovered_account = contract .extract_recovered_account_from_recovery_command( command_params_bytes, template_idx.into(), ) .call() - .await?; + .await + .map_err(|e| { + ApiError::contract_error("Failed to get recovered account from recovery subject", e) + })?; Ok(recovered_account) } @@ -294,11 +317,15 @@ impl ChainClient { &self, controller_eth_addr: &String, account_eth_addr: &String, - ) -> Result { - let controller_eth_addr: H160 = controller_eth_addr.parse()?; - let account_eth_addr: H160 = account_eth_addr.parse()?; + ) -> Result { + let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; + let account_eth_addr: H160 = account_eth_addr.parse().map_err(ApiError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - let is_activated = contract.is_activated(account_eth_addr).call().await?; + let is_activated = contract + .is_activated(account_eth_addr) + .call() + .await + .map_err(|e| ApiError::contract_error("Failed to check if is activated", e))?; Ok(is_activated) } } diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs index acd74822..29da457f 100644 --- a/packages/relayer/src/database.rs +++ b/packages/relayer/src/database.rs @@ -102,7 +102,7 @@ impl Database { &self, account_eth_addr: &str, email_addr: &str, - ) -> bool { + ) -> std::result::Result { let row = sqlx::query( "SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2", ) @@ -110,11 +110,13 @@ impl Database { .bind(email_addr) .fetch_optional(&self.db) .await - .unwrap(); + .map_err(|e| { + ApiError::database_error("Failed to check if wallet and email are registered", e) + })?; match row { - Some(_) => true, - None => false, + Some(_) => Ok(true), + None => Ok(false), } } @@ -132,14 +134,17 @@ impl Database { pub(crate) async fn update_credentials_of_wallet_and_email( &self, row: &Credentials, - ) -> Result<()> { + ) -> std::result::Result<(), ApiError> { let res = sqlx::query("UPDATE credentials SET account_code = $1, is_set = $2 WHERE account_eth_addr = $3 AND guardian_email_addr = $4") .bind(&row.account_code) .bind(row.is_set) .bind(&row.account_eth_addr) .bind(&row.guardian_email_addr) .execute(&self.db) - .await?; + .await + .map_err(|e| { + ApiError::database_error("Failed to insert credentials of wallet and email", e) + })?; Ok(()) } @@ -147,19 +152,26 @@ impl Database { &self, is_set: bool, account_eth_addr: &str, - ) -> Result<()> { + ) -> std::result::Result<(), ApiError> { let res = sqlx::query( "UPDATE credentials SET is_set = $1 WHERE account_eth_addr = $2 AND is_set = true", ) .bind(is_set) .bind(account_eth_addr) .execute(&self.db) - .await?; + .await + .map_err(|e| { + ApiError::database_error("Failed to update credentials of inactive guardian", e) + })?; Ok(()) } - pub(crate) async fn insert_credentials(&self, row: &Credentials) -> Result<()> { - info!(LOG, "insert row {:?}", row); + #[named] + pub(crate) async fn insert_credentials( + &self, + row: &Credentials, + ) -> std::result::Result<(), ApiError> { + info!(LOG, "insert row {:?}", row; "func" => function_name!()); let row = sqlx::query( "INSERT INTO credentials (account_code, account_eth_addr, guardian_email_addr, is_set) VALUES ($1, $2, $3, $4) RETURNING *", ) @@ -168,30 +180,44 @@ impl Database { .bind(&row.guardian_email_addr) .bind(row.is_set) .fetch_one(&self.db) - .await?; - info!(LOG, "{} row inserted", row.len()); + .await + .map_err(|e| ApiError::database_error("Failed to insert credentials", e))?; + info!( + LOG, + "{} row inserted", + row.len(); "func" => function_name!() + ); Ok(()) } - pub async fn is_guardian_set(&self, account_eth_addr: &str, guardian_email_addr: &str) -> bool { + pub async fn is_guardian_set( + &self, + account_eth_addr: &str, + guardian_email_addr: &str, + ) -> std::result::Result { let row = sqlx::query("SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2 AND is_set = TRUE") .bind(account_eth_addr) .bind(guardian_email_addr) .fetch_optional(&self.db) .await - .unwrap(); + .map_err(|e| ApiError::database_error("Failed to check if guardian is set", e))?; match row { - Some(_) => true, - None => false, + Some(_) => Ok(true), + None => Ok(false), } } - pub(crate) async fn get_request(&self, request_id: u32) -> Result> { + #[named] + pub(crate) async fn get_request( + &self, + request_id: u32, + ) -> std::result::Result, ApiError> { let row = sqlx::query("SELECT * FROM requests WHERE request_id = $1") .bind(request_id as i64) .fetch_optional(&self.db) - .await?; + .await + .map_err(|e| ApiError::database_error("Failed to get request", e))?; match row { Some(row) => { @@ -267,14 +293,17 @@ impl Database { &self, account_eth_addr: &str, email_addr: &str, - ) -> Result> { + ) -> std::result::Result, ApiError> { let row = sqlx::query( "SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2", ) .bind(account_eth_addr) .bind(email_addr) .fetch_optional(&self.db) - .await?; + .await + .map_err(|e| { + ApiError::database_error("Failed to get credentials from wallet and email", e) + })?; match row { Some(row) => { @@ -295,8 +324,9 @@ impl Database { } } - pub(crate) async fn insert_request(&self, row: &Request) -> Result<()> { - info!(LOG, "insert row {:?}", row); + #[named] + pub(crate) async fn insert_request(&self, row: &Request) -> std::result::Result<(), ApiError> { + info!(LOG, "insert row {:?}", row; "func" => function_name!()); let row = sqlx::query( "INSERT INTO requests (request_id, account_eth_addr, controller_eth_addr, guardian_email_addr, is_for_recovery, template_idx, is_processed, is_success, email_nullifier, account_salt) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *", ) @@ -311,8 +341,13 @@ impl Database { .bind(&row.email_nullifier) .bind(&row.account_salt) .fetch_one(&self.db) - .await?; - info!(LOG, "{} row inserted", row.len()); + .await + .map_err(|e| ApiError::database_error("Failed to insert request", e))?; + info!( + LOG, + "{} row inserted", + row.len(); "func" => function_name!() + ); Ok(()) } } diff --git a/packages/relayer/src/modules/web_server/errors.rs b/packages/relayer/src/modules/web_server/errors.rs new file mode 100644 index 00000000..2b53701f --- /dev/null +++ b/packages/relayer/src/modules/web_server/errors.rs @@ -0,0 +1,149 @@ +use crate::*; +use axum::{ + response::{IntoResponse, Response}, + Json, +}; +use reqwest::StatusCode; +use rustc_hex::FromHexError; +use serde_json::json; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum ApiError { + #[error("Database error: {0}")] + Database(DatabaseError), + #[error("Sqlx error: {0}")] + SqlxError(#[from] sqlx::Error), + #[error("Contract error: {0}")] + Contract(ContractErrorWrapper), + #[error("Signer middleware error: {0}")] + SignerMiddleware(SignerMiddlewareErrorWrapper), + #[error("Validation error: {0}")] + Validation(String), + // #[error("Not found: {0}")] + // NotFound(String), + #[error("Provider error: {0}")] + Provider(ProviderErrorWrapper), + #[error("Hex error: {0}")] + HexError(#[from] FromHexError), + #[error("Anyhow error: {0}")] + Anyhow(#[from] anyhow::Error), + #[error("Internal error: {0}")] + Internal(String), +} + +#[derive(Debug, thiserror::Error)] +#[error("{msg}: {source}")] +pub struct DatabaseError { + #[source] + pub source: sqlx::Error, + pub msg: String, +} + +impl DatabaseError { + pub fn new(source: sqlx::Error, msg: String) -> Self { + Self { source, msg } + } +} + +#[derive(Debug)] +pub struct ContractErrorWrapper { + msg: String, + source: String, +} + +impl std::fmt::Display for ContractErrorWrapper { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}: {}", self.msg, self.source) + } +} + +impl ContractErrorWrapper { + pub fn new(msg: String, err: ContractError) -> Self { + ContractErrorWrapper { + msg, + source: err.to_string(), + } + } +} + +#[derive(Debug)] +pub struct SignerMiddlewareErrorWrapper { + msg: String, + source: String, +} + +impl std::fmt::Display for SignerMiddlewareErrorWrapper { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}: {}", self.msg, self.source) + } +} + +impl SignerMiddlewareErrorWrapper { + pub fn new( + msg: String, + err: signer::SignerMiddlewareError, + ) -> Self { + SignerMiddlewareErrorWrapper { + msg, + source: err.to_string(), + } + } +} + +#[derive(Debug)] +pub struct ProviderErrorWrapper { + msg: String, + source: ethers::providers::ProviderError, +} + +impl std::fmt::Display for ProviderErrorWrapper { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}: {}", self.msg, self.source) + } +} + +impl ProviderErrorWrapper { + pub fn new(msg: String, err: ethers::providers::ProviderError) -> Self { + ProviderErrorWrapper { msg, source: err } + } +} + +impl ApiError { + pub fn database_error(msg: &str, source: sqlx::Error) -> Self { + Self::Database(DatabaseError::new(source, msg.to_string())) + } + + pub fn contract_error(msg: &str, err: ContractError) -> Self { + Self::Contract(ContractErrorWrapper::new(msg.to_string(), err)) + } + + pub fn signer_middleware_error( + msg: &str, + err: signer::SignerMiddlewareError, + ) -> Self { + Self::SignerMiddleware(SignerMiddlewareErrorWrapper::new(msg.to_string(), err)) + } + + pub fn provider_error(msg: &str, err: ethers::providers::ProviderError) -> Self { + Self::Provider(ProviderErrorWrapper::new(msg.to_string(), err)) + } +} + +impl IntoResponse for ApiError { + fn into_response(self) -> Response { + let (status, error_message) = match self { + ApiError::Database(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + ApiError::Contract(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + ApiError::SignerMiddleware(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + ApiError::SqlxError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + ApiError::Validation(e) => (StatusCode::BAD_REQUEST, e), + // ApiError::NotFound(e) => (StatusCode::NOT_FOUND, e), + ApiError::Provider(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + ApiError::Anyhow(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + ApiError::HexError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + ApiError::Internal(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + }; + (status, Json(json!({ "error": error_message }))).into_response() + } +} diff --git a/packages/relayer/src/modules/web_server/mod.rs b/packages/relayer/src/modules/web_server/mod.rs index 7dffbb07..14a44e7b 100644 --- a/packages/relayer/src/modules/web_server/mod.rs +++ b/packages/relayer/src/modules/web_server/mod.rs @@ -1,5 +1,7 @@ +pub mod errors; pub mod rest_api; pub mod server; +pub use errors::*; pub use rest_api::*; pub use server::*; diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index aef07158..9c9f259b 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -1,10 +1,9 @@ use crate::*; use anyhow::Result; -use axum::{body::Body, response::Response}; +use axum::Json; use hex::decode; use rand::Rng; use relayer_utils::LOG; -use reqwest::StatusCode; use serde::{Deserialize, Serialize}; use std::str; @@ -87,7 +86,9 @@ pub struct InactiveGuardianRequest { } // Create request status API -pub async fn request_status_api(payload: RequestStatusRequest) -> Result { +pub async fn request_status_api( + Json(payload): Json, +) -> Result, ApiError> { let row = DB.get_request(payload.request_id).await?; let status = if let Some(ref row) = row { if row.is_processed { @@ -98,7 +99,7 @@ pub async fn request_status_api(payload: RequestStatusRequest) -> Result Result Response { @@ -132,20 +133,16 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response = @@ -195,10 +192,9 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response(); @@ -206,11 +202,12 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response(); } - let account_salt = calculate_account_salt(&payload.guardian_email_addr, &payload.account_code); + let account_salt = calculate_account_salt(&payload.guardian_email_addr, &payload.account_code) + .map_err(|_| ApiError::Validation("Failed to calculate account salt".to_string()))?; if DB .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) - .await + .await? { DB.insert_request(&Request { request_id: request_id.clone(), @@ -224,18 +221,18 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response Response Response Response Response Response Response Response command_params.clone(), payload.template_idx, ) - .await - .unwrap(); + .await?; let account_eth_addr = format!("0x{:x}", account_eth_addr); - if !CLIENT.is_wallet_deployed(&account_eth_addr).await { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Wallet not deployed")) - .unwrap(); + if !CLIENT.is_wallet_deployed(&account_eth_addr).await? { + return Err(ApiError::Validation("Wallet not deployed".to_string())); } // Check if hash of bytecode of proxy contract is equal or not - let bytecode = CLIENT.get_bytecode(&account_eth_addr).await.unwrap(); + let bytecode = CLIENT.get_bytecode(&account_eth_addr).await?; let bytecode_hash = format!("0x{}", hex::encode(keccak256(bytecode.as_ref()))); // let permitted_wallets: Vec = @@ -412,20 +403,19 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response let account = DB .get_credentials_from_wallet_and_email(&account_eth_addr, &payload.guardian_email_addr) - .await; + .await?; - let account_salt = if let Ok(Some(account_details)) = account { + let account_salt = if let Some(account_details) = account { calculate_account_salt(&payload.guardian_email_addr, &account_details.account_code) + .map_err(|_| ApiError::Validation("Failed to calculate account salt".to_string()))? } else { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Account details not found")) - .unwrap(); + return Err(ApiError::Validation("Wallet not deployed".to_string())); }; if !DB .is_wallet_and_email_registered(&account_eth_addr, &payload.guardian_email_addr) - .await + // TODO: replace + .await? { DB.insert_request(&Request { request_id: request_id.clone(), @@ -439,8 +429,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response email_nullifier: None, account_salt: Some(account_salt.clone()), }) - .await - .expect("Failed to insert request"); + .await?; handle_email_event(EmailAuthEvent::GuardianNotRegistered { account_eth_addr, @@ -449,6 +438,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response request_id, }) .await + // TODO: Add custom events for email handling .expect("Failed to send GuardianNotRegistered event"); return Response::builder() @@ -465,7 +455,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response if DB .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) - .await + .await? { DB.insert_request(&Request { request_id: request_id.clone(), @@ -479,8 +469,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response email_nullifier: None, account_salt: Some(account_salt.clone()), }) - .await - .expect("Failed to insert request"); + .await?; handle_email_event(EmailAuthEvent::RecoveryRequest { account_eth_addr, @@ -489,6 +478,7 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response command: payload.command.clone(), }) .await + // TODO: Add custom error for handle_email_event .expect("Failed to send Recovery event"); } else { DB.insert_request(&Request { @@ -503,14 +493,14 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response email_nullifier: None, account_salt: Some(account_salt.clone()), }) - .await - .expect("Failed to insert request"); + .await?; handle_email_event(EmailAuthEvent::GuardianNotSet { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), }) .await + // TODO: Add error handling .expect("Failed to send Recovery event"); } @@ -526,12 +516,11 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response .unwrap() } -pub async fn handle_complete_recovery_request(payload: CompleteRecoveryRequest) -> Response { - if !CLIENT.is_wallet_deployed(&payload.account_eth_addr).await { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Wallet not deployed")) - .unwrap(); +pub async fn handle_complete_recovery_request( + Json(payload): Json, +) -> Result { + if !CLIENT.is_wallet_deployed(&payload.account_eth_addr).await? { + return Err(ApiError::Validation("Wallet not deployed".to_string())); } match CLIENT @@ -542,14 +531,8 @@ pub async fn handle_complete_recovery_request(payload: CompleteRecoveryRequest) ) .await { - Ok(true) => Response::builder() - .status(StatusCode::OK) - .body(Body::from("Recovery completed")) - .unwrap(), - Ok(false) => Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Recovery failed")) - .unwrap(), + Ok(true) => Ok("Recovery completed".to_string()), + Ok(false) => Err(ApiError::Validation("Recovery failed".to_string())), Err(e) => { // Parse the error message if it follows the known format let error_message = if e @@ -565,54 +548,41 @@ pub async fn handle_complete_recovery_request(payload: CompleteRecoveryRequest) .chars() .filter(|c| c.is_ascii()) .collect::(); - Response::builder() - .status(StatusCode::INTERNAL_SERVER_ERROR) - .body(Body::from(error_message)) - .unwrap() + Err(ApiError::Internal(error_message)) } } } -pub async fn get_account_salt(payload: GetAccountSaltRequest) -> Response { - let account_salt = calculate_account_salt(&payload.email_addr, &payload.account_code); - - Response::builder() - .status(StatusCode::OK) - .body(Body::from(account_salt)) - .unwrap() +pub async fn get_account_salt( + Json(payload): Json, +) -> Result { + let account_salt = calculate_account_salt(&payload.email_addr, &payload.account_code) + .map_err(|_| ApiError::Validation("Failed to calculate account salt".to_string()))?; + Ok(account_salt) } -pub async fn inactive_guardian(payload: InactiveGuardianRequest) -> Response { +pub async fn inactive_guardian( + Json(payload): Json, +) -> Result { let is_activated = CLIENT .get_is_activated(&payload.controller_eth_addr, &payload.account_eth_addr) - .await; - match is_activated { - Ok(true) => { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Wallet is activated")) - .unwrap() - } - Ok(false) => {} - Err(e) => { - return Response::builder() - .status(StatusCode::INTERNAL_SERVER_ERROR) - .body(Body::from(e.to_string())) - .unwrap() - } + .await?; + + if is_activated { + return Ok("Wallet is activated".to_string()); } - trace!(LOG, "Inactive guardian"; "is_activated" => is_activated.unwrap()); - let account_eth_addr: Address = payload.account_eth_addr.parse().unwrap(); + + trace!(LOG, "Inactive guardian"; "is_activated" => is_activated); + let account_eth_addr: Address = payload + .account_eth_addr + .parse() + .map_err(|e| ApiError::Validation(format!("Failed to parse account_eth_addr: {}", e)))?; let account_eth_addr = format!("0x{:x}", &account_eth_addr); trace!(LOG, "Inactive guardian"; "account_eth_addr" => &account_eth_addr); DB.update_credentials_of_inactive_guardian(false, &account_eth_addr) - .await - .expect("Failed to update credentials"); + .await?; - Response::builder() - .status(StatusCode::OK) - .body(Body::from("Guardian inactivated")) - .unwrap() + Ok("Guardian inactivated".to_string()) } fn parse_error_message(error_data: String) -> String { @@ -672,3 +642,81 @@ pub async fn receive_email_api_fn(email: String) -> Result<()> { }); Ok(()) } + +#[derive(Serialize, Deserialize, Debug)] +pub struct RequestStatusRequest { + pub request_id: u32, +} + +#[derive(Serialize, Deserialize, Debug)] +pub enum RequestStatus { + NotExist = 0, + Pending = 1, + Processed = 2, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct RequestStatusResponse { + pub request_id: u32, + pub status: RequestStatus, + pub is_success: bool, + pub email_nullifier: Option, + pub account_salt: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct AcceptanceRequest { + pub controller_eth_addr: String, + pub guardian_email_addr: String, + pub account_code: String, + pub template_idx: u64, + pub subject: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct AcceptanceResponse { + pub request_id: u32, + pub subject_params: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct RecoveryRequest { + pub controller_eth_addr: String, + pub guardian_email_addr: String, + pub template_idx: u64, + pub subject: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct RecoveryResponse { + pub request_id: u32, + pub subject_params: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct CompleteRecoveryRequest { + pub account_eth_addr: String, + pub controller_eth_addr: String, + pub complete_calldata: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetAccountSaltRequest { + pub account_code: String, + pub email_addr: String, +} + +#[derive(Deserialize, Debug)] +struct PermittedWallet { + wallet_name: String, + controller_eth_addr: String, + hash_of_bytecode_of_proxy: String, + impl_contract_address: String, + slot_location: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct InactiveGuardianRequest { + pub account_eth_addr: String, + pub controller_eth_addr: String, +} diff --git a/packages/relayer/src/modules/web_server/server.rs b/packages/relayer/src/modules/web_server/server.rs index 195d651c..63c00b66 100644 --- a/packages/relayer/src/modules/web_server/server.rs +++ b/packages/relayer/src/modules/web_server/server.rs @@ -1,5 +1,5 @@ use crate::*; -use axum::Router; +use axum::{routing::post, Router}; use relayer_utils::LOG; use tower_http::cors::{AllowHeaders, AllowMethods, Any, CorsLayer}; @@ -11,162 +11,19 @@ pub async fn run_server() -> Result<()> { "/api/echo", axum::routing::get(move || async move { "Hello, world!" }), ) - .route( - "/api/requestStatus", - axum::routing::post(move |payload: String| async move { - let payload: Result = - serde_json::from_str(&payload).map_err(|e| anyhow::Error::from(e)); - match payload { - Ok(payload) => { - let response = request_status_api(payload).await; - match response { - Ok(response) => { - let body = serde_json::to_string(&response) - .map_err(|e| axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .unwrap(); - Ok::<_, axum::response::Response>( - axum::http::Response::builder() - .status(axum::http::StatusCode::OK) - .body(axum::body::Body::from(body)) - .unwrap(), - ) - } - Err(e) => { - let error_message = serde_json::to_string(&e.to_string()) - .map_err(|_| axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .unwrap(); - Ok(axum::http::Response::builder() - .status(axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .body(serde_json::to_string(&e.to_string()).unwrap().into()) - .unwrap()) - } - } - } - Err(e) => { - let error_message = serde_json::to_string(&e.to_string()) - .map_err(|_| axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .unwrap(); - Ok(axum::http::Response::builder() - .status(axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .body(serde_json::to_string(&e.to_string()).unwrap().into()) - .unwrap()) - } - } - }), - ) - .route( - "/api/acceptanceRequest", - axum::routing::post(move |payload: String| async move { - let payload: Result = - serde_json::from_str(&payload).map_err(|e| anyhow::Error::from(e)); - match payload { - Ok(payload) => { - let acceptance_response = handle_acceptance_request(payload).await; - Ok::<_, axum::response::Response>(acceptance_response) - } - Err(e) => { - let error_message = serde_json::to_string(&e.to_string()) - .map_err(|_| axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .unwrap(); - Ok(axum::http::Response::builder() - .status(axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .body(serde_json::to_string(&e.to_string()).unwrap().into()) - .unwrap()) - } - } - }), - ) - .route( - "/api/recoveryRequest", - axum::routing::post(move |payload: String| async move { - let payload: Result = - serde_json::from_str(&payload).map_err(|e| anyhow::Error::from(e)); - match payload { - Ok(payload) => { - let recovery_response = handle_recovery_request(payload).await; - Ok::<_, axum::response::Response>(recovery_response) - } - Err(e) => { - let error_message = serde_json::to_string(&e.to_string()) - .map_err(|_| axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .unwrap(); - Ok(axum::http::Response::builder() - .status(axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .body(serde_json::to_string(&e.to_string()).unwrap().into()) - .unwrap()) - } - } - }), - ) + .route("/api/requestStatus", post(request_status_api)) + .route("/api/acceptanceRequest", post(handle_acceptance_request)) + .route("/api/recoveryRequest", post(handle_recovery_request)) .route( "/api/completeRequest", - axum::routing::post(move |payload: String| async move { - let payload: Result = - serde_json::from_str(&payload).map_err(|e| anyhow::Error::from(e)); - match payload { - Ok(payload) => { - let recovery_response = handle_complete_recovery_request(payload).await; - Ok::<_, axum::response::Response>(recovery_response) - } - Err(e) => { - let error_message = serde_json::to_string(&e.to_string()) - .map_err(|_| axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .unwrap(); - Ok(axum::http::Response::builder() - .status(axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .body(serde_json::to_string(&e.to_string()).unwrap().into()) - .unwrap()) - } - } - }), - ) - .route( - "/api/getAccountSalt", - axum::routing::post(move |payload: String| async move { - let payload: Result = - serde_json::from_str(&payload).map_err(|e| anyhow::Error::from(e)); - match payload { - Ok(payload) => { - let response = get_account_salt(payload).await; - Ok::<_, axum::response::Response>(response) - } - Err(e) => { - let error_message = serde_json::to_string(&e.to_string()) - .map_err(|_| axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .unwrap(); - Ok(axum::http::Response::builder() - .status(axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .body(serde_json::to_string(&e.to_string()).unwrap().into()) - .unwrap()) - } - } - }), - ) - .route( - "/api/inactiveGuardian", - axum::routing::post(move |payload: String| async move { - let payload: Result = - serde_json::from_str(&payload).map_err(|e| anyhow::Error::from(e)); - match payload { - Ok(payload) => { - let response = inactive_guardian(payload).await; - Ok::<_, axum::response::Response>(response) - } - Err(e) => { - let error_message = serde_json::to_string(&e.to_string()) - .map_err(|_| axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .unwrap(); - Ok(axum::http::Response::builder() - .status(axum::http::StatusCode::INTERNAL_SERVER_ERROR) - .body(serde_json::to_string(&e.to_string()).unwrap().into()) - .unwrap()) - } - } - }), + post(handle_complete_recovery_request), ) + .route("/api/getAccountSalt", post(get_account_salt)) + .route("/api/inactiveGuardian", post(inactive_guardian)) .route( "/api/receiveEmail", axum::routing::post::<_, _, (), _>(move |payload: String| async move { + println!("/api/receiveEmail"); info!(LOG, "Receive email payload: {}", payload); match receive_email_api_fn(payload).await { Ok(_) => "Request processed".to_string(), diff --git a/packages/relayer/src/utils/utils.rs b/packages/relayer/src/utils/utils.rs index 948c83fe..1da380f0 100644 --- a/packages/relayer/src/utils/utils.rs +++ b/packages/relayer/src/utils/utils.rs @@ -80,7 +80,7 @@ pub fn calculate_default_hash(input: &str) -> String { hash_code.to_string() } -pub fn calculate_account_salt(email_addr: &str, account_code: &str) -> String { +pub fn calculate_account_salt(email_addr: &str, account_code: &str) -> Result { let padded_email_addr = PaddedEmailAddr::from_email_addr(&email_addr); let account_code = if account_code.starts_with("0x") { hex_to_field(&account_code).unwrap() @@ -88,7 +88,7 @@ pub fn calculate_account_salt(email_addr: &str, account_code: &str) -> String { hex_to_field(&format!("0x{}", account_code)).unwrap() }; let account_code = AccountCode::from(account_code); - let account_salt = AccountSalt::new(&padded_email_addr, account_code).unwrap(); + let account_salt = AccountSalt::new(&padded_email_addr, account_code)?; field_to_hex(&account_salt.0) } From 3e6ff1a20e58035cd369b66265921eaf3ae32b4f Mon Sep 17 00:00:00 2001 From: Dimi Date: Thu, 5 Sep 2024 18:27:05 +0300 Subject: [PATCH 066/121] Update .env.example --- packages/relayer/.env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example index 041c1f22..12957976 100644 --- a/packages/relayer/.env.example +++ b/packages/relayer/.env.example @@ -1,5 +1,5 @@ EMAIL_ACCOUNT_RECOVERY_VERSION_ID=1 # Version ID of the email account recovery. -PRIVATE_KEY="0x1413e91f9aee429e70b145db739f72dcd7250bd2b8c7907cf9f6366440f6c76f" # Private key for Relayer's account. +PRIVATE_KEY="" # Private key for Relayer's account. CHAIN_RPC_PROVIDER=http://127.0.0.1:8545 CHAIN_RPC_EXPLORER= CHAIN_ID=11155111 # Chain ID of the testnet. From 6da5914a454545c0b679f06b9f10376944295ba1 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Fri, 6 Sep 2024 15:28:48 +0200 Subject: [PATCH 067/121] Split up handle_email fn; Remove code duplication --- packages/relayer/src/core.rs | 58 ++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 7a0a7e7c..26e3b508 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -375,3 +375,61 @@ pub fn get_masked_command(public_signals: Vec, start_idx: usize) -> Result Ok(command) } + +fn get_template_id(template_idx: u64) -> [u8; 32] { + let tokens = vec![ + Token::Uint((*EMAIL_ACCOUNT_RECOVERY_VERSION_ID.get().unwrap()).into()), + Token::String("RECOVERY".to_string()), + Token::Uint(template_idx.into()), + ]; + println!("tokens: {:?}", tokens); + + let template_id = keccak256(encode(&tokens)); + println!("template_id: {:?}", template_id); + template_id +} + +async fn get_email_proof(params: &EmailRequestContext) -> Result<(EmailProof, [u8; 32])> { + let circuit_input = generate_email_auth_input( + ¶ms.email, + &AccountCode::from(hex2field(&format!("0x{}", ¶ms.account_code_str))?), + ) + .await?; + println!("circuit_input: {:?}", circuit_input); + + let (proof, public_signals) = + generate_proof(&circuit_input, "email_auth", PROVER_ADDRESS.get().unwrap()).await?; + println!("proof: {:?}", proof); + println!("public_signals: {:?}", public_signals); + + let account_salt = u256_to_bytes32(&public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 3]); + println!("account_salt: {:?}", account_salt); + let is_code_exist = public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); + println!("is_code_exist: {:?}", is_code_exist); + let masked_subject = get_masked_subject(public_signals.clone(), DOMAIN_FIELDS + 3)?; + println!("masked_subject: {:?}", masked_subject); + + let email_proof = EmailProof { + proof, + domain_name: params.parsed_email.get_email_domain()?, + public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), + timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), + masked_subject, + email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), + account_salt, + is_code_exist, + }; + println!("email_proof: {:?}", email_proof); + Ok((email_proof, account_salt)) +} + +#[derive(Debug, Clone)] +struct EmailRequestContext { + request: Request, + guardian_email_addr: String, + subject: String, + invitation_code: Option, + account_code_str: String, + email: String, + parsed_email: ParsedEmail, +} From e8093d14bd1c732d02d8c22a8012c09ff10c7b97 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Mon, 9 Sep 2024 12:03:15 +0200 Subject: [PATCH 068/121] Custom errors for email --- .gitignore | 3 + Cargo.lock | 13 + packages/relayer/src/chain.rs | 102 ++++--- packages/relayer/src/core.rs | 264 +++++++++++++++++- packages/relayer/src/database.rs | 64 +++-- packages/relayer/src/modules/mail.rs | 24 +- .../relayer/src/modules/web_server/errors.rs | 125 ++++++--- .../src/modules/web_server/rest_api.rs | 6 +- .../relayer/src/modules/web_server/server.rs | 15 +- 9 files changed, 491 insertions(+), 125 deletions(-) diff --git a/.gitignore b/.gitignore index 0ee936ed..1bfbf23a 100644 --- a/.gitignore +++ b/.gitignore @@ -80,6 +80,9 @@ book # Vs code settings .vscode +# Editor settings +.idea + # For zksync zkout .cache diff --git a/Cargo.lock b/Cargo.lock index ef6274cd..160f0fa2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1657,6 +1657,17 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "fancy-regex" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + [[package]] name = "fastrand" version = "1.9.0" @@ -4129,6 +4140,7 @@ dependencies = [ "slog-json", "slog-term", "sqlx", + "thiserror", "tiny_http", "tokio", "tower-http", @@ -4151,6 +4163,7 @@ dependencies = [ "hmac-sha256", "itertools 0.10.5", "lazy_static", + "mailparse", "neon", "num-bigint", "num-traits", diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index fbc40f31..07dc16a7 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -108,13 +108,13 @@ impl ChainClient { Ok(email_auth_addr) } - pub async fn is_wallet_deployed(&self, wallet_addr_str: &String) -> Result { - let wallet_addr: H160 = wallet_addr_str.parse().map_err(ApiError::HexError)?; + pub async fn is_wallet_deployed(&self, wallet_addr_str: &String) -> Result { + let wallet_addr: H160 = wallet_addr_str.parse().map_err(ChainError::HexError)?; match self.client.get_code(wallet_addr, None).await { Ok(code) => Ok(!code.is_empty()), Err(e) => { // Log the error or handle it as needed - Err(ApiError::signer_middleware_error( + Err(ChainError::signer_middleware_error( "Failed to check if wallet is deployed", e, )) @@ -126,15 +126,16 @@ impl ChainClient { &self, controller_eth_addr: &String, template_idx: u64, - ) -> Result, ApiError> { - let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; + ) -> Result, ChainError> { + let controller_eth_addr: H160 = + controller_eth_addr.parse().map_err(ChainError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let templates = contract .acceptance_command_templates() .call() .await .map_err(|e| { - ApiError::contract_error("Failed to get acceptance subject templates", e) + ChainError::contract_error("Failed to get acceptance subject templates", e) })?; Ok(templates[template_idx as usize].clone()) } @@ -143,14 +144,17 @@ impl ChainClient { &self, controller_eth_addr: &String, template_idx: u64, - ) -> Result, ApiError> { - let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; + ) -> Result, ChainError> { + let controller_eth_addr: H160 = + controller_eth_addr.parse().map_err(ChainError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let templates = contract .recovery_command_templates() .call() .await - .map_err(|e| ApiError::contract_error("Failed to get recovery subject templates", e))?; + .map_err(|e| { + ChainError::contract_error("Failed to get recovery subject templates", e) + })?; Ok(templates[template_idx as usize].clone()) } @@ -159,26 +163,30 @@ impl ChainClient { controller_eth_addr: &String, account_eth_addr: &String, complete_calldata: &String, - ) -> Result { - let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; + ) -> Result { + let controller_eth_addr: H160 = + controller_eth_addr.parse().map_err(ChainError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let decoded_calldata = hex::decode(&complete_calldata.trim_start_matches("0x")).expect("Decoding failed"); let account_eth_addr = account_eth_addr .parse::() - .map_err(ApiError::HexError)?; + .map_err(ChainError::HexError)?; let call = contract.complete_recovery(account_eth_addr, Bytes::from(decoded_calldata)); let tx = call .send() .await - .map_err(|e| ApiError::contract_error("Failed to call complete_recovery", e))?; + .map_err(|e| ChainError::contract_error("Failed to call complete_recovery", e))?; // If the transaction is successful, the function will return true and false otherwise. let receipt = tx .log() .confirmations(CONFIRMATIONS) .await .map_err(|e| { - ApiError::provider_error("Failed to get receipt after calling complete_recovery", e) + ChainError::provider_error( + "Failed to get receipt after calling complete_recovery", + e, + ) })? .ok_or(anyhow!("No receipt"))?; Ok(receipt @@ -192,16 +200,25 @@ impl ChainClient { controller_eth_addr: &String, email_auth_msg: EmailAuthMsg, template_idx: u64, - ) -> Result { + ) -> std::result::Result { let controller_eth_addr: H160 = controller_eth_addr.parse()?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let call = contract.handle_acceptance(email_auth_msg, template_idx.into()); - let tx = call.send().await?; + let tx = call + .send() + .await + .map_err(|e| ChainError::contract_error("Failed to call handle_acceptance", e))?; // If the transaction is successful, the function will return true and false otherwise. let receipt = tx .log() .confirmations(CONFIRMATIONS) - .await? + .await + .map_err(|e| { + ChainError::provider_error( + "Failed to get receipt after calling handle_acceptance", + e, + ) + })? .ok_or(anyhow!("No receipt"))?; Ok(receipt .status @@ -214,16 +231,22 @@ impl ChainClient { controller_eth_addr: &String, email_auth_msg: EmailAuthMsg, template_idx: u64, - ) -> Result { + ) -> std::result::Result { let controller_eth_addr: H160 = controller_eth_addr.parse()?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let call = contract.handle_recovery(email_auth_msg, template_idx.into()); - let tx = call.send().await?; + let tx = call + .send() + .await + .map_err(|e| ChainError::contract_error("Failed to call handle_recovery", e))?; // If the transaction is successful, the function will return true and false otherwise. let receipt = tx .log() .confirmations(CONFIRMATIONS) - .await? + .await + .map_err(|e| { + ChainError::provider_error("Failed to get receipt after calling handle_recovery", e) + })? .ok_or(anyhow!("No receipt"))?; Ok(receipt .status @@ -231,13 +254,16 @@ impl ChainClient { .unwrap_or(false)) } - pub async fn get_bytecode(&self, wallet_addr: &String) -> Result { - let wallet_address: H160 = wallet_addr.parse().map_err(ApiError::HexError)?; + pub async fn get_bytecode( + &self, + wallet_addr: &String, + ) -> std::result::Result { + let wallet_address: H160 = wallet_addr.parse().map_err(ChainError::HexError)?; let client_code = self .client .get_code(wallet_address, None) .await - .map_err(|e| ApiError::signer_middleware_error("Failed to get bytecode", e))?; + .map_err(|e| ChainError::signer_middleware_error("Failed to get bytecode", e))?; Ok(client_code) } @@ -258,8 +284,9 @@ impl ChainClient { controller_eth_addr: &String, command_params: Vec, template_idx: u64, - ) -> Result { - let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; + ) -> Result { + let controller_eth_addr: H160 = + controller_eth_addr.parse().map_err(ChainError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let command_params_bytes = command_params .iter() // Change here: use iter() instead of map() directly on Vec @@ -276,7 +303,7 @@ impl ChainClient { .call() .await .map_err(|e| { - ApiError::contract_error( + ChainError::contract_error( "Failed to get recovered account from acceptance subject", e, ) @@ -289,17 +316,18 @@ impl ChainClient { controller_eth_addr: &String, command_params: Vec, template_idx: u64, - ) -> Result { - let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; + ) -> Result { + let controller_eth_addr: H160 = + controller_eth_addr.parse().map_err(ChainError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let command_params_bytes = command_params .iter() // Change here: use iter() instead of map() directly on Vec .map(|s| { s.abi_encode(None).map_err(|_| { - ApiError::Validation("Error encoding subject parameters".to_string()) + ChainError::Validation("Error encoding subject parameters".to_string()) }) }) - .collect::, ApiError>>()?; + .collect::, ChainError>>()?; let recovered_account = contract .extract_recovered_account_from_recovery_command( command_params_bytes, @@ -308,7 +336,10 @@ impl ChainClient { .call() .await .map_err(|e| { - ApiError::contract_error("Failed to get recovered account from recovery subject", e) + ChainError::contract_error( + "Failed to get recovered account from recovery subject", + e, + ) })?; Ok(recovered_account) } @@ -317,15 +348,16 @@ impl ChainClient { &self, controller_eth_addr: &String, account_eth_addr: &String, - ) -> Result { - let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ApiError::HexError)?; - let account_eth_addr: H160 = account_eth_addr.parse().map_err(ApiError::HexError)?; + ) -> Result { + let controller_eth_addr: H160 = + controller_eth_addr.parse().map_err(ChainError::HexError)?; + let account_eth_addr: H160 = account_eth_addr.parse().map_err(ChainError::HexError)?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let is_activated = contract .is_activated(account_eth_addr) .call() .await - .map_err(|e| ApiError::contract_error("Failed to check if is activated", e))?; + .map_err(|e| ChainError::contract_error("Failed to check if is activated", e))?; Ok(is_activated) } } diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 26e3b508..64320781 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -14,7 +14,7 @@ const DOMAIN_FIELDS: usize = 9; const COMMAND_FIELDS: usize = 20; const EMAIL_ADDR_FIELDS: usize = 9; -pub async fn handle_email(email: String) -> Result { +pub async fn handle_email(email: String) -> Result { let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; trace!(LOG, "email: {}", email); let guardian_email_addr = parsed_email.get_from_addr()?; @@ -63,7 +63,8 @@ pub async fn handle_email(email: String) -> Result { &request.account_eth_addr, request.account_salt.as_deref().unwrap_or_default(), ) - .await?; + .await + .map_err(|e| EmailError::Dkim(format!("Failed to check and update dkim: {}", e)))?; if let Ok(invitation_code) = parsed_email.get_invitation_code(false) { if !request.is_for_recovery { @@ -361,6 +362,252 @@ pub fn get_masked_command(public_signals: Vec, start_idx: usize) -> Result // Gather signals from start_idx to start_idx + COMMAND_FIELDS let mut command_bytes = Vec::new(); for i in start_idx..start_idx + COMMAND_FIELDS { +#[named] +async fn get_verified_request( + email: &String, + guardian_email_addr: String, +) -> Result<(Option, String), EmailError> { + let request_decomposed_def = + serde_json::from_str(include_str!("./regex_json/request_def.json")) + .map_err(|e| EmailError::Parse(format!("Failed to parse request_def.json: {}", e)))?; + println!("request_decomposed_def: {:?}", request_decomposed_def); + let request_idxes = extract_substr_idxes(email, &request_decomposed_def)?; + println!("request_idxes: {:?}", request_idxes); + if request_idxes.is_empty() { + return Err(EmailError::Subject(WRONG_SUBJECT_FORMAT.to_string())); + } + info!(LOG, "Request idxes: {:?}", request_idxes; "func" => function_name!()); + let request_id = &email[request_idxes[0].0..request_idxes[0].1]; + println!("request_id: {:?}", request_id); + let request_id_u32 = request_id + .parse::() + .map_err(|e| EmailError::Parse(format!("Failed to parse request_id to u64: {}", e)))?; + println!("request_id_u32: {:?}", request_id_u32); + let request_record = DB.get_request(request_id_u32).await?; + println!("request_record: {:?}", request_record); + let request = match request_record { + Some(req) => req, + None => return Ok((None, request_id.to_string())), + }; + println!("request: {:?}", request); + if request.guardian_email_addr != guardian_email_addr { + Err(EmailError::EmailAddress(format!( + "Guardian email address in the request {} is not equal to the one in the email {}", + request.guardian_email_addr, guardian_email_addr + ))) + } else { + Ok((Some(request), request_id.to_string())) + } +} + +async fn get_account_code( + request: &Request, + guardian_email_addr: &str, +) -> Result { + DB.get_account_code_from_wallet_and_email(&request.account_eth_addr, guardian_email_addr) + .await? + .ok_or_else(|| EmailError::NotFound("User not registered".to_string())) +} + +#[named] +async fn handle_with_invitation_code( + params: EmailRequestContext, +) -> Result { + let invitation_code = params.invitation_code.clone().unwrap_or_else(|| { + panic!("handle_with_invitation_code can only be calld with an ivitation code") + }); + + println!("invitation_code: {:?}", invitation_code); + trace!(LOG, "Email with account code"; "func" => function_name!()); + + if params.account_code_str != invitation_code { + return Err(EmailError::EmailAddress(format!( + "Stored account code is not equal to one in the email. Stored: {}, Email: {}", + params.account_code_str, invitation_code + ))); + } + + if !params.request.is_for_recovery { + accept(params, invitation_code).await + } else { + recover(params).await + } +} + +async fn handle_without_invitation_code( + params: EmailRequestContext, +) -> Result { + if params.request.is_for_recovery { + recover(params).await + } else { + Ok(EmailAuthEvent::Error { + email_addr: params.guardian_email_addr, + error: "No account code found".to_string(), + }) + } +} + +async fn accept( + params: EmailRequestContext, + invitation_code: String, +) -> Result { + let subject_template = CLIENT + .get_acceptance_subject_templates( + ¶ms.request.controller_eth_addr, + params.request.template_idx, + ) + .await?; + println!("subject_template: {:?}", subject_template); + + let (email_auth_msg, account_salt, email_proof) = + get_email_auth_message(¶ms, subject_template).await?; + + let is_guardian_accepted = CLIENT + .handle_acceptance( + ¶ms.request.controller_eth_addr, + email_auth_msg, + params.request.template_idx, + ) + .await?; + + update_request( + ¶ms, + is_guardian_accepted, + email_proof.email_nullifier, + account_salt, + ) + .await?; + + if is_guardian_accepted { + let creds = Credentials { + account_code: invitation_code, + account_eth_addr: params.request.account_eth_addr.clone(), + guardian_email_addr: params.guardian_email_addr.clone(), + is_set: true, + }; + println!("creds: {:?}", creds); + + let update_credentials_result = DB.update_credentials_of_account_code(&creds).await?; + println!("update_credentials_result: {:?}", update_credentials_result); + + Ok(EmailAuthEvent::AcceptanceSuccess { + account_eth_addr: params.request.account_eth_addr, + guardian_email_addr: params.guardian_email_addr, + request_id: params.request.request_id, + }) + } else { + Ok(EmailAuthEvent::Error { + email_addr: params.guardian_email_addr, + error: "Failed to handle acceptance".to_string(), + }) + } +} + +async fn recover(params: EmailRequestContext) -> Result { + let subject_template = CLIENT + .get_recovery_subject_templates( + ¶ms.request.controller_eth_addr, + params.request.template_idx, + ) + .await?; + println!("subject_template: {:?}", subject_template); + + let (email_auth_msg, account_salt, email_proof) = + get_email_auth_message(¶ms, subject_template).await?; + + let is_recovery_successfull = CLIENT + .handle_recovery( + ¶ms.request.controller_eth_addr, + email_auth_msg, + params.request.template_idx, + ) + .await?; + + update_request( + ¶ms, + is_recovery_successfull, + email_proof.email_nullifier, + account_salt, + ) + .await?; + + if is_recovery_successfull { + Ok(EmailAuthEvent::RecoverySuccess { + account_eth_addr: params.request.account_eth_addr, + guardian_email_addr: params.guardian_email_addr, + request_id: params.request.request_id, + }) + } else { + Ok(EmailAuthEvent::Error { + email_addr: params.guardian_email_addr, + error: "Failed to handle recovery".to_string(), + }) + } +} + +#[named] +async fn get_email_auth_message( + params: &EmailRequestContext, + subject_template: Vec, +) -> Result<(EmailAuthMsg, [u8; 32], EmailProof), EmailError> { + let (subject_params, skipped_subject_prefix) = + extract_template_vals_and_skipped_subject_idx(¶ms.subject, subject_template) + .map_err(|e| EmailError::Subject(format!("Invalid Subject, {}", e)))?; + println!("subject_params: {:?}", subject_params); + println!("skipped_subject_prefix: {:?}", skipped_subject_prefix); + + let subject_params_encoded: Vec = subject_params + .iter() + .map(|param| param.abi_encode(None).unwrap()) + .collect(); + println!("subject_params_encoded: {:?}", subject_params_encoded); + + let (email_proof, account_salt) = get_email_proof(params).await?; + + let template_id = get_template_id(params.request.template_idx); + + let email_auth_msg = EmailAuthMsg { + template_id: template_id.into(), + subject_params: subject_params_encoded, + skiped_subject_prefix: skipped_subject_prefix.into(), + proof: email_proof.clone(), + }; + println!("email_auth_msg: {:?}", email_auth_msg); + + info!(LOG, "Email Auth Msg: {:?}", email_auth_msg; "func" => function_name!()); + info!(LOG, "Request: {:?}", params.request; "func" => function_name!()); + Ok((email_auth_msg, account_salt, email_proof)) +} + +async fn update_request( + params: &EmailRequestContext, + is_success: bool, + email_nullifier: [u8; 32], + account_salt: [u8; 32], +) -> Result<(), EmailError> { + let updated_request = Request { + account_eth_addr: params.request.account_eth_addr.clone(), + controller_eth_addr: params.request.controller_eth_addr.clone(), + guardian_email_addr: params.guardian_email_addr.clone(), + template_idx: params.request.template_idx, + is_for_recovery: params.request.is_for_recovery, + is_processed: true, + request_id: params.request.request_id, + is_success: Some(is_success), + email_nullifier: Some(field2hex(&bytes32_to_fr(&email_nullifier).unwrap())), + account_salt: Some(bytes32_to_hex(&account_salt)), + }; + println!("updated_request: {:?}", updated_request); + + let update_request_result = DB.update_request(&updated_request).await?; + println!("update_request_result: {:?}", update_request_result); + Ok(()) +} + +fn get_masked_subject(public_signals: Vec, start_idx: usize) -> Result { + // Gather signals from start_idx to start_idx + SUBJECT_FIELDS + let mut subject_bytes = Vec::new(); + for i in start_idx..start_idx + SUBJECT_FIELDS { let signal = public_signals[i as usize]; if signal == U256::zero() { break; @@ -389,12 +636,19 @@ fn get_template_id(template_idx: u64) -> [u8; 32] { template_id } -async fn get_email_proof(params: &EmailRequestContext) -> Result<(EmailProof, [u8; 32])> { +async fn get_email_proof( + params: &EmailRequestContext, +) -> Result<(EmailProof, [u8; 32]), EmailError> { let circuit_input = generate_email_auth_input( ¶ms.email, - &AccountCode::from(hex2field(&format!("0x{}", ¶ms.account_code_str))?), + &AccountCode::from( + hex2field(&format!("0x{}", ¶ms.account_code_str)).map_err(|e| { + EmailError::Parse(format!("Could not convert account_code_str to hex: {}", e)) + })?, + ), ) - .await?; + .await + .map_err(|e| EmailError::Circuit(format!("Failed to generate email auth input: {}", e)))?; println!("circuit_input: {:?}", circuit_input); let (proof, public_signals) = diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs index 29da457f..9af33506 100644 --- a/packages/relayer/src/database.rs +++ b/packages/relayer/src/database.rs @@ -102,7 +102,7 @@ impl Database { &self, account_eth_addr: &str, email_addr: &str, - ) -> std::result::Result { + ) -> std::result::Result { let row = sqlx::query( "SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2", ) @@ -110,9 +110,7 @@ impl Database { .bind(email_addr) .fetch_optional(&self.db) .await - .map_err(|e| { - ApiError::database_error("Failed to check if wallet and email are registered", e) - })?; + .map_err(|e| DatabaseError::new("Failed to check if wallet and email are registered", e))?; match row { Some(_) => Ok(true), @@ -120,21 +118,27 @@ impl Database { } } - pub(crate) async fn update_credentials_of_account_code(&self, row: &Credentials) -> Result<()> { + pub(crate) async fn update_credentials_of_account_code( + &self, + row: &Credentials, + ) -> std::result::Result<(), DatabaseError> { let res = sqlx::query("UPDATE credentials SET account_eth_addr = $1, guardian_email_addr = $2, is_set = $3 WHERE account_code = $4") .bind(&row.account_eth_addr) .bind(&row.guardian_email_addr) .bind(row.is_set) .bind(&row.account_code) .execute(&self.db) - .await?; + .await + .map_err(|e| { + DatabaseError::new("Failed to update credentials of account code", e) + })?; Ok(()) } pub(crate) async fn update_credentials_of_wallet_and_email( &self, row: &Credentials, - ) -> std::result::Result<(), ApiError> { + ) -> std::result::Result<(), DatabaseError> { let res = sqlx::query("UPDATE credentials SET account_code = $1, is_set = $2 WHERE account_eth_addr = $3 AND guardian_email_addr = $4") .bind(&row.account_code) .bind(row.is_set) @@ -143,7 +147,7 @@ impl Database { .execute(&self.db) .await .map_err(|e| { - ApiError::database_error("Failed to insert credentials of wallet and email", e) + DatabaseError::new("Failed to insert credentials of wallet and email", e) })?; Ok(()) } @@ -152,7 +156,7 @@ impl Database { &self, is_set: bool, account_eth_addr: &str, - ) -> std::result::Result<(), ApiError> { + ) -> std::result::Result<(), DatabaseError> { let res = sqlx::query( "UPDATE credentials SET is_set = $1 WHERE account_eth_addr = $2 AND is_set = true", ) @@ -160,9 +164,7 @@ impl Database { .bind(account_eth_addr) .execute(&self.db) .await - .map_err(|e| { - ApiError::database_error("Failed to update credentials of inactive guardian", e) - })?; + .map_err(|e| DatabaseError::new("Failed to update credentials of inactive guardian", e))?; Ok(()) } @@ -170,7 +172,7 @@ impl Database { pub(crate) async fn insert_credentials( &self, row: &Credentials, - ) -> std::result::Result<(), ApiError> { + ) -> std::result::Result<(), DatabaseError> { info!(LOG, "insert row {:?}", row; "func" => function_name!()); let row = sqlx::query( "INSERT INTO credentials (account_code, account_eth_addr, guardian_email_addr, is_set) VALUES ($1, $2, $3, $4) RETURNING *", @@ -181,7 +183,7 @@ impl Database { .bind(row.is_set) .fetch_one(&self.db) .await - .map_err(|e| ApiError::database_error("Failed to insert credentials", e))?; + .map_err(|e| DatabaseError::new("Failed to insert credentials", e))?; info!( LOG, "{} row inserted", @@ -194,13 +196,13 @@ impl Database { &self, account_eth_addr: &str, guardian_email_addr: &str, - ) -> std::result::Result { + ) -> std::result::Result { let row = sqlx::query("SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2 AND is_set = TRUE") .bind(account_eth_addr) .bind(guardian_email_addr) .fetch_optional(&self.db) .await - .map_err(|e| ApiError::database_error("Failed to check if guardian is set", e))?; + .map_err(|e| DatabaseError::new("Failed to check if guardian is set", e))?; match row { Some(_) => Ok(true), @@ -212,12 +214,12 @@ impl Database { pub(crate) async fn get_request( &self, request_id: u32, - ) -> std::result::Result, ApiError> { + ) -> std::result::Result, DatabaseError> { let row = sqlx::query("SELECT * FROM requests WHERE request_id = $1") .bind(request_id as i64) .fetch_optional(&self.db) .await - .map_err(|e| ApiError::database_error("Failed to get request", e))?; + .map_err(|e| DatabaseError::new("Failed to get request", e))?; match row { Some(row) => { @@ -250,7 +252,10 @@ impl Database { } } - pub(crate) async fn update_request(&self, row: &Request) -> Result<()> { + pub(crate) async fn update_request( + &self, + row: &Request, + ) -> std::result::Result<(), DatabaseError> { let res = sqlx::query("UPDATE requests SET account_eth_addr = $1, controller_eth_addr = $2, guardian_email_addr = $3, is_for_recovery = $4, template_idx = $5, is_processed = $6, is_success = $7, email_nullifier = $8, account_salt = $9 WHERE request_id = $10") .bind(&row.account_eth_addr) .bind(&row.controller_eth_addr) @@ -263,7 +268,8 @@ impl Database { .bind(&row.account_salt) .bind(row.request_id as i64) .execute(&self.db) - .await?; + .await + .map_err(|e| DatabaseError::new("Failed to update request", e))?; Ok(()) } @@ -271,14 +277,15 @@ impl Database { &self, account_eth_addr: &str, email_addr: &str, - ) -> Result> { + ) -> std::result::Result, DatabaseError> { let row = sqlx::query( "SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2", ) .bind(account_eth_addr) .bind(email_addr) .fetch_optional(&self.db) - .await?; + .await + .map_err(|e| DatabaseError::new("Failed to get account code from wallet and email", e))?; match row { Some(row) => { @@ -293,7 +300,7 @@ impl Database { &self, account_eth_addr: &str, email_addr: &str, - ) -> std::result::Result, ApiError> { + ) -> std::result::Result, DatabaseError> { let row = sqlx::query( "SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2", ) @@ -301,9 +308,7 @@ impl Database { .bind(email_addr) .fetch_optional(&self.db) .await - .map_err(|e| { - ApiError::database_error("Failed to get credentials from wallet and email", e) - })?; + .map_err(|e| DatabaseError::new("Failed to get credentials from wallet and email", e))?; match row { Some(row) => { @@ -325,7 +330,10 @@ impl Database { } #[named] - pub(crate) async fn insert_request(&self, row: &Request) -> std::result::Result<(), ApiError> { + pub(crate) async fn insert_request( + &self, + row: &Request, + ) -> std::result::Result<(), DatabaseError> { info!(LOG, "insert row {:?}", row; "func" => function_name!()); let row = sqlx::query( "INSERT INTO requests (request_id, account_eth_addr, controller_eth_addr, guardian_email_addr, is_for_recovery, template_idx, is_processed, is_success, email_nullifier, account_salt) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *", @@ -342,7 +350,7 @@ impl Database { .bind(&row.account_salt) .fetch_one(&self.db) .await - .map_err(|e| ApiError::database_error("Failed to insert request", e))?; + .map_err(|e| DatabaseError::new("Failed to insert request", e))?; info!( LOG, "{} row inserted", diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs index 98c5d0db..82a749a6 100644 --- a/packages/relayer/src/modules/mail.rs +++ b/packages/relayer/src/modules/mail.rs @@ -73,7 +73,7 @@ pub struct EmailAttachment { pub contents: Vec, } -pub async fn handle_email_event(event: EmailAuthEvent) -> Result<()> { +pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> { match event { EmailAuthEvent::AcceptanceRequest { account_eth_addr, @@ -360,15 +360,23 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<()> { Ok(()) } -pub async fn render_html(template_name: &str, render_data: Value) -> Result { +pub async fn render_html(template_name: &str, render_data: Value) -> Result { let email_template_filename = PathBuf::new() .join(EMAIL_TEMPLATES.get().unwrap()) .join(template_name); - let email_template = read_to_string(&email_template_filename).await?; + let email_template = read_to_string(&email_template_filename) + .await + .map_err(|e| { + EmailError::FileNotFound(format!( + "Could not get email template {}: {}", + template_name, e + )) + })?; let reg = Handlebars::new(); - Ok(reg.render_template(&email_template, &render_data)?) + let template = reg.render_template(&email_template, &render_data)?; + Ok(template) } pub fn parse_error(error: String) -> Result> { @@ -394,7 +402,7 @@ pub fn parse_error(error: String) -> Result> { } } -pub async fn send_email(email: EmailMessage) -> Result<()> { +pub async fn send_email(email: EmailMessage) -> Result<(), EmailError> { let smtp_server = SMTP_SERVER.get().unwrap(); // Send POST request to email server @@ -404,13 +412,13 @@ pub async fn send_email(email: EmailMessage) -> Result<()> { .json(&email) .send() .await - .map_err(|e| anyhow!("Failed to send email: {}", e))?; + .map_err(|e| EmailError::Send(format!("Failed to send email: {}", e)))?; if !response.status().is_success() { - return Err(anyhow!( + return Err(EmailError::Send(format!( "Failed to send email: {}", response.text().await.unwrap_or_default() - )); + ))); } Ok(()) diff --git a/packages/relayer/src/modules/web_server/errors.rs b/packages/relayer/src/modules/web_server/errors.rs index 2b53701f..a4651d64 100644 --- a/packages/relayer/src/modules/web_server/errors.rs +++ b/packages/relayer/src/modules/web_server/errors.rs @@ -3,6 +3,8 @@ use axum::{ response::{IntoResponse, Response}, Json, }; +use handlebars::RenderError; +use relayer_utils::ExtractSubstrssError; use reqwest::StatusCode; use rustc_hex::FromHexError; use serde_json::json; @@ -11,25 +13,85 @@ use thiserror::Error; #[derive(Error, Debug)] pub enum ApiError { #[error("Database error: {0}")] - Database(DatabaseError), + Database(#[from] DatabaseError), #[error("Sqlx error: {0}")] SqlxError(#[from] sqlx::Error), - #[error("Contract error: {0}")] - Contract(ContractErrorWrapper), - #[error("Signer middleware error: {0}")] - SignerMiddleware(SignerMiddlewareErrorWrapper), #[error("Validation error: {0}")] Validation(String), + #[error("Chain error: {0}")] + Chain(#[from] ChainError), // #[error("Not found: {0}")] // NotFound(String), - #[error("Provider error: {0}")] - Provider(ProviderErrorWrapper), - #[error("Hex error: {0}")] - HexError(#[from] FromHexError), #[error("Anyhow error: {0}")] Anyhow(#[from] anyhow::Error), #[error("Internal error: {0}")] Internal(String), + #[error("Error recieving email: {0}")] + Email(#[from] EmailError), +} + +#[derive(Error, Debug)] +pub enum EmailError { + #[error("Subject error: {0}")] + Subject(String), + #[error("Email address error: {0}")] + EmailAddress(String), + #[error("Parse error: {0}")] + Parse(String), + #[error("DKIM error: {0}")] + Dkim(String), + #[error("ZkRegex error: {0}")] + ZkRegex(#[from] ExtractSubstrssError), + #[error("Database error: {0}")] + Database(#[from] DatabaseError), + #[error("Not found: {0}")] + NotFound(String), + #[error("Circuit error: {0}")] + Circuit(String), + #[error("Chain error: {0}")] + Chain(#[from] ChainError), + #[error("File not found error: {0}")] + FileNotFound(String), + #[error("Render error: {0}")] + Render(#[from] RenderError), + #[error("Failed to send email: {0}")] + Send(String), + // Currently used with some relayer-utils errors + #[error("Anyhow error: {0}")] + Anyhow(#[from] anyhow::Error), +} + +#[derive(Error, Debug)] +pub enum ChainError { + #[error("Contract error: {0}")] + Contract(ContractErrorWrapper), + #[error("Signer middleware error: {0}")] + SignerMiddleware(SignerMiddlewareErrorWrapper), + #[error("Hex error: {0}")] + HexError(#[from] FromHexError), + #[error("Provider error: {0}")] + Provider(ProviderErrorWrapper), + #[error("Anyhow error: {0}")] + Anyhow(#[from] anyhow::Error), + #[error("Validation error: {0}")] + Validation(String), +} + +impl ChainError { + pub fn contract_error(msg: &str, err: ContractError) -> Self { + Self::Contract(ContractErrorWrapper::new(msg.to_string(), err)) + } + + pub fn signer_middleware_error( + msg: &str, + err: signer::SignerMiddlewareError, + ) -> Self { + Self::SignerMiddleware(SignerMiddlewareErrorWrapper::new(msg.to_string(), err)) + } + + pub fn provider_error(msg: &str, err: ethers::providers::ProviderError) -> Self { + Self::Provider(ProviderErrorWrapper::new(msg.to_string(), err)) + } } #[derive(Debug, thiserror::Error)] @@ -41,8 +103,11 @@ pub struct DatabaseError { } impl DatabaseError { - pub fn new(source: sqlx::Error, msg: String) -> Self { - Self { source, msg } + pub fn new(msg: &str, source: sqlx::Error) -> Self { + Self { + source, + msg: msg.to_string(), + } } } @@ -111,22 +176,7 @@ impl ProviderErrorWrapper { impl ApiError { pub fn database_error(msg: &str, source: sqlx::Error) -> Self { - Self::Database(DatabaseError::new(source, msg.to_string())) - } - - pub fn contract_error(msg: &str, err: ContractError) -> Self { - Self::Contract(ContractErrorWrapper::new(msg.to_string(), err)) - } - - pub fn signer_middleware_error( - msg: &str, - err: signer::SignerMiddlewareError, - ) -> Self { - Self::SignerMiddleware(SignerMiddlewareErrorWrapper::new(msg.to_string(), err)) - } - - pub fn provider_error(msg: &str, err: ethers::providers::ProviderError) -> Self { - Self::Provider(ProviderErrorWrapper::new(msg.to_string(), err)) + Self::Database(DatabaseError::new(msg, source)) } } @@ -134,15 +184,26 @@ impl IntoResponse for ApiError { fn into_response(self) -> Response { let (status, error_message) = match self { ApiError::Database(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - ApiError::Contract(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - ApiError::SignerMiddleware(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + ApiError::Chain(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), ApiError::SqlxError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), ApiError::Validation(e) => (StatusCode::BAD_REQUEST, e), - // ApiError::NotFound(e) => (StatusCode::NOT_FOUND, e), - ApiError::Provider(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), ApiError::Anyhow(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - ApiError::HexError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), ApiError::Internal(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + ApiError::Email(e) => match e { + EmailError::Subject(e) => (StatusCode::BAD_REQUEST, e.to_string()), + EmailError::EmailAddress(e) => (StatusCode::BAD_REQUEST, e.to_string()), + EmailError::Parse(e) => (StatusCode::BAD_REQUEST, e.to_string()), + EmailError::NotFound(e) => (StatusCode::BAD_REQUEST, e.to_string()), + EmailError::Dkim(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + EmailError::ZkRegex(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + EmailError::Database(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + EmailError::Circuit(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + EmailError::Chain(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + EmailError::FileNotFound(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + EmailError::Render(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + EmailError::Send(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + EmailError::Anyhow(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + }, }; (status, Json(json!({ "error": error_message }))).into_response() } diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 9c9f259b..ac6d4f5b 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -599,9 +599,9 @@ fn parse_error_message(error_data: String) -> String { format!("Failed to parse contract error: {}", error_data) } -pub async fn receive_email_api_fn(email: String) -> Result<()> { - let parsed_email = ParsedEmail::new_from_raw_email(&email).await.unwrap(); - let from_addr = parsed_email.get_from_addr().unwrap(); +pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { + let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; + let from_addr = parsed_email.get_from_addr()?; tokio::spawn(async move { match handle_email_event(EmailAuthEvent::Ack { email_addr: from_addr.clone(), diff --git a/packages/relayer/src/modules/web_server/server.rs b/packages/relayer/src/modules/web_server/server.rs index 63c00b66..fbf85e77 100644 --- a/packages/relayer/src/modules/web_server/server.rs +++ b/packages/relayer/src/modules/web_server/server.rs @@ -20,20 +20,7 @@ pub async fn run_server() -> Result<()> { ) .route("/api/getAccountSalt", post(get_account_salt)) .route("/api/inactiveGuardian", post(inactive_guardian)) - .route( - "/api/receiveEmail", - axum::routing::post::<_, _, (), _>(move |payload: String| async move { - println!("/api/receiveEmail"); - info!(LOG, "Receive email payload: {}", payload); - match receive_email_api_fn(payload).await { - Ok(_) => "Request processed".to_string(), - Err(err) => { - error!(LOG, "Failed to complete the receive email request: {}", err); - err.to_string() - } - } - }), - ); + .route("/api/receiveEmail", post(receive_email_api_fn)); app = app.layer( CorsLayer::new() From f8d73e8ab16e7d0295a01cb0855881c49b1bb46e Mon Sep 17 00:00:00 2001 From: Dimitri Date: Wed, 11 Sep 2024 12:03:24 +0700 Subject: [PATCH 069/121] Rebase solve conflicts of body-parser refacor --- packages/relayer/src/chain.rs | 1 - packages/relayer/src/core.rs | 358 +++++++++--------- packages/relayer/src/database.rs | 17 +- packages/relayer/src/lib.rs | 2 +- .../relayer/src/modules/web_server/errors.rs | 12 +- .../src/modules/web_server/rest_api.rs | 308 ++++----------- packages/relayer/src/utils/utils.rs | 4 +- 7 files changed, 261 insertions(+), 441 deletions(-) diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index 07dc16a7..b124488f 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -4,7 +4,6 @@ use ethers::middleware::Middleware; use ethers::prelude::*; use ethers::signers::Signer; use relayer_utils::converters::u64_to_u8_array_32; -use relayer_utils::LOG; const CONFIRMATIONS: usize = 1; diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 64320781..08d99abe 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -23,10 +23,11 @@ pub async fn handle_email(email: String) -> Result { let email_body = parsed_email.get_cleaned_body()?; let request_decomposed_def = - serde_json::from_str(include_str!("./regex_json/request_def.json"))?; + serde_json::from_str(include_str!("./regex_json/request_def.json")) + .map_err(|e| EmailError::Parse(e.to_string()))?; let request_idxes = extract_substr_idxes(&email, &request_decomposed_def)?; if request_idxes.is_empty() { - bail!(WRONG_COMMAND_FORMAT); + return Err(EmailError::Body(WRONG_COMMAND_FORMAT.to_string())); } info!(LOG, "Request idxes: {:?}", request_idxes); let request_id = &email[request_idxes[0].0..request_idxes[0].1]; @@ -34,19 +35,20 @@ pub async fn handle_email(email: String) -> Result { .parse::() .map_err(|e| anyhow!("Failed to parse request_id to u64: {}", e))?; let request_record = DB.get_request(request_id_u32).await?; - if request_record.is_none() { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: format!("Request {} not found", request_id), - }); - } - let request = request_record.unwrap(); + let request = match request_record { + Some(r) => r, + None => { + return Ok(EmailAuthEvent::Error { + email_addr: guardian_email_addr, + error: format!("Request {} not found", request_id), + }); + } + }; if request.guardian_email_addr != guardian_email_addr { - return Err(anyhow!( + return Err(EmailError::EmailAddress(format!( "Guardian email address in the request {} is not equal to the one in the email {}", - request.guardian_email_addr, - guardian_email_addr - )); + request.guardian_email_addr, guardian_email_addr + ))); } let account_code_str = DB .get_account_code_from_wallet_and_email(&request.account_eth_addr, &guardian_email_addr) @@ -63,8 +65,7 @@ pub async fn handle_email(email: String) -> Result { &request.account_eth_addr, request.account_salt.as_deref().unwrap_or_default(), ) - .await - .map_err(|e| EmailError::Dkim(format!("Failed to check and update dkim: {}", e)))?; + .await?; if let Ok(invitation_code) = parsed_email.get_invitation_code(false) { if !request.is_for_recovery { @@ -388,62 +389,46 @@ async fn get_verified_request( let request = match request_record { Some(req) => req, None => return Ok((None, request_id.to_string())), + let invitation_code = match parsed_email.get_invitation_code(false) { + Ok(code) => Some(code), + Err(_) => None, }; - println!("request: {:?}", request); - if request.guardian_email_addr != guardian_email_addr { - Err(EmailError::EmailAddress(format!( - "Guardian email address in the request {} is not equal to the one in the email {}", - request.guardian_email_addr, guardian_email_addr - ))) - } else { - Ok((Some(request), request_id.to_string())) - } -} - -async fn get_account_code( - request: &Request, - guardian_email_addr: &str, -) -> Result { - DB.get_account_code_from_wallet_and_email(&request.account_eth_addr, guardian_email_addr) - .await? - .ok_or_else(|| EmailError::NotFound("User not registered".to_string())) -} - -#[named] -async fn handle_with_invitation_code( - params: EmailRequestContext, -) -> Result { - let invitation_code = params.invitation_code.clone().unwrap_or_else(|| { - panic!("handle_with_invitation_code can only be calld with an ivitation code") - }); - - println!("invitation_code: {:?}", invitation_code); - trace!(LOG, "Email with account code"; "func" => function_name!()); - if params.account_code_str != invitation_code { - return Err(EmailError::EmailAddress(format!( - "Stored account code is not equal to one in the email. Stored: {}, Email: {}", - params.account_code_str, invitation_code - ))); - } + let params = EmailRequestContext { + request, + email_body, + account_code_str, + email, + parsed_email, + }; - if !params.request.is_for_recovery { - accept(params, invitation_code).await - } else { - recover(params).await - } + handle_email_request(params, invitation_code).await } -async fn handle_without_invitation_code( +async fn handle_email_request( params: EmailRequestContext, + invitation_code: Option, ) -> Result { - if params.request.is_for_recovery { - recover(params).await - } else { - Ok(EmailAuthEvent::Error { - email_addr: params.guardian_email_addr, - error: "No account code found".to_string(), - }) + match (invitation_code, params.request.is_for_recovery) { + (Some(invitation_code), is_for_recovery) if !is_for_recovery => { + if params.account_code_str != invitation_code { + return Err(EmailError::Body(format!( + "Stored account code is not equal to one in the email. Stored: {}, Email: {}", + params.account_code_str, invitation_code + ))); + }; + trace!(LOG, "Email with account code"); + accept(params, invitation_code).await + } + (None, is_for_recovery) if is_for_recovery => recover(params).await, + (Some(_), _) => Ok(EmailAuthEvent::Error { + email_addr: params.request.guardian_email_addr, + error: "Account code found and for recovery".to_string(), + }), + (None, _) => Ok(EmailAuthEvent::Error { + email_addr: params.request.guardian_email_addr, + error: "No account code found and not for recovery".to_string(), + }), } } @@ -451,18 +436,12 @@ async fn accept( params: EmailRequestContext, invitation_code: String, ) -> Result { - let subject_template = CLIENT - .get_acceptance_subject_templates( - ¶ms.request.controller_eth_addr, - params.request.template_idx, - ) - .await?; - println!("subject_template: {:?}", subject_template); + let (email_auth_msg, email_proof, account_salt) = get_email_auth_msg(¶ms).await?; - let (email_auth_msg, account_salt, email_proof) = - get_email_auth_message(¶ms, subject_template).await?; + info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); + info!(LOG, "Request: {:?}", params.request); - let is_guardian_accepted = CLIENT + let is_accepted = CLIENT .handle_acceptance( ¶ms.request.controller_eth_addr, email_auth_msg, @@ -472,50 +451,41 @@ async fn accept( update_request( ¶ms, - is_guardian_accepted, + is_accepted, email_proof.email_nullifier, account_salt, ) .await?; - if is_guardian_accepted { + if is_accepted { let creds = Credentials { account_code: invitation_code, account_eth_addr: params.request.account_eth_addr.clone(), - guardian_email_addr: params.guardian_email_addr.clone(), + guardian_email_addr: params.request.guardian_email_addr.clone(), is_set: true, }; - println!("creds: {:?}", creds); - - let update_credentials_result = DB.update_credentials_of_account_code(&creds).await?; - println!("update_credentials_result: {:?}", update_credentials_result); + DB.update_credentials_of_account_code(&creds).await?; Ok(EmailAuthEvent::AcceptanceSuccess { account_eth_addr: params.request.account_eth_addr, - guardian_email_addr: params.guardian_email_addr, + guardian_email_addr: params.request.guardian_email_addr, request_id: params.request.request_id, }) } else { Ok(EmailAuthEvent::Error { - email_addr: params.guardian_email_addr, + email_addr: params.request.guardian_email_addr, error: "Failed to handle acceptance".to_string(), }) } } async fn recover(params: EmailRequestContext) -> Result { - let subject_template = CLIENT - .get_recovery_subject_templates( - ¶ms.request.controller_eth_addr, - params.request.template_idx, - ) - .await?; - println!("subject_template: {:?}", subject_template); + let (email_auth_msg, email_proof, account_salt) = get_email_auth_msg(¶ms).await?; - let (email_auth_msg, account_salt, email_proof) = - get_email_auth_message(¶ms, subject_template).await?; + info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); + info!(LOG, "Request: {:?}", params.request); - let is_recovery_successfull = CLIENT + let is_success = CLIENT .handle_recovery( ¶ms.request.controller_eth_addr, email_auth_msg, @@ -525,58 +495,43 @@ async fn recover(params: EmailRequestContext) -> Result, -) -> Result<(EmailAuthMsg, [u8; 32], EmailProof), EmailError> { - let (subject_params, skipped_subject_prefix) = - extract_template_vals_and_skipped_subject_idx(¶ms.subject, subject_template) - .map_err(|e| EmailError::Subject(format!("Invalid Subject, {}", e)))?; - println!("subject_params: {:?}", subject_params); - println!("skipped_subject_prefix: {:?}", skipped_subject_prefix); - - let subject_params_encoded: Vec = subject_params - .iter() - .map(|param| param.abi_encode(None).unwrap()) - .collect(); - println!("subject_params_encoded: {:?}", subject_params_encoded); - - let (email_proof, account_salt) = get_email_proof(params).await?; - - let template_id = get_template_id(params.request.template_idx); +fn get_masked_command(public_signals: Vec, start_idx: usize) -> Result { + // Gather signals from start_idx to start_idx + COMMAND_FIELDS + let mut command_bytes = Vec::new(); + for i in start_idx..start_idx + COMMAND_FIELDS { + let signal = public_signals[i as usize]; + if signal == U256::zero() { + break; + } + let bytes = u256_to_bytes32_little(&signal); + command_bytes.extend_from_slice(&bytes); + } - let email_auth_msg = EmailAuthMsg { - template_id: template_id.into(), - subject_params: subject_params_encoded, - skiped_subject_prefix: skipped_subject_prefix.into(), - proof: email_proof.clone(), - }; - println!("email_auth_msg: {:?}", email_auth_msg); + // Bytes to string, removing null bytes + let command = String::from_utf8(command_bytes.into_iter().filter(|&b| b != 0u8).collect()) + .map_err(|e| anyhow!("Failed to convert bytes to string: {}", e))?; - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg; "func" => function_name!()); - info!(LOG, "Request: {:?}", params.request; "func" => function_name!()); - Ok((email_auth_msg, account_salt, email_proof)) + Ok(command) } async fn update_request( @@ -588,13 +543,13 @@ async fn update_request( let updated_request = Request { account_eth_addr: params.request.account_eth_addr.clone(), controller_eth_addr: params.request.controller_eth_addr.clone(), - guardian_email_addr: params.guardian_email_addr.clone(), + guardian_email_addr: params.request.guardian_email_addr.clone(), template_idx: params.request.template_idx, is_for_recovery: params.request.is_for_recovery, is_processed: true, request_id: params.request.request_id, is_success: Some(is_success), - email_nullifier: Some(field2hex(&bytes32_to_fr(&email_nullifier).unwrap())), + email_nullifier: Some(field_to_hex(&bytes32_to_fr(&email_nullifier)?)), account_salt: Some(bytes32_to_hex(&account_salt)), }; println!("updated_request: {:?}", updated_request); @@ -604,85 +559,120 @@ async fn update_request( Ok(()) } -fn get_masked_subject(public_signals: Vec, start_idx: usize) -> Result { - // Gather signals from start_idx to start_idx + SUBJECT_FIELDS - let mut subject_bytes = Vec::new(); - for i in start_idx..start_idx + SUBJECT_FIELDS { - let signal = public_signals[i as usize]; - if signal == U256::zero() { - break; - } - let bytes = u256_to_bytes32_little(&signal); - command_bytes.extend_from_slice(&bytes); - } - - // Bytes to string, removing null bytes - let command = String::from_utf8(command_bytes.into_iter().filter(|&b| b != 0u8).collect()) - .map_err(|e| anyhow!("Failed to convert bytes to string: {}", e))?; - - Ok(command) -} - -fn get_template_id(template_idx: u64) -> [u8; 32] { - let tokens = vec![ - Token::Uint((*EMAIL_ACCOUNT_RECOVERY_VERSION_ID.get().unwrap()).into()), - Token::String("RECOVERY".to_string()), - Token::Uint(template_idx.into()), - ]; - println!("tokens: {:?}", tokens); - - let template_id = keccak256(encode(&tokens)); - println!("template_id: {:?}", template_id); - template_id -} - -async fn get_email_proof( +async fn generate_email_proof( params: &EmailRequestContext, ) -> Result<(EmailProof, [u8; 32]), EmailError> { - let circuit_input = generate_email_auth_input( + let circuit_input = generate_email_circuit_input( ¶ms.email, - &AccountCode::from( - hex2field(&format!("0x{}", ¶ms.account_code_str)).map_err(|e| { - EmailError::Parse(format!("Could not convert account_code_str to hex: {}", e)) - })?, - ), + &AccountCode::from(hex_to_field(&format!("0x{}", ¶ms.account_code_str))?), + Some(EmailCircuitParams { + max_header_length: Some(1024), + max_body_length: Some(1024), + sha_precompute_selector: Some(SHA_PRECOMPUTE_SELECTOR.to_string()), + ignore_body_hash_check: Some(false), + }), ) - .await - .map_err(|e| EmailError::Circuit(format!("Failed to generate email auth input: {}", e)))?; - println!("circuit_input: {:?}", circuit_input); + .await?; let (proof, public_signals) = generate_proof(&circuit_input, "email_auth", PROVER_ADDRESS.get().unwrap()).await?; - println!("proof: {:?}", proof); - println!("public_signals: {:?}", public_signals); - let account_salt = u256_to_bytes32(&public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 3]); - println!("account_salt: {:?}", account_salt); - let is_code_exist = public_signals[SUBJECT_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); - println!("is_code_exist: {:?}", is_code_exist); - let masked_subject = get_masked_subject(public_signals.clone(), DOMAIN_FIELDS + 3)?; - println!("masked_subject: {:?}", masked_subject); + info!(LOG, "Public signals: {:?}", public_signals); + + let account_salt = u256_to_bytes32(&public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 3]); + let is_code_exist = public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); + let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; let email_proof = EmailProof { proof, domain_name: params.parsed_email.get_email_domain()?, public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_subject, + masked_command, email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), account_salt, is_code_exist, }; - println!("email_proof: {:?}", email_proof); + Ok((email_proof, account_salt)) } +fn get_template_id(params: &EmailRequestContext) -> [u8; 32] { + let action = if params.request.is_for_recovery { + "RECOVERY".to_string() + } else { + "ACCEPTANCE".to_string() + }; + + let tokens = vec![ + Token::Uint((*EMAIL_ACCOUNT_RECOVERY_VERSION_ID.get().unwrap()).into()), + // TODO: Continue here + Token::String(action), + Token::Uint(params.request.template_idx.into()), + ]; + + let template_id = keccak256(encode(&tokens)); + template_id +} + +async fn get_encoded_command_params( + params: &EmailRequestContext, +) -> Result, EmailError> { + let command_template = if params.request.is_for_recovery { + CLIENT + .get_recovery_command_templates( + ¶ms.request.controller_eth_addr, + params.request.template_idx, + ) + .await? + } else { + CLIENT + .get_acceptance_command_templates( + ¶ms.request.controller_eth_addr, + params.request.template_idx, + ) + .await? + }; + + let command_params = + extract_template_vals_from_command_template(¶ms.email_body, command_template) + .map_err(|e| EmailError::Body(format!("Invalid commad: {}", e)))?; + + // let command_params_encoded: Vec = command_params + // .iter() + // .map(|param| param.abi_encode(None).unwrap()) + // .collect(); + + let command_params_encoded = command_params + .iter() + .map(|param| { + param + .abi_encode(None) + .map_err(|e| EmailError::AbiError(e.to_string())) + }) + .collect::, EmailError>>()?; + + Ok(command_params_encoded) +} + +async fn get_email_auth_msg( + params: &EmailRequestContext, +) -> Result<(EmailAuthMsg, EmailProof, [u8; 32]), EmailError> { + let command_params_encoded = get_encoded_command_params(params).await?; + let template_id = get_template_id(params); + let (email_proof, account_salt) = generate_email_proof(params).await?; + let email_auth_msg = EmailAuthMsg { + template_id: template_id.into(), + command_params: command_params_encoded, + proof: email_proof.clone(), + }; + Ok((email_auth_msg, email_proof, account_salt)) +} + #[derive(Debug, Clone)] struct EmailRequestContext { request: Request, - guardian_email_addr: String, - subject: String, - invitation_code: Option, + email_body: String, account_code_str: String, email: String, parsed_email: ParsedEmail, diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs index 9af33506..5dd0fbb9 100644 --- a/packages/relayer/src/database.rs +++ b/packages/relayer/src/database.rs @@ -168,12 +168,10 @@ impl Database { Ok(()) } - #[named] pub(crate) async fn insert_credentials( &self, row: &Credentials, ) -> std::result::Result<(), DatabaseError> { - info!(LOG, "insert row {:?}", row; "func" => function_name!()); let row = sqlx::query( "INSERT INTO credentials (account_code, account_eth_addr, guardian_email_addr, is_set) VALUES ($1, $2, $3, $4) RETURNING *", ) @@ -184,11 +182,7 @@ impl Database { .fetch_one(&self.db) .await .map_err(|e| DatabaseError::new("Failed to insert credentials", e))?; - info!( - LOG, - "{} row inserted", - row.len(); "func" => function_name!() - ); + info!(LOG, "Credentials inserted",); Ok(()) } @@ -210,7 +204,6 @@ impl Database { } } - #[named] pub(crate) async fn get_request( &self, request_id: u32, @@ -329,12 +322,10 @@ impl Database { } } - #[named] pub(crate) async fn insert_request( &self, row: &Request, ) -> std::result::Result<(), DatabaseError> { - info!(LOG, "insert row {:?}", row; "func" => function_name!()); let row = sqlx::query( "INSERT INTO requests (request_id, account_eth_addr, controller_eth_addr, guardian_email_addr, is_for_recovery, template_idx, is_processed, is_success, email_nullifier, account_salt) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *", ) @@ -351,11 +342,7 @@ impl Database { .fetch_one(&self.db) .await .map_err(|e| DatabaseError::new("Failed to insert request", e))?; - info!( - LOG, - "{} row inserted", - row.len(); "func" => function_name!() - ); + info!(LOG, "Request inserted"); Ok(()) } } diff --git a/packages/relayer/src/lib.rs b/packages/relayer/src/lib.rs index 5f31b8f9..c9c8a781 100644 --- a/packages/relayer/src/lib.rs +++ b/packages/relayer/src/lib.rs @@ -21,7 +21,7 @@ pub use utils::*; use tokio::sync::Mutex; -use anyhow::{anyhow, bail, Result}; +use anyhow::{anyhow, Result}; use dotenv::dotenv; use ethers::prelude::*; use lazy_static::lazy_static; diff --git a/packages/relayer/src/modules/web_server/errors.rs b/packages/relayer/src/modules/web_server/errors.rs index a4651d64..85c4d178 100644 --- a/packages/relayer/src/modules/web_server/errors.rs +++ b/packages/relayer/src/modules/web_server/errors.rs @@ -32,8 +32,8 @@ pub enum ApiError { #[derive(Error, Debug)] pub enum EmailError { - #[error("Subject error: {0}")] - Subject(String), + #[error("Email body error: {0}")] + Body(String), #[error("Email address error: {0}")] EmailAddress(String), #[error("Parse error: {0}")] @@ -56,6 +56,10 @@ pub enum EmailError { Render(#[from] RenderError), #[error("Failed to send email: {0}")] Send(String), + #[error("Hex error: {0}")] + HexError(#[from] hex::FromHexError), + #[error("ABI encode error: {0}")] + AbiError(String), // Currently used with some relayer-utils errors #[error("Anyhow error: {0}")] Anyhow(#[from] anyhow::Error), @@ -190,13 +194,15 @@ impl IntoResponse for ApiError { ApiError::Anyhow(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), ApiError::Internal(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), ApiError::Email(e) => match e { - EmailError::Subject(e) => (StatusCode::BAD_REQUEST, e.to_string()), + EmailError::Body(e) => (StatusCode::BAD_REQUEST, e.to_string()), EmailError::EmailAddress(e) => (StatusCode::BAD_REQUEST, e.to_string()), EmailError::Parse(e) => (StatusCode::BAD_REQUEST, e.to_string()), EmailError::NotFound(e) => (StatusCode::BAD_REQUEST, e.to_string()), EmailError::Dkim(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), EmailError::ZkRegex(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), EmailError::Database(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + EmailError::HexError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), + EmailError::AbiError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), EmailError::Circuit(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), EmailError::Chain(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), EmailError::FileNotFound(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index ac6d4f5b..7e39b8b5 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -7,84 +7,6 @@ use relayer_utils::LOG; use serde::{Deserialize, Serialize}; use std::str; -#[derive(Serialize, Deserialize)] -pub struct RequestStatusRequest { - pub request_id: u32, -} - -#[derive(Serialize, Deserialize)] -pub enum RequestStatus { - NotExist = 0, - Pending = 1, - Processed = 2, -} - -#[derive(Serialize, Deserialize)] -pub struct RequestStatusResponse { - pub request_id: u32, - pub status: RequestStatus, - pub is_success: bool, - pub email_nullifier: Option, - pub account_salt: Option, -} - -#[derive(Serialize, Deserialize)] -pub struct AcceptanceRequest { - pub controller_eth_addr: String, - pub guardian_email_addr: String, - pub account_code: String, - pub template_idx: u64, - pub command: String, -} - -#[derive(Serialize, Deserialize)] -pub struct AcceptanceResponse { - pub request_id: u32, - pub command_params: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct RecoveryRequest { - pub controller_eth_addr: String, - pub guardian_email_addr: String, - pub template_idx: u64, - pub command: String, -} - -#[derive(Serialize, Deserialize)] -pub struct RecoveryResponse { - pub request_id: u32, - pub command_params: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct CompleteRecoveryRequest { - pub account_eth_addr: String, - pub controller_eth_addr: String, - pub complete_calldata: String, -} - -#[derive(Serialize, Deserialize)] -pub struct GetAccountSaltRequest { - pub account_code: String, - pub email_addr: String, -} - -#[derive(Deserialize)] -struct PermittedWallet { - wallet_name: String, - controller_eth_addr: String, - hash_of_bytecode_of_proxy: String, - impl_contract_address: String, - slot_location: String, -} - -#[derive(Serialize, Deserialize)] -pub struct InactiveGuardianRequest { - pub account_eth_addr: String, - pub controller_eth_addr: String, -} - // Create request status API pub async fn request_status_api( Json(payload): Json, @@ -110,22 +32,15 @@ pub async fn request_status_api( })) } -pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response { +pub async fn handle_acceptance_request( + Json(payload): Json, +) -> Result, ApiError> { let command_template = CLIENT .get_acceptance_command_templates(&payload.controller_eth_addr, payload.template_idx) - .await - .unwrap(); - - let command_params = extract_template_vals(&payload.command, command_template); - - if command_params.is_err() { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Invalid command")) - .unwrap(); - } + .await?; - let command_params = command_params.unwrap(); + let command_params = extract_template_vals(&payload.command, command_template) + .map_err(|_| ApiError::Validation("Invalid command".to_string()))?; let account_eth_addr = CLIENT .get_recovered_account_from_acceptance_command( @@ -202,27 +117,26 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response(); } - let account_salt = calculate_account_salt(&payload.guardian_email_addr, &payload.account_code) - .map_err(|_| ApiError::Validation("Failed to calculate account salt".to_string()))?; + let account_salt = calculate_account_salt(&payload.guardian_email_addr, &payload.account_code); + + DB.insert_request(&Request { + request_id: request_id.clone(), + account_eth_addr: account_eth_addr.clone(), + controller_eth_addr: payload.controller_eth_addr.clone(), + guardian_email_addr: payload.guardian_email_addr.clone(), + is_for_recovery: false, + template_idx: payload.template_idx, + is_processed: false, + is_success: None, + email_nullifier: None, + account_salt: Some(account_salt.clone()), + }) + .await?; if DB .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) .await? { - DB.insert_request(&Request { - request_id: request_id.clone(), - account_eth_addr: account_eth_addr.clone(), - controller_eth_addr: payload.controller_eth_addr.clone(), - guardian_email_addr: payload.guardian_email_addr.clone(), - is_for_recovery: false, - template_idx: payload.template_idx, - is_processed: false, - is_success: None, - email_nullifier: None, - account_salt: Some(account_salt.clone()), - }) - .await?; - handle_email_event(EmailAuthEvent::GuardianAlreadyExists { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), @@ -244,20 +158,6 @@ pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response Response Response Response Response { +pub async fn handle_recovery_request( + Json(payload): Json, +) -> Result, ApiError> { let command_template = CLIENT .get_recovery_command_templates(&payload.controller_eth_addr, payload.template_idx) - .await - .unwrap(); - - let command_params = extract_template_vals(&payload.command, command_template); - - if command_params.is_err() { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Invalid command")) - .unwrap(); - } + .await?; - let command_params = command_params.unwrap(); + let command_params = extract_template_vals(&payload.command, command_template) + .map_err(|_| ApiError::Validation("Invalid command".to_string()))?; let account_eth_addr = CLIENT .get_recovered_account_from_recovery_command( @@ -407,14 +276,12 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response let account_salt = if let Some(account_details) = account { calculate_account_salt(&payload.guardian_email_addr, &account_details.account_code) - .map_err(|_| ApiError::Validation("Failed to calculate account salt".to_string()))? } else { return Err(ApiError::Validation("Wallet not deployed".to_string())); }; if !DB .is_wallet_and_email_registered(&account_eth_addr, &payload.guardian_email_addr) - // TODO: replace .await? { DB.insert_request(&Request { @@ -437,40 +304,32 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response command: payload.command.clone(), request_id, }) - .await - // TODO: Add custom events for email handling - .expect("Failed to send GuardianNotRegistered event"); - - return Response::builder() - .status(StatusCode::OK) - .body(Body::from( - serde_json::to_string(&RecoveryResponse { - request_id, - command_params, - }) - .unwrap(), - )) - .unwrap(); + .await?; + + return Ok(Json(RecoveryResponse { + request_id, + command_params, + })); } + DB.insert_request(&Request { + request_id: request_id.clone(), + account_eth_addr: account_eth_addr.clone(), + controller_eth_addr: payload.controller_eth_addr.clone(), + guardian_email_addr: payload.guardian_email_addr.clone(), + is_for_recovery: true, + template_idx: payload.template_idx, + is_processed: false, + is_success: None, + email_nullifier: None, + account_salt: Some(account_salt.clone()), + }) + .await?; + if DB .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) .await? { - DB.insert_request(&Request { - request_id: request_id.clone(), - account_eth_addr: account_eth_addr.clone(), - controller_eth_addr: payload.controller_eth_addr.clone(), - guardian_email_addr: payload.guardian_email_addr.clone(), - is_for_recovery: true, - template_idx: payload.template_idx, - is_processed: false, - is_success: None, - email_nullifier: None, - account_salt: Some(account_salt.clone()), - }) - .await?; - handle_email_event(EmailAuthEvent::RecoveryRequest { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), @@ -481,20 +340,6 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response // TODO: Add custom error for handle_email_event .expect("Failed to send Recovery event"); } else { - DB.insert_request(&Request { - request_id: request_id.clone(), - account_eth_addr: account_eth_addr.clone(), - controller_eth_addr: payload.controller_eth_addr.clone(), - guardian_email_addr: payload.guardian_email_addr.clone(), - is_for_recovery: true, - template_idx: payload.template_idx, - is_processed: false, - is_success: None, - email_nullifier: None, - account_salt: Some(account_salt.clone()), - }) - .await?; - handle_email_event(EmailAuthEvent::GuardianNotSet { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), @@ -504,16 +349,10 @@ pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response .expect("Failed to send Recovery event"); } - Response::builder() - .status(StatusCode::OK) - .body(Body::from( - serde_json::to_string(&RecoveryResponse { - request_id, - command_params, - }) - .unwrap(), - )) - .unwrap() + Ok(Json(RecoveryResponse { + request_id, + command_params, + })) } pub async fn handle_complete_recovery_request( @@ -556,8 +395,7 @@ pub async fn handle_complete_recovery_request( pub async fn get_account_salt( Json(payload): Json, ) -> Result { - let account_salt = calculate_account_salt(&payload.email_addr, &payload.account_code) - .map_err(|_| ApiError::Validation("Failed to calculate account salt".to_string()))?; + let account_salt = calculate_account_salt(&payload.email_addr, &payload.account_code); Ok(account_salt) } @@ -643,19 +481,19 @@ pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { Ok(()) } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct RequestStatusRequest { pub request_id: u32, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub enum RequestStatus { NotExist = 0, Pending = 1, Processed = 2, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct RequestStatusResponse { pub request_id: u32, pub status: RequestStatus, @@ -664,49 +502,49 @@ pub struct RequestStatusResponse { pub account_salt: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct AcceptanceRequest { pub controller_eth_addr: String, pub guardian_email_addr: String, pub account_code: String, pub template_idx: u64, - pub subject: String, + pub command: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct AcceptanceResponse { pub request_id: u32, - pub subject_params: Vec, + pub command_params: Vec, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct RecoveryRequest { pub controller_eth_addr: String, pub guardian_email_addr: String, pub template_idx: u64, - pub subject: String, + pub command: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct RecoveryResponse { pub request_id: u32, - pub subject_params: Vec, + pub command_params: Vec, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct CompleteRecoveryRequest { pub account_eth_addr: String, pub controller_eth_addr: String, pub complete_calldata: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct GetAccountSaltRequest { pub account_code: String, pub email_addr: String, } -#[derive(Deserialize, Debug)] +#[derive(Deserialize)] struct PermittedWallet { wallet_name: String, controller_eth_addr: String, @@ -715,7 +553,7 @@ struct PermittedWallet { slot_location: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize)] pub struct InactiveGuardianRequest { pub account_eth_addr: String, pub controller_eth_addr: String, diff --git a/packages/relayer/src/utils/utils.rs b/packages/relayer/src/utils/utils.rs index 1da380f0..948c83fe 100644 --- a/packages/relayer/src/utils/utils.rs +++ b/packages/relayer/src/utils/utils.rs @@ -80,7 +80,7 @@ pub fn calculate_default_hash(input: &str) -> String { hash_code.to_string() } -pub fn calculate_account_salt(email_addr: &str, account_code: &str) -> Result { +pub fn calculate_account_salt(email_addr: &str, account_code: &str) -> String { let padded_email_addr = PaddedEmailAddr::from_email_addr(&email_addr); let account_code = if account_code.starts_with("0x") { hex_to_field(&account_code).unwrap() @@ -88,7 +88,7 @@ pub fn calculate_account_salt(email_addr: &str, account_code: &str) -> Result Date: Wed, 11 Sep 2024 12:04:07 +0700 Subject: [PATCH 070/121] Rebase solve conflicts of body-parser refacor --- Cargo.lock | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 160f0fa2..fa7bc496 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1657,17 +1657,6 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "fancy-regex" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" -dependencies = [ - "bit-set", - "regex-automata", - "regex-syntax", -] - [[package]] name = "fastrand" version = "1.9.0" @@ -4132,6 +4121,7 @@ dependencies = [ "regex", "relayer-utils", "reqwest 0.11.27", + "rustc-hex", "serde", "serde_json", "sled", @@ -4163,7 +4153,6 @@ dependencies = [ "hmac-sha256", "itertools 0.10.5", "lazy_static", - "mailparse", "neon", "num-bigint", "num-traits", From 87340f451a4c7098276b852ef9727059429b9af9 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Wed, 11 Sep 2024 17:12:08 +0700 Subject: [PATCH 071/121] Rebase fixes --- packages/relayer/src/core.rs | 350 ++--------------------------------- 1 file changed, 17 insertions(+), 333 deletions(-) diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 08d99abe..67fe5194 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -24,24 +24,27 @@ pub async fn handle_email(email: String) -> Result { let request_decomposed_def = serde_json::from_str(include_str!("./regex_json/request_def.json")) - .map_err(|e| EmailError::Parse(e.to_string()))?; + .map_err(|e| EmailError::Parse(format!("Failed to parse request_def.json: {}", e)))?; + println!("request_decomposed_def: {:?}", request_decomposed_def); let request_idxes = extract_substr_idxes(&email, &request_decomposed_def)?; + println!("request_idxes: {:?}", request_idxes); if request_idxes.is_empty() { return Err(EmailError::Body(WRONG_COMMAND_FORMAT.to_string())); } info!(LOG, "Request idxes: {:?}", request_idxes); let request_id = &email[request_idxes[0].0..request_idxes[0].1]; + println!("request_id: {:?}", request_id); let request_id_u32 = request_id .parse::() - .map_err(|e| anyhow!("Failed to parse request_id to u64: {}", e))?; - let request_record = DB.get_request(request_id_u32).await?; - let request = match request_record { - Some(r) => r, + .map_err(|e| EmailError::Parse(format!("Failed to parse request_id to u64: {}", e)))?; + println!("request_id_u32: {:?}", request_id_u32); + let request = match DB.get_request(request_id_u32).await? { + Some(req) => req, None => { return Ok(EmailAuthEvent::Error { email_addr: guardian_email_addr, error: format!("Request {} not found", request_id), - }); + }) } }; if request.guardian_email_addr != guardian_email_addr { @@ -50,14 +53,15 @@ pub async fn handle_email(email: String) -> Result { request.guardian_email_addr, guardian_email_addr ))); } + let account_code_str = DB .get_account_code_from_wallet_and_email(&request.account_eth_addr, &guardian_email_addr) .await? - .ok_or(anyhow!( + .ok_or(EmailError::NotFound(format!( "The user of the wallet address {} and the email address {} is not registered.", - request.account_eth_addr, - guardian_email_addr - ))?; + request.account_eth_addr, guardian_email_addr + )))?; + check_and_update_dkim( &email, &parsed_email, @@ -65,330 +69,9 @@ pub async fn handle_email(email: String) -> Result { &request.account_eth_addr, request.account_salt.as_deref().unwrap_or_default(), ) - .await?; - - if let Ok(invitation_code) = parsed_email.get_invitation_code(false) { - if !request.is_for_recovery { - trace!(LOG, "Email with account code"); - - if account_code_str != invitation_code { - return Err(anyhow!( - "Stored account code is not equal to one in the email. Stored: {}, Email: {}", - account_code_str, - invitation_code - )); - } - - let command_template = CLIENT - .get_acceptance_command_templates( - &request.controller_eth_addr, - request.template_idx, - ) - .await?; - - let command_params = - match extract_template_vals_from_command_template(&email_body, command_template) { - Ok(command_params) => command_params, - Err(e) => { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: format!("Invalid Command, {}", e), - }); - } - }; - - let command_params_encoded: Vec = command_params - .iter() - .map(|param| param.abi_encode(None).unwrap()) - .collect(); - - let tokens = vec![ - Token::Uint((*EMAIL_ACCOUNT_RECOVERY_VERSION_ID.get().unwrap()).into()), - Token::String("ACCEPTANCE".to_string()), - Token::Uint(request.template_idx.into()), - ]; - - let template_id = keccak256(encode(&tokens)); - - let circuit_input = generate_email_circuit_input( - &email, - &AccountCode::from(hex_to_field(&format!("0x{}", &account_code_str))?), - Some(EmailCircuitParams { - max_header_length: Some(1024), - max_body_length: Some(1024), - sha_precompute_selector: Some(SHA_PRECOMPUTE_SELECTOR.to_string()), - ignore_body_hash_check: Some(false), - }), - ) - .await?; - - let (proof, public_signals) = - generate_proof(&circuit_input, "email_auth", PROVER_ADDRESS.get().unwrap()).await?; - - info!(LOG, "Public signals: {:?}", public_signals); - - let account_salt = u256_to_bytes32(&public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 3]); - let is_code_exist = public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); - let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; - - let email_proof = EmailProof { - proof: proof, - domain_name: parsed_email.get_email_domain()?, - public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), - timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_command, - email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), - account_salt, - is_code_exist, - }; - - let email_auth_msg = EmailAuthMsg { - template_id: template_id.into(), - command_params: command_params_encoded, - skipped_command_prefix: U256::zero(), - proof: email_proof.clone(), - }; - - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); - info!(LOG, "Request: {:?}", request); - - match CLIENT - .handle_acceptance( - &request.controller_eth_addr, - email_auth_msg, - request.template_idx, - ) - .await - { - Ok(true) => { - let creds = Credentials { - account_code: invitation_code, - account_eth_addr: request.account_eth_addr.clone(), - guardian_email_addr: guardian_email_addr.clone(), - is_set: true, - }; - - DB.update_credentials_of_account_code(&creds).await?; - - let updated_request = Request { - account_eth_addr: request.account_eth_addr.clone(), - controller_eth_addr: request.controller_eth_addr.clone(), - guardian_email_addr: guardian_email_addr.clone(), - template_idx: request.template_idx, - is_for_recovery: request.is_for_recovery, - is_processed: true, - request_id: request.request_id, - is_success: Some(true), - email_nullifier: Some(field_to_hex( - &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), - )), - account_salt: Some(bytes32_to_hex(&account_salt)), - }; - - DB.update_request(&updated_request).await?; - - Ok(EmailAuthEvent::AcceptanceSuccess { - account_eth_addr: request.account_eth_addr, - guardian_email_addr, - request_id: request_id_u32, - }) - } - Ok(false) => { - let updated_request = Request { - account_eth_addr: request.account_eth_addr.clone(), - controller_eth_addr: request.controller_eth_addr.clone(), - guardian_email_addr: guardian_email_addr.clone(), - template_idx: request.template_idx, - is_for_recovery: request.is_for_recovery, - is_processed: true, - request_id: request.request_id, - is_success: Some(false), - email_nullifier: Some(field_to_hex( - &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), - )), - account_salt: Some(bytes32_to_hex(&account_salt)), - }; - - DB.update_request(&updated_request).await?; - - Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: "Failed to handle acceptance".to_string(), - }) - } - Err(e) => Err(anyhow!("Failed to handle acceptance: {}", e)), - } - } else { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: "Account code found and for recovery".to_string(), - }); - } - } else { - if request.is_for_recovery { - let command_template = CLIENT - .get_recovery_command_templates(&request.controller_eth_addr, request.template_idx) - .await?; - - let command_params = - match extract_template_vals_from_command_template(&email_body, command_template) { - Ok(command_params) => command_params, - Err(e) => { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: format!("Invalid Command, {}", e), - }); - } - }; - - let command_params_encoded: Vec = command_params - .iter() - .map(|param| param.abi_encode(None).unwrap()) - .collect(); - - let tokens = vec![ - Token::Uint((*EMAIL_ACCOUNT_RECOVERY_VERSION_ID.get().unwrap()).into()), - Token::String("RECOVERY".to_string()), - Token::Uint(request.template_idx.into()), - ]; - - let template_id = keccak256(encode(&tokens)); - - let circuit_input = generate_email_circuit_input( - &email, - &AccountCode::from(hex_to_field(&format!("0x{}", &account_code_str))?), - Some(EmailCircuitParams { - max_header_length: Some(1024), - max_body_length: Some(1024), - sha_precompute_selector: Some(SHA_PRECOMPUTE_SELECTOR.to_string()), - ignore_body_hash_check: Some(false), - }), - ) - .await?; - - let (proof, public_signals) = - generate_proof(&circuit_input, "email_auth", PROVER_ADDRESS.get().unwrap()).await?; - - let account_salt = u256_to_bytes32(&public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 3]); - let is_code_exist = public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); - let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; - - let email_proof = EmailProof { - proof: proof, - domain_name: parsed_email.get_email_domain()?, - public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), - timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_command, - email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), - account_salt, - is_code_exist, - }; + .await + .map_err(|e| EmailError::Dkim(e.to_string()))?; - let email_auth_msg = EmailAuthMsg { - template_id: template_id.into(), - command_params: command_params_encoded, - skipped_command_prefix: U256::zero(), - proof: email_proof.clone(), - }; - - println!("Email Auth Msg: {:?}", email_auth_msg); - - match CLIENT - .handle_recovery( - &request.controller_eth_addr, - email_auth_msg, - request.template_idx, - ) - .await - { - Ok(true) => { - let updated_request = Request { - account_eth_addr: request.account_eth_addr.clone(), - controller_eth_addr: request.controller_eth_addr.clone(), - guardian_email_addr: guardian_email_addr.clone(), - template_idx: request.template_idx, - is_for_recovery: request.is_for_recovery, - is_processed: true, - request_id: request.request_id, - is_success: Some(true), - email_nullifier: Some(field_to_hex( - &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), - )), - account_salt: Some(bytes32_to_hex(&account_salt)), - }; - - DB.update_request(&updated_request).await?; - - Ok(EmailAuthEvent::RecoverySuccess { - account_eth_addr: request.account_eth_addr, - guardian_email_addr, - request_id: request_id_u32, - }) - } - Ok(false) => { - let updated_request = Request { - account_eth_addr: request.account_eth_addr.clone(), - controller_eth_addr: request.controller_eth_addr.clone(), - guardian_email_addr: guardian_email_addr.clone(), - template_idx: request.template_idx, - is_for_recovery: request.is_for_recovery, - is_processed: true, - request_id: request.request_id, - is_success: Some(false), - email_nullifier: Some(field_to_hex( - &bytes32_to_fr(&email_proof.email_nullifier).unwrap(), - )), - account_salt: Some(bytes32_to_hex(&account_salt)), - }; - - DB.update_request(&updated_request).await?; - - Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: "Failed to handle recovery".to_string(), - }) - } - Err(e) => Err(anyhow!("Failed to handle recovery: {}", e)), - } - } else { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: "No account code found and not for recovery".to_string(), - }); - } - } -} - -pub fn get_masked_command(public_signals: Vec, start_idx: usize) -> Result { - // Gather signals from start_idx to start_idx + COMMAND_FIELDS - let mut command_bytes = Vec::new(); - for i in start_idx..start_idx + COMMAND_FIELDS { -#[named] -async fn get_verified_request( - email: &String, - guardian_email_addr: String, -) -> Result<(Option, String), EmailError> { - let request_decomposed_def = - serde_json::from_str(include_str!("./regex_json/request_def.json")) - .map_err(|e| EmailError::Parse(format!("Failed to parse request_def.json: {}", e)))?; - println!("request_decomposed_def: {:?}", request_decomposed_def); - let request_idxes = extract_substr_idxes(email, &request_decomposed_def)?; - println!("request_idxes: {:?}", request_idxes); - if request_idxes.is_empty() { - return Err(EmailError::Subject(WRONG_SUBJECT_FORMAT.to_string())); - } - info!(LOG, "Request idxes: {:?}", request_idxes; "func" => function_name!()); - let request_id = &email[request_idxes[0].0..request_idxes[0].1]; - println!("request_id: {:?}", request_id); - let request_id_u32 = request_id - .parse::() - .map_err(|e| EmailError::Parse(format!("Failed to parse request_id to u64: {}", e)))?; - println!("request_id_u32: {:?}", request_id_u32); - let request_record = DB.get_request(request_id_u32).await?; - println!("request_record: {:?}", request_record); - let request = match request_record { - Some(req) => req, - None => return Ok((None, request_id.to_string())), let invitation_code = match parsed_email.get_invitation_code(false) { Ok(code) => Some(code), Err(_) => None, @@ -664,6 +347,7 @@ async fn get_email_auth_msg( let email_auth_msg = EmailAuthMsg { template_id: template_id.into(), command_params: command_params_encoded, + skipped_command_prefix: U256::zero(), proof: email_proof.clone(), }; Ok((email_auth_msg, email_proof, account_salt)) From bb9ce3849eba07869179f0f50cbd8840582e7ad0 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Thu, 12 Sep 2024 08:21:28 +0700 Subject: [PATCH 072/121] Acknowledgement as replies in email thread --- packages/relayer/src/modules/mail.rs | 4 +++- packages/relayer/src/modules/web_server/rest_api.rs | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs index 82a749a6..ab792c39 100644 --- a/packages/relayer/src/modules/mail.rs +++ b/packages/relayer/src/modules/mail.rs @@ -51,6 +51,7 @@ pub enum EmailAuthEvent { email_addr: String, command: String, original_message_id: Option, + original_subject: String, }, NoOp, } @@ -335,6 +336,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> email_addr, command, original_message_id, + original_subject, } => { let body_plain = format!( "Hi {}!\nYour email with the command {} is received.", @@ -342,7 +344,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> ); let render_data = serde_json::json!({"userEmailAddr": email_addr, "request": command}); let body_html = render_html("acknowledgement.html", render_data).await?; - let subject = format!("Re: {}", subject); + let subject = format!("Re: {}", original_subject); let email = EmailMessage { to: email_addr, subject, diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 7e39b8b5..f099b5fb 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -440,11 +440,13 @@ fn parse_error_message(error_data: String) -> String { pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; let from_addr = parsed_email.get_from_addr()?; + let original_subject = parsed_email.get_subject_all()?; tokio::spawn(async move { match handle_email_event(EmailAuthEvent::Ack { email_addr: from_addr.clone(), command: parsed_email.get_command(false).unwrap_or_default(), original_message_id: parsed_email.get_message_id().ok(), + original_subject, }) .await { From d545cbb00b640dba4ff5b99be8fbc6bc03079349 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Fri, 13 Sep 2024 13:09:33 +0700 Subject: [PATCH 073/121] Add Re: to subject for reply emails --- packages/relayer/src/chain.rs | 14 +++- packages/relayer/src/core.rs | 65 +++++++++++-------- packages/relayer/src/modules/mail.rs | 38 +++++++---- .../relayer/src/modules/web_server/errors.rs | 2 +- .../src/modules/web_server/rest_api.rs | 43 +++++++++++- packages/relayer/src/utils/mod.rs | 4 +- ...mand_templates.rs => subject_templates.rs} | 3 +- 7 files changed, 126 insertions(+), 43 deletions(-) rename packages/relayer/src/utils/{command_templates.rs => subject_templates.rs} (99%) diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index b124488f..8de83d4e 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -152,7 +152,7 @@ impl ChainClient { .call() .await .map_err(|e| { - ChainError::contract_error("Failed to get recovery subject templates", e) + ChainError::contract_error("Failed to get recovery command templates", e) })?; Ok(templates[template_idx as usize].clone()) } @@ -163,19 +163,29 @@ impl ChainClient { account_eth_addr: &String, complete_calldata: &String, ) -> Result { + println!("doing complete recovery"); let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ChainError::HexError)?; + println!("controller_eth_addr: {:?}", controller_eth_addr); + let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let decoded_calldata = hex::decode(&complete_calldata.trim_start_matches("0x")).expect("Decoding failed"); + println!("decoded_calldata : {:?}", decoded_calldata); + let account_eth_addr = account_eth_addr .parse::() .map_err(ChainError::HexError)?; + println!("account_eth_addr : {:?}", account_eth_addr); + let call = contract.complete_recovery(account_eth_addr, Bytes::from(decoded_calldata)); + println!("call: {:?}", call); + let tx = call .send() .await .map_err(|e| ChainError::contract_error("Failed to call complete_recovery", e))?; + println!("tx: {:?}", tx); // If the transaction is successful, the function will return true and false otherwise. let receipt = tx .log() @@ -188,6 +198,8 @@ impl ChainClient { ) })? .ok_or(anyhow!("No receipt"))?; + println!("receipt : {:?}", receipt); + Ok(receipt .status .map(|status| status == U64::from(1)) diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 67fe5194..7af369ae 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -25,26 +25,25 @@ pub async fn handle_email(email: String) -> Result { let request_decomposed_def = serde_json::from_str(include_str!("./regex_json/request_def.json")) .map_err(|e| EmailError::Parse(format!("Failed to parse request_def.json: {}", e)))?; - println!("request_decomposed_def: {:?}", request_decomposed_def); let request_idxes = extract_substr_idxes(&email, &request_decomposed_def)?; - println!("request_idxes: {:?}", request_idxes); if request_idxes.is_empty() { return Err(EmailError::Body(WRONG_COMMAND_FORMAT.to_string())); } info!(LOG, "Request idxes: {:?}", request_idxes); let request_id = &email[request_idxes[0].0..request_idxes[0].1]; - println!("request_id: {:?}", request_id); let request_id_u32 = request_id .parse::() .map_err(|e| EmailError::Parse(format!("Failed to parse request_id to u64: {}", e)))?; - println!("request_id_u32: {:?}", request_id_u32); let request = match DB.get_request(request_id_u32).await? { Some(req) => req, None => { + let original_subject = parsed_email.get_subject_all()?; return Ok(EmailAuthEvent::Error { email_addr: guardian_email_addr, error: format!("Request {} not found", request_id), - }) + original_subject, + original_message_id: parsed_email.get_message_id().ok(), + }); } }; if request.guardian_email_addr != guardian_email_addr { @@ -104,14 +103,24 @@ async fn handle_email_request( accept(params, invitation_code).await } (None, is_for_recovery) if is_for_recovery => recover(params).await, - (Some(_), _) => Ok(EmailAuthEvent::Error { - email_addr: params.request.guardian_email_addr, - error: "Account code found and for recovery".to_string(), - }), - (None, _) => Ok(EmailAuthEvent::Error { - email_addr: params.request.guardian_email_addr, - error: "No account code found and not for recovery".to_string(), - }), + (Some(_), _) => { + let original_subject = params.parsed_email.get_subject_all()?; + Ok(EmailAuthEvent::Error { + email_addr: params.request.guardian_email_addr, + error: "Account code found and for recovery".to_string(), + original_subject, + original_message_id: params.parsed_email.get_message_id().ok(), + }) + } + (None, _) => { + let original_subject = params.parsed_email.get_subject_all()?; + Ok(EmailAuthEvent::Error { + email_addr: params.request.guardian_email_addr, + error: "No account code found and not for recovery".to_string(), + original_subject, + original_message_id: params.parsed_email.get_message_id().ok(), + }) + } } } @@ -140,6 +149,7 @@ async fn accept( ) .await?; + let original_subject = params.parsed_email.get_subject_all()?; if is_accepted { let creds = Credentials { account_code: invitation_code, @@ -153,11 +163,16 @@ async fn accept( account_eth_addr: params.request.account_eth_addr, guardian_email_addr: params.request.guardian_email_addr, request_id: params.request.request_id, + original_subject, + original_message_id: params.parsed_email.get_message_id().ok(), }) } else { + let original_subject = params.parsed_email.get_subject_all()?; Ok(EmailAuthEvent::Error { email_addr: params.request.guardian_email_addr, error: "Failed to handle acceptance".to_string(), + original_subject, + original_message_id: params.parsed_email.get_message_id().ok(), }) } } @@ -184,16 +199,22 @@ async fn recover(params: EmailRequestContext) -> Result = command_params - // .iter() - // .map(|param| param.abi_encode(None).unwrap()) - // .collect(); + let command_params = extract_template_vals_from_command(¶ms.email_body, command_template) + .map_err(|e| EmailError::Body(format!("Invalid commad: {}", e)))?; let command_params_encoded = command_params .iter() diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs index ab792c39..dfb237dc 100644 --- a/packages/relayer/src/modules/mail.rs +++ b/packages/relayer/src/modules/mail.rs @@ -20,6 +20,8 @@ pub enum EmailAuthEvent { Error { email_addr: String, error: String, + original_subject: String, + original_message_id: Option, }, RecoveryRequest { account_eth_addr: String, @@ -31,11 +33,15 @@ pub enum EmailAuthEvent { account_eth_addr: String, guardian_email_addr: String, request_id: u32, + original_subject: String, + original_message_id: Option, }, RecoverySuccess { account_eth_addr: String, guardian_email_addr: String, request_id: u32, + original_subject: String, + original_message_id: Option, }, GuardianNotSet { account_eth_addr: String, @@ -116,8 +122,14 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> send_email(email).await?; } - EmailAuthEvent::Error { email_addr, error } => { - let subject = "Error"; + EmailAuthEvent::Error { + email_addr, + error, + original_subject, + original_message_id, + } => { + let subject = format!("Re: {}", original_subject); + let body_plain = format!( "An error occurred while processing your request. \ Error: {}", @@ -132,9 +144,9 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> let email = EmailMessage { to: email_addr, - subject: subject.to_string(), - reference: None, - reply_to: None, + subject, + reference: original_message_id.clone(), + reply_to: original_message_id, body_plain, body_html, body_attachments: None, @@ -211,8 +223,10 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> account_eth_addr, guardian_email_addr, request_id, + original_subject, + original_message_id, } => { - let subject = "Acceptance Success"; + let subject = format!("Re: {}", original_subject); let body_plain = format!( "Your guardian request for the wallet address {} has been set. \ Your request ID is #{} is now complete.", @@ -229,8 +243,8 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> let email = EmailMessage { to: guardian_email_addr, subject: subject.to_string(), - reference: None, - reply_to: None, + reference: original_message_id.clone(), + reply_to: original_message_id, body_plain, body_html, body_attachments: None, @@ -242,8 +256,10 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> account_eth_addr, guardian_email_addr, request_id, + original_subject, + original_message_id, } => { - let subject = "Recovery Success"; + let subject = format!("Re: {}", original_subject); let body_plain = format!( "Your recovery request for the wallet address {} is successful. \ Your request ID is #{}.", @@ -260,8 +276,8 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> let email = EmailMessage { to: guardian_email_addr, subject: subject.to_string(), - reference: None, - reply_to: None, + reference: original_message_id.clone(), + reply_to: original_message_id, body_plain, body_html, body_attachments: None, diff --git a/packages/relayer/src/modules/web_server/errors.rs b/packages/relayer/src/modules/web_server/errors.rs index 85c4d178..10959c21 100644 --- a/packages/relayer/src/modules/web_server/errors.rs +++ b/packages/relayer/src/modules/web_server/errors.rs @@ -190,7 +190,7 @@ impl IntoResponse for ApiError { ApiError::Database(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), ApiError::Chain(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), ApiError::SqlxError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - ApiError::Validation(e) => (StatusCode::BAD_REQUEST, e), + ApiError::Validation(e) => (StatusCode::BAD_REQUEST, e.to_string()), ApiError::Anyhow(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), ApiError::Internal(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), ApiError::Email(e) => match e { diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index f099b5fb..823eb6e0 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -11,6 +11,7 @@ use std::str; pub async fn request_status_api( Json(payload): Json, ) -> Result, ApiError> { + println!("requesting status"); let row = DB.get_request(payload.request_id).await?; let status = if let Some(ref row) = row { if row.is_processed { @@ -35,6 +36,7 @@ pub async fn request_status_api( pub async fn handle_acceptance_request( Json(payload): Json, ) -> Result, ApiError> { + println!("handle_acceptance_request"); let command_template = CLIENT .get_acceptance_command_templates(&payload.controller_eth_addr, payload.template_idx) .await?; @@ -194,12 +196,15 @@ pub async fn handle_acceptance_request( pub async fn handle_recovery_request( Json(payload): Json, ) -> Result, ApiError> { + println!("handle_recovery_request: {:?}", payload); let command_template = CLIENT .get_recovery_command_templates(&payload.controller_eth_addr, payload.template_idx) .await?; + println!("command_template: {:?}", command_template); let command_params = extract_template_vals(&payload.command, command_template) .map_err(|_| ApiError::Validation("Invalid command".to_string()))?; + println!("command_params"); let account_eth_addr = CLIENT .get_recovered_account_from_recovery_command( @@ -209,15 +214,22 @@ pub async fn handle_recovery_request( ) .await?; + println!("account_eth_addr"); + let account_eth_addr = format!("0x{:x}", account_eth_addr); + println!("account_eth_addr"); if !CLIENT.is_wallet_deployed(&account_eth_addr).await? { return Err(ApiError::Validation("Wallet not deployed".to_string())); } + println!("wallet is deployed"); + // Check if hash of bytecode of proxy contract is equal or not let bytecode = CLIENT.get_bytecode(&account_eth_addr).await?; + println!("bytecode"); let bytecode_hash = format!("0x{}", hex::encode(keccak256(bytecode.as_ref()))); + println!("bytecode_hash"); // let permitted_wallets: Vec = // serde_json::from_str(include_str!("../../permitted_wallets.json")).unwrap(); @@ -266,24 +278,37 @@ pub async fn handle_recovery_request( // } let mut request_id = rand::thread_rng().gen::(); + println!("got request_id"); while let Ok(Some(request)) = DB.get_request(request_id).await { request_id = rand::thread_rng().gen::(); } + println!("got request: {:?}", request_id); + println!("account_eth_addr: {:?}", account_eth_addr); + println!( + "payload.guardian_email_addr: {:?}", + payload.guardian_email_addr + ); + let account = DB .get_credentials_from_wallet_and_email(&account_eth_addr, &payload.guardian_email_addr) .await?; + println!("got account: {:?}", account); + let account_salt = if let Some(account_details) = account { calculate_account_salt(&payload.guardian_email_addr, &account_details.account_code) } else { return Err(ApiError::Validation("Wallet not deployed".to_string())); }; + println!("got account_salt"); + if !DB .is_wallet_and_email_registered(&account_eth_addr, &payload.guardian_email_addr) .await? { + println!("email and wallet are not registered"); DB.insert_request(&Request { request_id: request_id.clone(), account_eth_addr: account_eth_addr.clone(), @@ -326,10 +351,13 @@ pub async fn handle_recovery_request( }) .await?; + println!("inserted request"); + if DB .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) .await? { + println!("guardian is set"); handle_email_event(EmailAuthEvent::RecoveryRequest { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), @@ -340,6 +368,7 @@ pub async fn handle_recovery_request( // TODO: Add custom error for handle_email_event .expect("Failed to send Recovery event"); } else { + println!("guardian is not set"); handle_email_event(EmailAuthEvent::GuardianNotSet { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), @@ -349,6 +378,8 @@ pub async fn handle_recovery_request( .expect("Failed to send Recovery event"); } + println!("all done"); + Ok(Json(RecoveryResponse { request_id, command_params, @@ -358,9 +389,11 @@ pub async fn handle_recovery_request( pub async fn handle_complete_recovery_request( Json(payload): Json, ) -> Result { + println!("handle_complete_recovery_request"); if !CLIENT.is_wallet_deployed(&payload.account_eth_addr).await? { return Err(ApiError::Validation("Wallet not deployed".to_string())); } + println!("wallet is deployed"); match CLIENT .complete_recovery( @@ -395,6 +428,7 @@ pub async fn handle_complete_recovery_request( pub async fn get_account_salt( Json(payload): Json, ) -> Result { + println!("get_account_salt"); let account_salt = calculate_account_salt(&payload.email_addr, &payload.account_code); Ok(account_salt) } @@ -402,6 +436,7 @@ pub async fn get_account_salt( pub async fn inactive_guardian( Json(payload): Json, ) -> Result { + println!("inactive_guardian"); let is_activated = CLIENT .get_is_activated(&payload.controller_eth_addr, &payload.account_eth_addr) .await?; @@ -438,6 +473,7 @@ fn parse_error_message(error_data: String) -> String { } pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { + println!("receive_email_api_fn"); let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; let from_addr = parsed_email.get_from_addr()?; let original_subject = parsed_email.get_subject_all()?; @@ -466,9 +502,14 @@ pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { }, Err(e) => { error!(LOG, "Error handling email: {:?}", e); + let original_subject = parsed_email + .get_subject_all() + .unwrap_or("Unknown Error".to_string()); match handle_email_event(EmailAuthEvent::Error { email_addr: from_addr, error: e.to_string(), + original_subject, + original_message_id: parsed_email.get_message_id().ok(), }) .await { @@ -519,7 +560,7 @@ pub struct AcceptanceResponse { pub command_params: Vec, } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Debug)] pub struct RecoveryRequest { pub controller_eth_addr: String, pub guardian_email_addr: String, diff --git a/packages/relayer/src/utils/mod.rs b/packages/relayer/src/utils/mod.rs index 11b1e85f..361a451a 100644 --- a/packages/relayer/src/utils/mod.rs +++ b/packages/relayer/src/utils/mod.rs @@ -1,7 +1,7 @@ -pub mod command_templates; pub mod strings; +pub mod subject_templates; pub mod utils; -pub use command_templates::*; pub use strings::*; +pub use subject_templates::*; pub use utils::*; diff --git a/packages/relayer/src/utils/command_templates.rs b/packages/relayer/src/utils/subject_templates.rs similarity index 99% rename from packages/relayer/src/utils/command_templates.rs rename to packages/relayer/src/utils/subject_templates.rs index c742a323..e8ccd734 100644 --- a/packages/relayer/src/utils/command_templates.rs +++ b/packages/relayer/src/utils/subject_templates.rs @@ -49,7 +49,7 @@ impl TemplateValue { } } -pub fn extract_template_vals_from_command_template( +pub fn extract_template_vals_from_command( input: &str, templates: Vec, ) -> Result, anyhow::Error> { @@ -178,6 +178,7 @@ pub fn extract_template_vals(input: &str, templates: Vec) -> Result String { // Convert amount to string in wei format (no decimals) let uint_str = uint.to_string(); From 37ef80b9f1feb7d3fc2a34daa16864bc3d40e0be Mon Sep 17 00:00:00 2001 From: Shubham Gupta Date: Fri, 13 Sep 2024 15:30:34 +0530 Subject: [PATCH 074/121] Update email templates UI --- .../eml_templates/acceptance_request.html | 609 +++++++----------- .../eml_templates/acceptance_success.html | 598 +++++++---------- .../eml_templates/acknowledgement.html | 595 +++++++---------- .../eml_templates/credential_not_present.html | 606 +++++++---------- packages/relayer/eml_templates/error.html | 416 +----------- .../guardian_already_exists.html | 599 +++++++---------- .../eml_templates/guardian_not_set.html | 595 +++++++---------- .../eml_templates/recovery_request.html | 606 +++++++---------- .../eml_templates/recovery_success.html | 598 +++++++---------- 9 files changed, 1757 insertions(+), 3465 deletions(-) diff --git a/packages/relayer/eml_templates/acceptance_request.html b/packages/relayer/eml_templates/acceptance_request.html index 01f4178a..3e0cd15d 100644 --- a/packages/relayer/eml_templates/acceptance_request.html +++ b/packages/relayer/eml_templates/acceptance_request.html @@ -1,421 +1,258 @@ + - Email Auth + - Set Your Guardian Email - - + + + + + -   -
{{command}}
diff --git a/packages/relayer/eml_templates/acceptance_success.html b/packages/relayer/eml_templates/acceptance_success.html index 4e45a5b4..b144424f 100644 --- a/packages/relayer/eml_templates/acceptance_success.html +++ b/packages/relayer/eml_templates/acceptance_success.html @@ -1,414 +1,252 @@ + - Email Auth + - Guardian Email Set! - - + + + + + -   diff --git a/packages/relayer/eml_templates/acknowledgement.html b/packages/relayer/eml_templates/acknowledgement.html index 713ce805..7e77ea74 100644 --- a/packages/relayer/eml_templates/acknowledgement.html +++ b/packages/relayer/eml_templates/acknowledgement.html @@ -1,412 +1,251 @@ + - Email Wallet + - Email Wallet Acknowledgement - - + + + + + -   diff --git a/packages/relayer/eml_templates/credential_not_present.html b/packages/relayer/eml_templates/credential_not_present.html index b13ee178..b7929fac 100644 --- a/packages/relayer/eml_templates/credential_not_present.html +++ b/packages/relayer/eml_templates/credential_not_present.html @@ -1,419 +1,257 @@ + - Email Auth + - Credential Not Present - - + + + + + -   -
{{command}}
diff --git a/packages/relayer/eml_templates/error.html b/packages/relayer/eml_templates/error.html index aef12c26..b2ebb779 100644 --- a/packages/relayer/eml_templates/error.html +++ b/packages/relayer/eml_templates/error.html @@ -1,415 +1 @@ - - - - - - Email Auth - - - Error - - - - - - - - - + \ No newline at end of file diff --git a/packages/relayer/eml_templates/guardian_already_exists.html b/packages/relayer/eml_templates/guardian_already_exists.html index 8d52d462..0d2ef79c 100644 --- a/packages/relayer/eml_templates/guardian_already_exists.html +++ b/packages/relayer/eml_templates/guardian_already_exists.html @@ -1,414 +1,253 @@ + - Email Auth + - Guardian Already Set - - + + + + + -   diff --git a/packages/relayer/eml_templates/guardian_not_set.html b/packages/relayer/eml_templates/guardian_not_set.html index 853bb3d6..868e9e77 100644 --- a/packages/relayer/eml_templates/guardian_not_set.html +++ b/packages/relayer/eml_templates/guardian_not_set.html @@ -1,412 +1,251 @@ + - Email Auth + - Guardian Not Set - - + + + + + -   diff --git a/packages/relayer/eml_templates/recovery_request.html b/packages/relayer/eml_templates/recovery_request.html index 0081a8a6..48293fee 100644 --- a/packages/relayer/eml_templates/recovery_request.html +++ b/packages/relayer/eml_templates/recovery_request.html @@ -1,419 +1,257 @@ + - Email Auth + - Recovery Request - - + + + + + -   -
{{command}}
diff --git a/packages/relayer/eml_templates/recovery_success.html b/packages/relayer/eml_templates/recovery_success.html index d067c2f6..6ddb168d 100644 --- a/packages/relayer/eml_templates/recovery_success.html +++ b/packages/relayer/eml_templates/recovery_success.html @@ -1,414 +1,252 @@ + - Email Auth + - Recovery Successful - - + + + + + -   From d862ec6f6c55edc9598c0d6a53cf8a707e2cbb74 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Fri, 13 Sep 2024 15:27:26 +0700 Subject: [PATCH 075/121] Add cloud build to build on gcp --- Relayer.Dockerfile | 4 +- cloudbuild-base.yaml | 19 + cloudbuild-relayer.yaml | 19 + kubernetes/relayer.staging.yml | 163 +++++++ kubernetes/relayer.yml | 30 +- ...countRecoveryZKSync_completeRecovery.t.sol | 265 ----------- ...countRecoveryZKSync_handleAcceptance.t.sol | 218 --------- ...AccountRecoveryZKSync_handleRecovery.t.sol | 433 ------------------ ...AccountRecoveryZKSync_rejectRecovery.t.sol | 265 ----------- ...ccountRecoveryZKSync_requestGuardian.t.sol | 88 ---- .../EmailAccountRecoveryZKSync_transfer.t.sol | 68 --- .../EmailAccountRecoveryZKSync_withdraw.t.sol | 67 --- ...eryZkSync_acceptanceCommandTemplates.t.sol | 32 -- ...overyZkSync_recoveryCommandTemplates.t.sol | 35 -- 14 files changed, 218 insertions(+), 1488 deletions(-) create mode 100644 cloudbuild-base.yaml create mode 100644 cloudbuild-relayer.yaml create mode 100644 kubernetes/relayer.staging.yml delete mode 100644 packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_completeRecovery.t.sol delete mode 100644 packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleAcceptance.t.sol delete mode 100644 packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleRecovery.t.sol delete mode 100644 packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_rejectRecovery.t.sol delete mode 100644 packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_requestGuardian.t.sol delete mode 100644 packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_transfer.t.sol delete mode 100644 packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_withdraw.t.sol delete mode 100644 packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_acceptanceCommandTemplates.t.sol delete mode 100644 packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_recoveryCommandTemplates.t.sol diff --git a/Relayer.Dockerfile b/Relayer.Dockerfile index fd362f3b..cd99b0ff 100644 --- a/Relayer.Dockerfile +++ b/Relayer.Dockerfile @@ -1,5 +1,5 @@ # Use the base image -FROM bisht13/ar-relayer-base:latest +FROM us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer-base:v1 # Copy the project files COPY packages/relayer /relayer/packages/relayer @@ -14,4 +14,4 @@ RUN cargo build EXPOSE 4500 # Set the default command -CMD ["cargo", "run"] \ No newline at end of file +CMD ["cargo", "run"] diff --git a/cloudbuild-base.yaml b/cloudbuild-base.yaml new file mode 100644 index 00000000..0bd58620 --- /dev/null +++ b/cloudbuild-base.yaml @@ -0,0 +1,19 @@ +steps: + # Build the base container image + - name: 'gcr.io/cloud-builders/docker' + args: + [ + 'build', + '-t', + 'us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer-base:v1', + '-f', + 'Base.Dockerfile', + '.', + ] + # Push the base container image to Artifact Registry + - name: 'gcr.io/cloud-builders/docker' + args: + [ + 'push', + 'us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer-base:v1', + ] diff --git a/cloudbuild-relayer.yaml b/cloudbuild-relayer.yaml new file mode 100644 index 00000000..45422673 --- /dev/null +++ b/cloudbuild-relayer.yaml @@ -0,0 +1,19 @@ +steps: + # Build the base container image + - name: 'gcr.io/cloud-builders/docker' + args: + [ + 'build', + '-t', + 'us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer:v1', + '-f', + 'Relayer.Dockerfile', + '.', + ] + # Push the base container image to Artifact Registry + - name: 'gcr.io/cloud-builders/docker' + args: + [ + 'push', + 'us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer:v1', + ] diff --git a/kubernetes/relayer.staging.yml b/kubernetes/relayer.staging.yml new file mode 100644 index 00000000..7e97ee50 --- /dev/null +++ b/kubernetes/relayer.staging.yml @@ -0,0 +1,163 @@ +# apiVersion: v1 +# kind: ConfigMap +# metadata: +# name: relayer-config-email-auth +# namespace: ar-base-sepolia-staging +# labels: +# app: relayer +# data: +# EMAIL_ACCOUNT_RECOVERY_VERSION_ID: '' +# CHAIN_RPC_PROVIDER: '' +# CHAIN_RPC_EXPLORER: '' +# CHAIN_ID: '' +# WEB_SERVER_ADDRESS: '' +# CIRCUITS_DIR_PATH: '' +# EMAIL_TEMPLATES_PATH: '' +# CANISTER_ID: '' +# IC_REPLICA_URL: '' +# JSON_LOGGER: '' +# PEM_PATH: '' +# SMTP_SERVER: '' + +# --- +# apiVersion: v1 +# kind: Secret +# metadata: +# name: relayer-secret-email-auth +# namespace: ar-base-sepolia-staging +# labels: +# app: relayer +# type: Opaque +# data: +# PRIVATE_KEY: +# DATABASE_URL: +# PROVER_ADDRESS: +# ICPEM: + +# --- +# apiVersion: v1 +# kind: Secret +# metadata: +# name: relayer-smtp-secret +# namespace: ar-base-sepolia-staging +# labels: +# app: relayer +# type: Opaque +# data: +# SMTP_LOGIN_ID: +# SMTP_LOGIN_PASSWORD: +# SMTP_DOMAIN_NAME: +# SERVER_HOST: +# SERVER_PORT: +# JSON_LOGGER: + +# --- +# apiVersion: v1 +# kind: Secret +# metadata: +# name: relayer-imap-secret +# namespace: ar-base-sepolia-staging +# labels: +# app: relayer +# type: Opaque +# data: +# RELAYER_ENDPOINT: +# IMAP_LOGIN_ID: +# IMAP_LOGIN_PASSWORD: +# IMAP_PORT: +# IMAP_DOMAIN_NAME: +# SERVER_HOST: +# AUTH_TYPE: +# JSON_LOGGER: + +# --- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: relayer-email-auth + namespace: ar-base-sepolia-staging + labels: + app: relayer +spec: + selector: + matchLabels: + app: relayer + template: + metadata: + labels: + app: relayer + spec: + containers: + - name: relayer-container + image: us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer:v1 + ports: + - containerPort: 4500 + envFrom: + - configMapRef: + name: relayer-config-email-auth + - secretRef: + name: relayer-secret-email-auth + livenessProbe: + httpGet: + path: /api/echo + port: 4500 + initialDelaySeconds: 60 + periodSeconds: 30 + readinessProbe: + httpGet: + path: /api/echo + port: 4500 + initialDelaySeconds: 60 + periodSeconds: 30 + volumeMounts: + - name: pem-volume + mountPath: '/relayer/packages/relayer/.ic.pem' + subPath: '.ic.pem' + - name: smtp-container + image: bisht13/relayer-smtp-new:latest + ports: + - containerPort: 8080 + envFrom: + - secretRef: + name: relayer-smtp-secret + - name: imap-container + image: bisht13/relayer-imap-new:latest + envFrom: + - secretRef: + name: relayer-imap-secret + volumes: + - name: pem-volume + secret: + secretName: relayer-secret-email-auth + items: + - key: ICPEM + path: '.ic.pem' +# --- +# apiVersion: v1 +# kind: Service +# metadata: +# name: relayer-svc-email-auth +# namespace: ar-base-sepolia-staging +# spec: +# selector: +# app: relayer +# ports: +# - protocol: TCP +# port: 443 +# targetPort: 4500 +# type: ClusterIP + +# --- +# apiVersion: v1 +# kind: Service +# metadata: +# name: relayer-smtp-svc +# namespace: ar-base-sepolia-staging +# spec: +# selector: +# app: relayer +# ports: +# - protocol: TCP +# port: 443 +# targetPort: 8080 +# type: ClusterIP diff --git a/kubernetes/relayer.yml b/kubernetes/relayer.yml index e815f95b..83c3da5f 100644 --- a/kubernetes/relayer.yml +++ b/kubernetes/relayer.yml @@ -6,18 +6,18 @@ metadata: labels: app: relayer data: - EMAIL_ACCOUNT_RECOVERY_VERSION_ID: "" - CHAIN_RPC_PROVIDER: "" - CHAIN_RPC_EXPLORER: "" - CHAIN_ID: "" - WEB_SERVER_ADDRESS: "" - CIRCUITS_DIR_PATH: "" - EMAIL_TEMPLATES_PATH: "" - CANISTER_ID: "" - IC_REPLICA_URL: "" - JSON_LOGGER: "" - PEM_PATH: "" - SMTP_SERVER: "" + EMAIL_ACCOUNT_RECOVERY_VERSION_ID: '' + CHAIN_RPC_PROVIDER: '' + CHAIN_RPC_EXPLORER: '' + CHAIN_ID: '' + WEB_SERVER_ADDRESS: '' + CIRCUITS_DIR_PATH: '' + EMAIL_TEMPLATES_PATH: '' + CANISTER_ID: '' + IC_REPLICA_URL: '' + JSON_LOGGER: '' + PEM_PATH: '' + SMTP_SERVER: '' --- apiVersion: v1 @@ -111,8 +111,8 @@ spec: periodSeconds: 30 volumeMounts: - name: pem-volume - mountPath: "/relayer/packages/relayer/.ic.pem" - subPath: ".ic.pem" + mountPath: '/relayer/packages/relayer/.ic.pem' + subPath: '.ic.pem' - name: smtp-container image: bisht13/relayer-smtp-new:latest ports: @@ -131,7 +131,7 @@ spec: secretName: relayer-secret-email-auth items: - key: ICPEM - path: ".ic.pem" + path: '.ic.pem' --- apiVersion: v1 diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_completeRecovery.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_completeRecovery.t.sol deleted file mode 100644 index 435a403b..00000000 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_completeRecovery.t.sol +++ /dev/null @@ -1,265 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import {EmailAuth, EmailAuthMsg} from "../../src/EmailAuth.sol"; -import {RecoveryControllerZKSync} from "../helpers/RecoveryControllerZKSync.sol"; -import {StructHelper} from "../helpers/StructHelper.sol"; -import {SimpleWallet} from "../helpers/SimpleWallet.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -contract EmailAccountRecoveryZKSyncTest_completeRecovery is StructHelper { - constructor() {} - - function setUp() public override { - super.setUp(); - } - - function requestGuardian() public { - setUp(); - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.NONE - ); - - vm.startPrank(deployer); - recoveryControllerZKSync.requestGuardian(guardian); - vm.stopPrank(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - } - - function handleAcceptance() public { - requestGuardian(); - - console.log("guardian", guardian); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeAcceptanceTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForAcceptance = new bytes[](1); - commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.commandParams = commandParamsForAcceptance; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - // acceptGuardian is internal, we call handleAcceptance, which calls acceptGuardian internally. - vm.startPrank(someRelayer); - recoveryControllerZKSync.handleAcceptance(emailAuthMsg, templateIdx); - vm.stopPrank(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.ACCEPTED - ); - } - - function handleRecovery() public { - handleAcceptance(); - - assertEq( - recoveryControllerZKSync.isRecovering(address(simpleWallet)), - false - ); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount( - address(simpleWallet) - ), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeRecoveryTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForRecovery = new bytes[](2); - commandParamsForRecovery[0] = abi.encode(simpleWallet); - commandParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.commandParams = commandParamsForRecovery; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); - vm.stopPrank(); - - assertEq( - recoveryControllerZKSync.isRecovering(address(simpleWallet)), - true - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - newSigner - ); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount( - address(simpleWallet) - ), - block.timestamp + - recoveryControllerZKSync.timelockPeriodOfAccount( - address(simpleWallet) - ) - ); - } - - function testCompleteRecovery() public { - skipIfNotZkSync(); - - handleRecovery(); - - assertEq( - recoveryControllerZKSync.isRecovering(address(simpleWallet)), - true - ); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount( - address(simpleWallet) - ), - block.timestamp + - recoveryControllerZKSync.timelockPeriodOfAccount( - address(simpleWallet) - ) - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - newSigner - ); - - vm.startPrank(someRelayer); - vm.warp(4 days); - recoveryControllerZKSync.completeRecovery( - address(simpleWallet), - new bytes(0) - ); - vm.stopPrank(); - - assertEq( - recoveryControllerZKSync.isRecovering(address(simpleWallet)), - false - ); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount( - address(simpleWallet) - ), - 0 - ); - assertEq(simpleWallet.owner(), newSigner); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - } - - function testExpectRevertCompleteRecoveryRecoveryNotInProgress() public { - skipIfNotZkSync(); - - handleAcceptance(); - - assertEq( - recoveryControllerZKSync.isRecovering(address(simpleWallet)), - false - ); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount( - address(simpleWallet) - ), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - - vm.startPrank(someRelayer); - vm.warp(4 days); - vm.expectRevert(bytes("recovery not in progress")); - bytes memory recoveryCalldata; - recoveryControllerZKSync.completeRecovery( - address(simpleWallet), - recoveryCalldata - ); - - vm.stopPrank(); - } - - function testExpectRevertCompleteRecovery() public { - vm.warp(block.timestamp + 3 days); - - handleRecovery(); - - assertEq( - recoveryControllerZKSync.isRecovering(address(simpleWallet)), - true - ); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount( - address(simpleWallet) - ), - block.timestamp + - recoveryControllerZKSync.timelockPeriodOfAccount( - address(simpleWallet) - ) - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - newSigner - ); - - vm.warp(0); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("timelock not expired")); - bytes memory recoveryCalldata; - recoveryControllerZKSync.completeRecovery( - address(simpleWallet), - recoveryCalldata - ); - - vm.stopPrank(); - } -} diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleAcceptance.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleAcceptance.t.sol deleted file mode 100644 index fa88af64..00000000 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleAcceptance.t.sol +++ /dev/null @@ -1,218 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import {EmailAuth, EmailAuthMsg} from "../../src/EmailAuth.sol"; -import {RecoveryControllerZKSync} from "../helpers/RecoveryControllerZKSync.sol"; -import {StructHelper} from "../helpers/StructHelper.sol"; -import {SimpleWallet} from "../helpers/SimpleWallet.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -contract EmailAccountRecoveryZKSyncTest_handleAcceptance is StructHelper { - constructor() {} - - function setUp() public override { - super.setUp(); - } - - function requestGuardian() public { - skipIfNotZkSync(); - - setUp(); - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.NONE - ); - - vm.startPrank(deployer); - recoveryControllerZKSync.requestGuardian(guardian); - vm.stopPrank(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - } - - function testHandleAcceptance() public { - skipIfNotZkSync(); - - requestGuardian(); - - console.log("guardian", guardian); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeAcceptanceTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForAcceptance = new bytes[](1); - commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.commandParams = commandParamsForAcceptance; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - // acceptGuardian is internal, we call handleAcceptance, which calls acceptGuardian internally. - vm.startPrank(someRelayer); - recoveryControllerZKSync.handleAcceptance(emailAuthMsg, templateIdx); - vm.stopPrank(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.ACCEPTED - ); - } - - // Can not test recovery in progress using handleAcceptance - // Can not test invalid guardian using handleAcceptance - - function testExpectRevertHandleAcceptanceGuardianStatusMustBeRequested() - public - { - skipIfNotZkSync(); - - requestGuardian(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeAcceptanceTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForAcceptance = new bytes[](1); - commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.commandParams = commandParamsForAcceptance; - emailAuthMsg.proof.accountSalt = 0x0; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("guardian status must be REQUESTED")); - recoveryControllerZKSync.handleAcceptance(emailAuthMsg, templateIdx); - vm.stopPrank(); - } - - function testExpectRevertHandleAcceptanceInvalidTemplateIndex() public { - skipIfNotZkSync(); - - requestGuardian(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - - uint templateIdx = 1; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeAcceptanceTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForAcceptance = new bytes[](1); - commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.commandParams = commandParamsForAcceptance; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid template index")); - recoveryControllerZKSync.handleAcceptance(emailAuthMsg, templateIdx); - vm.stopPrank(); - } - - function testExpectRevertHandleAcceptanceInvalidcommandParams() public { - skipIfNotZkSync(); - - requestGuardian(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeAcceptanceTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForAcceptance = new bytes[](2); - commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - commandParamsForAcceptance[1] = abi.encode(address(simpleWallet)); - emailAuthMsg.commandParams = commandParamsForAcceptance; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid command params")); - recoveryControllerZKSync.handleAcceptance(emailAuthMsg, templateIdx); - vm.stopPrank(); - } - - function testExpectRevertHandleAcceptanceInvalidWalletAddressInEmail() - public - { - skipIfNotZkSync(); - - requestGuardian(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeAcceptanceTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForAcceptance = new bytes[](1); - commandParamsForAcceptance[0] = abi.encode(address(0x0)); - emailAuthMsg.commandParams = commandParamsForAcceptance; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid account in email")); - recoveryControllerZKSync.handleAcceptance(emailAuthMsg, templateIdx); - vm.stopPrank(); - } -} diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleRecovery.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleRecovery.t.sol deleted file mode 100644 index 288b234f..00000000 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_handleRecovery.t.sol +++ /dev/null @@ -1,433 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import {EmailAuth, EmailAuthMsg} from "../../src/EmailAuth.sol"; -import {RecoveryControllerZKSync} from "../helpers/RecoveryControllerZKSync.sol"; -import {StructHelper} from "../helpers/StructHelper.sol"; -import {SimpleWallet} from "../helpers/SimpleWallet.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -contract EmailAccountRecoveryZKSyncTest_handleRecovery is StructHelper { - constructor() {} - - function setUp() public override { - super.setUp(); - } - - function requestGuardian() public { - setUp(); - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.NONE - ); - - vm.startPrank(deployer); - recoveryControllerZKSync.requestGuardian(guardian); - vm.stopPrank(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - } - - function handleAcceptance() public { - skipIfNotZkSync(); - - requestGuardian(); - - console.log("guardian", guardian); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeAcceptanceTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForAcceptance = new bytes[](1); - commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.commandParams = commandParamsForAcceptance; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - // acceptGuardian is internal, we call handleAcceptance, which calls acceptGuardian internally. - vm.startPrank(someRelayer); - recoveryControllerZKSync.handleAcceptance(emailAuthMsg, templateIdx); - vm.stopPrank(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.ACCEPTED - ); - } - - function testHandleRecovery() public { - skipIfNotZkSync(); - - handleAcceptance(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeRecoveryTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForRecovery = new bytes[](2); - commandParamsForRecovery[0] = abi.encode(simpleWallet); - commandParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.commandParams = commandParamsForRecovery; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); - vm.stopPrank(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), true); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - newSigner - ); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - block.timestamp + - recoveryControllerZKSync.timelockPeriodOfAccount( - address(simpleWallet) - ) - ); - } - - function testExpectRevertHandleRecoveryGuardianIsNotDeployed() public { - skipIfNotZkSync(); - - handleAcceptance(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeRecoveryTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForRecovery = new bytes[](2); - commandParamsForRecovery[0] = abi.encode(simpleWallet); - commandParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.commandParams = commandParamsForRecovery; - emailAuthMsg.proof.accountSalt = 0x0; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("guardian is not deployed")); - recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); - vm.stopPrank(); - } - - function testExpectRevertHandleRecoveryInvalidTemplateId() public { - skipIfNotZkSync(); - - handleAcceptance(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - bytes[] memory commandParamsForRecovery = new bytes[](2); - commandParamsForRecovery[0] = abi.encode(simpleWallet); - commandParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.commandParams = commandParamsForRecovery; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid template id")); - recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); - vm.stopPrank(); - } - - // Can not test recovery in progress using handleRecovery - // Can not test invalid guardian using handleRecovery - - function testExpectRevertHandleRecoveryGuardianStatusMustBeAccepted() - public - { - skipIfNotZkSync(); - - handleAcceptance(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeRecoveryTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForRecovery = new bytes[](2); - commandParamsForRecovery[0] = abi.encode(simpleWallet); - commandParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.commandParams = commandParamsForRecovery; - emailAuthMsg.proof.accountSalt = 0x0; - - // vm.mockCall( - // address(simpleWallet.emailAuthImplementationAddr()), - // abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - // abi.encode(0x0) - // ); - - // // Deploy mock guardian, that status is NONE - // address mockCallAddress; - // if(block.chainid == 300) { - // mockCallAddress = address(0x889170C6bEe9053626f8460A9875d22Cf6DE0782); - // } else { - // mockCallAddress = address(0x2Cfb66029975B1c8881adaa3b79c5Caa4FEB84B5); - // } - // vm.mockCall( - // mockCallAddress, - // abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - // abi.encode(0x0) - // ); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("guardian is not deployed")); - recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); - vm.stopPrank(); - } - - function testExpectRevertHandleRecoveryInvalidTemplateIndex() public { - skipIfNotZkSync(); - - handleAcceptance(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - uint templateIdx = 1; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeRecoveryTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForRecovery = new bytes[](2); - commandParamsForRecovery[0] = abi.encode(simpleWallet); - commandParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.commandParams = commandParamsForRecovery; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid template index")); - recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); - vm.stopPrank(); - } - - function testExpectRevertHandleRecoveryInvalidcommandParams() public { - skipIfNotZkSync(); - - handleAcceptance(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeRecoveryTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForRecovery = new bytes[](3); - commandParamsForRecovery[0] = abi.encode(simpleWallet); - commandParamsForRecovery[1] = abi.encode(newSigner); - commandParamsForRecovery[1] = abi.encode(address(0x0)); - emailAuthMsg.commandParams = commandParamsForRecovery; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid command params")); - recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); - vm.stopPrank(); - } - - // function testExpectRevertHandleRecoveryInvalidGuardianInEmail() public { - // handleAcceptance(); - - // assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - // assertEq( - // recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - // 0 - // ); - // assertEq(simpleWallet.owner(), deployer); - // assertEq( - // recoveryControllerZKSync.newSignerCandidateOfAccount(address(simpleWallet)), - // address(0x0) - // ); - // uint templateIdx = 0; - - // EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - // uint templateId = recoveryControllerZKSync.computeRecoveryTemplateId(templateIdx); - // emailAuthMsg.templateId = templateId; - // bytes[] memory commandParamsForRecovery = new bytes[](2); - // commandParamsForRecovery[0] = abi.encode(address(0x0)); - // commandParamsForRecovery[1] = abi.encode(newSigner); - // emailAuthMsg.commandParams = commandParamsForRecovery; - - // vm.mockCall( - // address(recoveryControllerZKSync.emailAuthImplementationAddr()), - // abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - // abi.encode(0x0) - // ); - - // vm.startPrank(someRelayer); - // vm.expectRevert(bytes("invalid guardian in email")); - // recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); - // vm.stopPrank(); - // } - - function testExpectRevertHandleRecoveryInvalidNewSigner() public { - skipIfNotZkSync(); - - handleAcceptance(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeRecoveryTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForRecovery = new bytes[](2); - commandParamsForRecovery[0] = abi.encode(simpleWallet); - commandParamsForRecovery[1] = abi.encode(address(0x0)); - emailAuthMsg.commandParams = commandParamsForRecovery; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid new signer")); - recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); - vm.stopPrank(); - } -} diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_rejectRecovery.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_rejectRecovery.t.sol deleted file mode 100644 index e17c900e..00000000 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_rejectRecovery.t.sol +++ /dev/null @@ -1,265 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import {EmailAuth, EmailAuthMsg} from "../../src/EmailAuth.sol"; -import {RecoveryControllerZKSync} from "../helpers/RecoveryControllerZKSync.sol"; -import {StructHelper} from "../helpers/StructHelper.sol"; -import {SimpleWallet} from "../helpers/SimpleWallet.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -contract EmailAccountRecoveryZKSyncTest_rejectRecovery is StructHelper { - constructor() {} - - function setUp() public override { - super.setUp(); - } - - /** - * Set up functions - */ - function requestGuardian() public { - setUp(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.NONE - ); - - vm.startPrank(deployer); - recoveryControllerZKSync.requestGuardian(guardian); - vm.stopPrank(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - } - - function handleAcceptance() public { - requestGuardian(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - - console.log("guardian", guardian); - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - bytes[] memory commandParamsForAcceptance = new bytes[](1); - commandParamsForAcceptance[0] = abi.encode(address(simpleWallet)); - emailAuthMsg.commandParams = commandParamsForAcceptance; - address recoveredAccount = recoveryControllerZKSync - .extractRecoveredAccountFromAcceptanceCommand( - emailAuthMsg.commandParams, - templateIdx - ); - address computedGuardian = recoveryControllerZKSync.computeEmailAuthAddress( - recoveredAccount, - emailAuthMsg.proof.accountSalt - ); - console.log("computed guardian", computedGuardian); - uint templateId = recoveryControllerZKSync.computeAcceptanceTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - // acceptGuardian is internal, we call handleAcceptance, which calls acceptGuardian internally. - vm.startPrank(someRelayer); - recoveryControllerZKSync.handleAcceptance(emailAuthMsg, templateIdx); - vm.stopPrank(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.ACCEPTED - ); - } - - function handleRecovery() public { - handleAcceptance(); - - assertEq(simpleWallet.owner(), deployer); - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - 0 - ); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - - uint templateIdx = 0; - - EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); - uint templateId = recoveryControllerZKSync.computeRecoveryTemplateId( - templateIdx - ); - emailAuthMsg.templateId = templateId; - bytes[] memory commandParamsForRecovery = new bytes[](2); - commandParamsForRecovery[0] = abi.encode(simpleWallet); - commandParamsForRecovery[1] = abi.encode(newSigner); - emailAuthMsg.commandParams = commandParamsForRecovery; - - vm.mockCall( - address(recoveryControllerZKSync.emailAuthImplementationAddr()), - abi.encodeWithSelector(EmailAuth.authEmail.selector, emailAuthMsg), - abi.encode(0x0) - ); - - vm.startPrank(someRelayer); - recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); - vm.stopPrank(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), true); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - newSigner - ); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - block.timestamp + - recoveryControllerZKSync.timelockPeriodOfAccount( - address(simpleWallet) - ) - ); - } - - function testRejectRecovery() public { - skipIfNotZkSync(); - - vm.warp(block.timestamp + 3 days); - - handleRecovery(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), true); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - block.timestamp + - recoveryControllerZKSync.timelockPeriodOfAccount( - address(simpleWallet) - ) - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - newSigner - ); - - vm.warp(0); - - vm.startPrank(address(simpleWallet)); - recoveryControllerZKSync.rejectRecovery(); - vm.stopPrank(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - } - - function testExpectRevertRejectRecoveryRecoveryNotInProgress() public { - skipIfNotZkSync(); - - handleAcceptance(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - 0 - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - address(0x0) - ); - - vm.startPrank(deployer); - vm.expectRevert(bytes("recovery not in progress")); - recoveryControllerZKSync.rejectRecovery(); - vm.stopPrank(); - } - - function testExpectRevertRejectRecovery() public { - skipIfNotZkSync(); - - vm.warp(block.timestamp + 1 days); - - handleRecovery(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), true); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - block.timestamp + - recoveryControllerZKSync.timelockPeriodOfAccount( - address(simpleWallet) - ) - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - newSigner - ); - - vm.startPrank(address(simpleWallet)); - vm.warp(block.timestamp + 4 days); - vm.expectRevert(bytes("timelock expired")); - recoveryControllerZKSync.rejectRecovery(); - vm.stopPrank(); - } - - function testExpectRevertRejectRecoveryOwnableUnauthorizedAccount() public { - skipIfNotZkSync(); - - handleRecovery(); - - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), true); - assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), - block.timestamp + - recoveryControllerZKSync.timelockPeriodOfAccount( - address(simpleWallet) - ) - ); - assertEq(simpleWallet.owner(), deployer); - assertEq( - recoveryControllerZKSync.newSignerCandidateOfAccount( - address(simpleWallet) - ), - newSigner - ); - - vm.startPrank(deployer); - vm.expectRevert("recovery not in progress"); - recoveryControllerZKSync.rejectRecovery(); - vm.stopPrank(); - } -} diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_requestGuardian.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_requestGuardian.t.sol deleted file mode 100644 index 03418653..00000000 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_requestGuardian.t.sol +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import {EmailAuth, EmailAuthMsg} from "../../src/EmailAuth.sol"; -import {RecoveryControllerZKSync} from "../helpers/RecoveryControllerZKSync.sol"; -import {StructHelper} from "../helpers/StructHelper.sol"; -import {SimpleWallet} from "../helpers/SimpleWallet.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -contract EmailAccountRecoveryZKSyncTest_requestGuardian is StructHelper { - constructor() {} - - function setUp() public override { - super.setUp(); - } - - function testRequestGuardian() public { - skipIfNotZkSync(); - - setUp(); - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.NONE - ); - - vm.startPrank(deployer); - recoveryControllerZKSync.requestGuardian(guardian); - vm.stopPrank(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.REQUESTED - ); - } - - // function testRequestGuardianNotOwner() public { - // setUp(); - - // require( - // recoveryControllerZKSync.guardians(guardian) == - // recoveryControllerZKSync.GuardianStatus.NONE - // ); - - // vm.startPrank(receiver); - // recoveryControllerZKSync.requestGuardian(guardian); - // vm.stopPrank(); - - // require( - // recoveryControllerZKSync.guardians(guardian) == - // recoveryControllerZKSync.GuardianStatus.NONE - // ); - // } - - function testExpectRevertRequestGuardianInvalidGuardian() public { - skipIfNotZkSync(); - - setUp(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.NONE - ); - - vm.startPrank(deployer); - vm.expectRevert(bytes("invalid guardian")); - recoveryControllerZKSync.requestGuardian(address(0x0)); - vm.stopPrank(); - } - - function testExpectRevertRequestGuardianGuardianStatusMustBeNone() public { - skipIfNotZkSync(); - - setUp(); - - require( - recoveryControllerZKSync.guardians(guardian) == - RecoveryControllerZKSync.GuardianStatus.NONE - ); - - vm.startPrank(deployer); - recoveryControllerZKSync.requestGuardian(guardian); - vm.expectRevert(bytes("guardian status must be NONE")); - recoveryControllerZKSync.requestGuardian(guardian); - vm.stopPrank(); - } -} diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_transfer.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_transfer.t.sol deleted file mode 100644 index b784847d..00000000 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_transfer.t.sol +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import {EmailAuth, EmailAuthMsg} from "../../src/EmailAuth.sol"; -import {RecoveryControllerZKSync} from "../helpers/RecoveryControllerZKSync.sol"; -import {StructHelper} from "../helpers/StructHelper.sol"; -import {SimpleWallet} from "../helpers/SimpleWallet.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -contract EmailAccountRecoveryZKSyncTest_transfer is StructHelper { - constructor() {} - - function setUp() public override { - super.setUp(); - } - - function testTransfer() public { - skipIfNotZkSync(); - - setUp(); - - assertEq(address(simpleWallet).balance, 1 ether); - assertEq(receiver.balance, 0 ether); - - vm.startPrank(deployer); - simpleWallet.transfer(receiver, 1 ether); - vm.stopPrank(); - - assertEq(address(simpleWallet).balance, 0 ether); - assertEq(receiver.balance, 1 ether); - } - - function testExpectRevertTransferOnlyOwner() public { - skipIfNotZkSync(); - - setUp(); - - assertEq(address(simpleWallet).balance, 1 ether); - assertEq(receiver.balance, 0 ether); - - vm.startPrank(receiver); - vm.expectRevert( - abi.encodeWithSelector( - OwnableUpgradeable.OwnableUnauthorizedAccount.selector, - receiver - ) - ); - simpleWallet.transfer(receiver, 1 ether); - vm.stopPrank(); - } - - function testExpectRevertTransferOnlyOwnerInsufficientBalance() public { - skipIfNotZkSync(); - - setUp(); - - assertEq(address(simpleWallet).balance, 1 ether); - assertEq(receiver.balance, 0 ether); - - vm.startPrank(deployer); - assertEq(receiver.balance, 0 ether); - vm.expectRevert(bytes("insufficient balance")); - simpleWallet.transfer(receiver, 2 ether); - vm.stopPrank(); - } -} diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_withdraw.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_withdraw.t.sol deleted file mode 100644 index 07d347d6..00000000 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_withdraw.t.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import {EmailAuth, EmailAuthMsg} from "../../src/EmailAuth.sol"; -import {RecoveryControllerZKSync} from "../helpers/RecoveryControllerZKSync.sol"; -import {StructHelper} from "../helpers/StructHelper.sol"; -import {SimpleWallet} from "../helpers/SimpleWallet.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -contract EmailAccountRecoveryZKSyncTest_withdraw is StructHelper { - constructor() {} - - function setUp() public override { - super.setUp(); - } - - function testWithdraw() public { - skipIfNotZkSync(); - - setUp(); - - assertEq(address(simpleWallet).balance, 1 ether); - assertEq(deployer.balance, 0 ether); - - vm.startPrank(deployer); - simpleWallet.withdraw(1 ether); - vm.stopPrank(); - - assertEq(address(simpleWallet).balance, 0 ether); - assertEq(deployer.balance, 1 ether); - } - - function testExpectRevertWithdrawOnlyOwner() public { - skipIfNotZkSync(); - - setUp(); - - assertEq(address(simpleWallet).balance, 1 ether); - assertEq(deployer.balance, 0 ether); - - vm.startPrank(receiver); - vm.expectRevert( - abi.encodeWithSelector( - OwnableUpgradeable.OwnableUnauthorizedAccount.selector, - address(receiver) - ) - ); - simpleWallet.withdraw(1 ether); - vm.stopPrank(); - } - - function testExpectRevertWithdrawInsufficientBalance() public { - skipIfNotZkSync(); - - setUp(); - - assertEq(address(simpleWallet).balance, 1 ether); - assertEq(deployer.balance, 0 ether); - - vm.startPrank(deployer); - vm.expectRevert(bytes("insufficient balance")); - simpleWallet.withdraw(10 ether); - vm.stopPrank(); - } -} diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_acceptanceCommandTemplates.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_acceptanceCommandTemplates.t.sol deleted file mode 100644 index 81d9a67c..00000000 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_acceptanceCommandTemplates.t.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import {EmailAuth, EmailAuthMsg} from "../../src/EmailAuth.sol"; -import {RecoveryControllerZKSync} from "../helpers/RecoveryControllerZKSync.sol"; -import {StructHelper} from "../helpers/StructHelper.sol"; -import {SimpleWallet} from "../helpers/SimpleWallet.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -contract EmailAccountRecoveryZKSyncTest_acceptanceCommandTemplates is - StructHelper -{ - constructor() {} - - function setUp() public override { - super.setUp(); - } - - function testAcceptanceCommandTemplates() public { - skipIfNotZkSync(); - - setUp(); - string[][] memory res = recoveryController.acceptanceCommandTemplates(); - assertEq(res[0][0], "Accept"); - assertEq(res[0][1], "guardian"); - assertEq(res[0][2], "request"); - assertEq(res[0][3], "for"); - assertEq(res[0][4], "{ethAddr}"); - } -} diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_recoveryCommandTemplates.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_recoveryCommandTemplates.t.sol deleted file mode 100644 index 62271e43..00000000 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_recoveryCommandTemplates.t.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.12; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import {EmailAuth, EmailAuthMsg} from "../../src/EmailAuth.sol"; -import {RecoveryController} from "../helpers/RecoveryController.sol"; -import {StructHelper} from "../helpers/StructHelper.sol"; -import {SimpleWallet} from "../helpers/SimpleWallet.sol"; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -contract EmailAccountRecoveryZKSyncTest_recoveryCommandTemplates is - StructHelper -{ - constructor() {} - - function setUp() public override { - super.setUp(); - } - - function testRecoveryCommandTemplates() public { - skipIfNotZkSync(); - - setUp(); - string[][] memory res = recoveryController.recoveryCommandTemplates(); - assertEq(res[0][0], "Set"); - assertEq(res[0][1], "the"); - assertEq(res[0][2], "new"); - assertEq(res[0][3], "signer"); - assertEq(res[0][4], "of"); - assertEq(res[0][5], "{ethAddr}"); - assertEq(res[0][6], "to"); - assertEq(res[0][7], "{ethAddr}"); - } -} From ac511f540d2efdc7a52c195ffb058afaa913b0db Mon Sep 17 00:00:00 2001 From: Dimitri Date: Fri, 13 Sep 2024 17:06:04 +0700 Subject: [PATCH 076/121] Bump relayer version --- cloudbuild-relayer.yaml | 6 +- kubernetes/relayer.staging.yml | 196 ++++++++++++++++----------------- 2 files changed, 102 insertions(+), 100 deletions(-) diff --git a/cloudbuild-relayer.yaml b/cloudbuild-relayer.yaml index 45422673..baab474d 100644 --- a/cloudbuild-relayer.yaml +++ b/cloudbuild-relayer.yaml @@ -1,3 +1,5 @@ +options: + machineType: 'N1_HIGHCPU_32' steps: # Build the base container image - name: 'gcr.io/cloud-builders/docker' @@ -5,7 +7,7 @@ steps: [ 'build', '-t', - 'us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer:v1', + 'us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer:v2', '-f', 'Relayer.Dockerfile', '.', @@ -15,5 +17,5 @@ steps: args: [ 'push', - 'us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer:v1', + 'us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer:v2', ] diff --git a/kubernetes/relayer.staging.yml b/kubernetes/relayer.staging.yml index 7e97ee50..2c9855bd 100644 --- a/kubernetes/relayer.staging.yml +++ b/kubernetes/relayer.staging.yml @@ -1,76 +1,76 @@ -# apiVersion: v1 -# kind: ConfigMap -# metadata: -# name: relayer-config-email-auth -# namespace: ar-base-sepolia-staging -# labels: -# app: relayer -# data: -# EMAIL_ACCOUNT_RECOVERY_VERSION_ID: '' -# CHAIN_RPC_PROVIDER: '' -# CHAIN_RPC_EXPLORER: '' -# CHAIN_ID: '' -# WEB_SERVER_ADDRESS: '' -# CIRCUITS_DIR_PATH: '' -# EMAIL_TEMPLATES_PATH: '' -# CANISTER_ID: '' -# IC_REPLICA_URL: '' -# JSON_LOGGER: '' -# PEM_PATH: '' -# SMTP_SERVER: '' +apiVersion: v1 +kind: ConfigMap +metadata: + name: relayer-config-email-auth + namespace: ar-base-sepolia-staging + labels: + app: relayer +data: + EMAIL_ACCOUNT_RECOVERY_VERSION_ID: '' + CHAIN_RPC_PROVIDER: '' + CHAIN_RPC_EXPLORER: '' + CHAIN_ID: '' + WEB_SERVER_ADDRESS: '' + CIRCUITS_DIR_PATH: '' + EMAIL_TEMPLATES_PATH: '' + CANISTER_ID: '' + IC_REPLICA_URL: '' + JSON_LOGGER: '' + PEM_PATH: '' + SMTP_SERVER: '' -# --- -# apiVersion: v1 -# kind: Secret -# metadata: -# name: relayer-secret-email-auth -# namespace: ar-base-sepolia-staging -# labels: -# app: relayer -# type: Opaque -# data: -# PRIVATE_KEY: -# DATABASE_URL: -# PROVER_ADDRESS: -# ICPEM: +--- +apiVersion: v1 +kind: Secret +metadata: + name: relayer-secret-email-auth + namespace: ar-base-sepolia-staging + labels: + app: relayer +type: Opaque +data: + PRIVATE_KEY: + DATABASE_URL: + PROVER_ADDRESS: + ICPEM: -# --- -# apiVersion: v1 -# kind: Secret -# metadata: -# name: relayer-smtp-secret -# namespace: ar-base-sepolia-staging -# labels: -# app: relayer -# type: Opaque -# data: -# SMTP_LOGIN_ID: -# SMTP_LOGIN_PASSWORD: -# SMTP_DOMAIN_NAME: -# SERVER_HOST: -# SERVER_PORT: -# JSON_LOGGER: +--- +apiVersion: v1 +kind: Secret +metadata: + name: relayer-smtp-secret + namespace: ar-base-sepolia-staging + labels: + app: relayer +type: Opaque +data: + SMTP_LOGIN_ID: + SMTP_LOGIN_PASSWORD: + SMTP_DOMAIN_NAME: + SERVER_HOST: + SERVER_PORT: + JSON_LOGGER: -# --- -# apiVersion: v1 -# kind: Secret -# metadata: -# name: relayer-imap-secret -# namespace: ar-base-sepolia-staging -# labels: -# app: relayer -# type: Opaque -# data: -# RELAYER_ENDPOINT: -# IMAP_LOGIN_ID: -# IMAP_LOGIN_PASSWORD: -# IMAP_PORT: -# IMAP_DOMAIN_NAME: -# SERVER_HOST: -# AUTH_TYPE: -# JSON_LOGGER: +--- +apiVersion: v1 +kind: Secret +metadata: + name: relayer-imap-secret + namespace: ar-base-sepolia-staging + labels: + app: relayer +type: Opaque +data: + RELAYER_ENDPOINT: + IMAP_LOGIN_ID: + IMAP_LOGIN_PASSWORD: + IMAP_PORT: + IMAP_DOMAIN_NAME: + SERVER_HOST: + AUTH_TYPE: + JSON_LOGGER: -# --- +--- apiVersion: apps/v1 kind: Deployment metadata: @@ -89,7 +89,7 @@ spec: spec: containers: - name: relayer-container - image: us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer:v1 + image: us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer:v2 ports: - containerPort: 4500 envFrom: @@ -132,32 +132,32 @@ spec: items: - key: ICPEM path: '.ic.pem' -# --- -# apiVersion: v1 -# kind: Service -# metadata: -# name: relayer-svc-email-auth -# namespace: ar-base-sepolia-staging -# spec: -# selector: -# app: relayer -# ports: -# - protocol: TCP -# port: 443 -# targetPort: 4500 -# type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + name: relayer-svc-email-auth + namespace: ar-base-sepolia-staging +spec: + selector: + app: relayer + ports: + - protocol: TCP + port: 443 + targetPort: 4500 + type: ClusterIP -# --- -# apiVersion: v1 -# kind: Service -# metadata: -# name: relayer-smtp-svc -# namespace: ar-base-sepolia-staging -# spec: -# selector: -# app: relayer -# ports: -# - protocol: TCP -# port: 443 -# targetPort: 8080 -# type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + name: relayer-smtp-svc + namespace: ar-base-sepolia-staging +spec: + selector: + app: relayer + ports: + - protocol: TCP + port: 443 + targetPort: 8080 + type: ClusterIP From 399126a0488d951d854dcefb97825e28167027bf Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Fri, 13 Sep 2024 15:55:00 +0530 Subject: [PATCH 077/121] fix: add command in email templates --- packages/relayer/eml_templates/acceptance_request.html | 1 + packages/relayer/eml_templates/recovery_request.html | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/relayer/eml_templates/acceptance_request.html b/packages/relayer/eml_templates/acceptance_request.html index 3e0cd15d..6950b8c8 100644 --- a/packages/relayer/eml_templates/acceptance_request.html +++ b/packages/relayer/eml_templates/acceptance_request.html @@ -254,5 +254,6 @@ +
{{command}}
diff --git a/packages/relayer/eml_templates/recovery_request.html b/packages/relayer/eml_templates/recovery_request.html index 48293fee..c9ae4bfc 100644 --- a/packages/relayer/eml_templates/recovery_request.html +++ b/packages/relayer/eml_templates/recovery_request.html @@ -253,5 +253,6 @@ +
{{command}}
From ede8e54bd9ee68c8040b2a87b33bb1a271770ebd Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sat, 14 Sep 2024 10:29:37 +0530 Subject: [PATCH 078/121] feat: add CONTRIBUTING.md & CODING_GUIDELINES.md --- CODING_GUIDELINES.md | 98 +++++++++++++++ CONTRIBUTING.md | 116 ++++++++++++++++++ .../cloudbuild-base.yml | 0 .../cloudbuild-relayer.yml | 0 4 files changed, 214 insertions(+) create mode 100644 CODING_GUIDELINES.md create mode 100644 CONTRIBUTING.md rename cloudbuild-base.yaml => kubernetes/cloudbuild-base.yml (100%) rename cloudbuild-relayer.yaml => kubernetes/cloudbuild-relayer.yml (100%) diff --git a/CODING_GUIDELINES.md b/CODING_GUIDELINES.md new file mode 100644 index 00000000..195805e5 --- /dev/null +++ b/CODING_GUIDELINES.md @@ -0,0 +1,98 @@ +# Coding Guidelines for Relayer Utils + +This document outlines the coding guidelines for contributing to Relayer Utils. Following these guidelines will help maintain a consistent and high-quality codebase. + +## 1. Code Formatting + +- **Tool**: Use `rustfmt` to automatically format your code. Ensure that all code is formatted before committing. Run `cargo fmt` to format your code according to the project's style guidelines. +- **Indentation**: Use 4 spaces per indentation level. Do not use tabs. +- **Line Length**: Aim to keep lines under 100 characters, but it's not a strict rule. Use your judgment to ensure readability. +- **Imports**: Group imports into four sections: `extern crate`, `use`, `use crate`, and `use super`. + - Example: + ```rust + extern crate serde; + + use std::collections::HashMap; + use std::io::{self, Read}; + + use crate::utils::config; + + use super::super::common::logger; + ``` +- **Braces**: Use the Allman style for braces, where the opening brace is on the same line as the function signature. + - Example: + ```rust + fn main() { + // function body + } + ``` +- **Comments**: Use `//` for single-line comments and `/* ... */` for multi-line comments. +- **Whitespace**: Use a single space after commas and colons, and no space before commas and colons. + - Example: + ```rust + let numbers = vec![1, 2, 3]; + let user = User { name: "Alice", age: 30 }; + ``` +- **Function Length**: Aim to keep functions short and focused. If a function is too long, consider breaking it up into smaller functions. +- **Code Duplication**: Avoid duplicating code. If you find yourself copying and pasting code, consider refactoring it into a shared function or module. +- **No warnings**: Ensure that your code compiles without warnings. Fix any warnings before committing. + +## 2. Code Linting + +- **Tool**: Use `cargo clippy` to lint your code and catch common mistakes and improve your Rust code. Run `cargo clippy` before committing your code to ensure it adheres to Rust's best practices and the project's specific requirements. +- **Handling Lints**: Address all warnings and errors reported by `clippy`. If you must ignore a lint, use `#[allow(clippy::lint_name)]` and provide a comment explaining why. + +## 3. Naming Conventions + +- **Variables and Functions**: Use `snake_case`. + - Example: `let user_name = "Alice";` +- **Structs and Enums**: Use `PascalCase`. + - Example: `struct UserAccount { ... }` +- **Constants**: Use `UPPER_SNAKE_CASE`. + - Example: `const MAX_USERS: u32 = 100;` +- **Module Names**: Use `snake_case`. + - Example: `mod user_account;` + +## 4. Documentation + +- **Public Items**: All public functions, structs, and modules must have documentation comments using `///`. + - Example: + ```rust + /// Creates a new user account. + /// + /// # Arguments + /// + /// * `name` - The name of the user. + /// + /// # Returns + /// + /// A `UserAccount` struct. + pub fn create_user_account(name: &str) -> UserAccount { + // function body + } + ``` +- **Private Items**: Document private items where the intent or functionality is not immediately clear. +- **Module Documentation**: Each module should have a comment at the top explaining its purpose. + - Example: + ```rust + //! This module contains utility functions for user management. + + // module contents + ``` + +## 5. Error Handling + +- **Use of `Result` and `Option`**: + - Use `Result` for operations that can fail and `Option` for values that may or may not be present. + - Example: + ```rust + fn find_user(id: u32) -> Option { + // function body + } + + fn open_file(path: &str) -> Result { + // function body + } + ``` +- **Custom Error Types**: When appropriate, define custom error types using `enum` and implement the `anyhow::Error` trait. +- **Error Propagation**: Propagate errors using `?` where possible to simplify error handling. \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..39a0dcee --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,116 @@ +# Contributing to Relayer Utils + +Thank you for considering contributing to our project! We welcome contributions of all kinds, including code, documentation, bug reports, feature requests, and more. This document outlines the process for contributing to this project. + +## Table of Contents +- [Contributing to Relayer Utils](#contributing-to-relayer-utils) + - [Table of Contents](#table-of-contents) + - [1. Code of Conduct](#1-code-of-conduct) + - [2. Getting Started](#2-getting-started) + - [3. Coding Guidelines](#3-coding-guidelines) + - [4. Testing](#4-testing) + - [5. Commit Messages](#5-commit-messages) + - [6. Pull Request Process](#6-pull-request-process) + - [7. Contact](#7-contact) + +## 1. Code of Conduct +We are committed to providing a welcoming and inspiring community for all and expect our Code of Conduct to be honored. Anyone who violates this code of conduct may be banned from the community. + +Our community strives to: + +- **Be friendly and patient.** +- **Be welcoming**: We strive to be a community that welcomes and supports people of all backgrounds and identities. +- **Be considerate**: Your work will be used by other people, and you in turn will depend on the work of others. +- **Be respectful**: Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. +- **Be careful in the words that you choose**: We are a community of professionals, and we conduct ourselves professionally. +- **Be kind to others**: Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable. + +This includes, but is not limited to: + +- Violent threats or language directed against another person. +- Discriminatory jokes and language. +- Posting sexually explicit or violent material. +- Posting (or threatening to post) other people's personally identifying information ("doxing"). +- Personal insults, especially those using racist or sexist terms. +- Unwelcome sexual attention. +- Advocating for, or encouraging, any of the above behavior. +- Repeated harassment of others. In general, if someone asks you to stop, then stop. + +Moderation + +These are the policies for upholding our community’s standards of conduct. If you feel that a thread needs moderation, please contact the community team at [paradox@pse.dev](mailto:paradox@pse.dev). + +1. **Remarks that violate the Relayer Utils standards of conduct, including hateful, hurtful, oppressive, or exclusionary remarks, are not allowed.** (Cursing is allowed, but never targeting another user, and never in a hateful manner.) +2. **Remarks that moderators find inappropriate, whether listed in the code of conduct or not, are also not allowed.** +3. **Moderators will first respond to such remarks with a warning.** +4. **If the warning is unheeded, the user will be “kicked,” i.e., temporarily banned from the community.** +5. **If the user comes back and continues to make trouble, they will be banned permanently from the community.** +6. **Moderators may choose at their discretion to un-ban the user if it was a first offense and they offer the offended party a genuine apology.** +7. **If a moderator bans someone and you think it was unjustified, please take it up with that moderator, or with a different moderator, in a private discussion.** + +**Please try to emulate these behaviors, especially when debating the merits of different options.** + +Thank you for helping make this a welcoming, friendly community for all. + +This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html](https://www.contributor-covenant.org/version/1/4/code-of-conduct.html) + + +## 2. Getting Started +To start contributing, follow these steps: + +1. Fork the repository. +2. Clone your fork to your local machine: + ```bash + git clone https://github.com/zkemail/relayer-utils.git + ``` +3. Create a new branch for your feature or bugfix: + ```bash + git checkout -b feat/your-feature-name + ``` +4. Install the necessary dependencies: + ```bash + cargo build + ``` +5. Make your changes. + +## 3. Coding Guidelines + +Please follow the coding guidelines in [CODING_GUIDELINES.md](CODING_GUIDELINES.md) when contributing to this project. + +## 4. Testing + +Please write tests for your contributions. We aim for high test coverage. + + • Unit Tests: Place unit tests in the same file as the code they are testing. + • Integration Tests: Place integration tests in the tests/ directory. + +Run all tests before submitting your code with cargo test. + +Run all tests before submitting your code with cargo test. + +## 5. Commit Messages + +Use conventional commit messages for your commits. This helps us automatically generate the changelog and follow semantic versioning. + + • Format: `: ` + • Example: `feat: add new feature` + +For more information, see [Conventional Commits](https://www.conventionalcommits.org/). + +## 6. Pull Request Process + + 1. Ensure your branch is up-to-date with the main branch: + • git fetch origin + • git checkout main + • git merge origin/main + 2. Push your branch to your fork: + • git push origin feature/your-feature-name + 3. Open a pull request from your branch to the main branch of the original repository. + 4. Ensure that your pull request passes all checks (e.g., CI tests). + 5. A reviewer will review your pull request. Be prepared to make adjustments based on feedback. + +## 7. Contact + +If you have any questions or need further assistance, feel free to open an issue or contact us at [paradox@pse.dev](mailto:paradox@pse.dev). + +Thank you for your contributions! \ No newline at end of file diff --git a/cloudbuild-base.yaml b/kubernetes/cloudbuild-base.yml similarity index 100% rename from cloudbuild-base.yaml rename to kubernetes/cloudbuild-base.yml diff --git a/cloudbuild-relayer.yaml b/kubernetes/cloudbuild-relayer.yml similarity index 100% rename from cloudbuild-relayer.yaml rename to kubernetes/cloudbuild-relayer.yml From 0ba5fb15c0063c195d1cb46b43131028d8cc4aae Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sat, 14 Sep 2024 10:35:22 +0530 Subject: [PATCH 079/121] chore: move md files --- CODING_GUIDELINES.md => packages/relayer/CODING_GUIDELINES.md | 0 CONTRIBUTING.md => packages/relayer/CONTRIBUTING.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename CODING_GUIDELINES.md => packages/relayer/CODING_GUIDELINES.md (100%) rename CONTRIBUTING.md => packages/relayer/CONTRIBUTING.md (100%) diff --git a/CODING_GUIDELINES.md b/packages/relayer/CODING_GUIDELINES.md similarity index 100% rename from CODING_GUIDELINES.md rename to packages/relayer/CODING_GUIDELINES.md diff --git a/CONTRIBUTING.md b/packages/relayer/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to packages/relayer/CONTRIBUTING.md From 52a40054424cfe7020013fc7507b9a1d747fb306 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sun, 15 Sep 2024 15:56:39 +0530 Subject: [PATCH 080/121] feat: add github workflows --- .github/workflows/build-test-fmt.yml | 55 --------------------------- .github/workflows/build.yml | 51 +++++++++++++++++++++++++ .github/workflows/clippy.yml | 13 +++++++ .github/workflows/rustfmt.yml | 13 +++++++ .github/workflows/unit-tests.yml | 32 +++++++++++++++- packages/relayer/CODING_GUIDELINES.md | 4 +- packages/relayer/CONTRIBUTING.md | 4 +- 7 files changed, 112 insertions(+), 60 deletions(-) delete mode 100644 .github/workflows/build-test-fmt.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/clippy.yml create mode 100644 .github/workflows/rustfmt.yml diff --git a/.github/workflows/build-test-fmt.yml b/.github/workflows/build-test-fmt.yml deleted file mode 100644 index 17f94353..00000000 --- a/.github/workflows/build-test-fmt.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Build-Test-Fmt - -on: - [push] - -jobs: - build-test-fmt: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - run: rustup show - - - uses: Swatinem/rust-cache@v2 - - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: "yarn" - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly-0079a1146b79a4aeda58b0258215bedb1f92700b - - - name: Run tests - working-directory: packages/contracts - run: yarn build - - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@main - with: - # this might remove tools that are actually needed, - # if set to "true" but frees about 6 GB - tool-cache: false - - # all of these default to true, but feel free to set to - # "false" if necessary for your workflow - android: true - dotnet: true - haskell: true - large-packages: true - docker-images: true - swap-storage: true - - - name: Build - run: cargo build --release - - - name: Test - run: cargo test --release diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..083784e1 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,51 @@ +name: Build-Test-Fmt + +on: [push] + +jobs: + build-test-fmt: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - run: rustup show + + - uses: Swatinem/rust-cache@v2 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: "yarn" + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly-0079a1146b79a4aeda58b0258215bedb1f92700b + + - name: Run tests + working-directory: packages/contracts + run: yarn build + + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + # this might remove tools that are actually needed, + # if set to "true" but frees about 6 GB + tool-cache: false + + # all of these default to true, but feel free to set to + # "false" if necessary for your workflow + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: true + swap-storage: true + + - name: Build and check for warnings + run: cargo build --release -D warnings diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml new file mode 100644 index 00000000..584a0ff3 --- /dev/null +++ b/.github/workflows/clippy.yml @@ -0,0 +1,13 @@ +name: Clippy Lint Check + +on: [pull_request] + +jobs: + clippy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install clippy + run: rustup component add clippy + - name: Run clippy + run: cargo clippy -- -D warnings diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml new file mode 100644 index 00000000..9764b118 --- /dev/null +++ b/.github/workflows/rustfmt.yml @@ -0,0 +1,13 @@ +name: Rustfmt Check + +on: [pull_request] + +jobs: + format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install rustfmt + run: rustup component add rustfmt + - name: Check formatting + run: cargo fmt -- --check diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 29740de9..457f42e1 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -47,7 +47,7 @@ jobs: uses: actions/setup-node@v3 with: node-version: 18 - + - name: Install yarn run: npm install -g yarn @@ -62,3 +62,33 @@ jobs: - name: Run tests working-directory: packages/contracts run: yarn test + + relayer: + name: relayer + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install yarn + run: npm install -g yarn + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1.2.0 + with: + version: nightly-0079a1146b79a4aeda58b0258215bedb1f92700b + + - name: Forge Build + working-directory: packages/contracts + run: forge build + + - name: Run tests + working-directory: packages/relayer + run: cargo test diff --git a/packages/relayer/CODING_GUIDELINES.md b/packages/relayer/CODING_GUIDELINES.md index 195805e5..93043ca2 100644 --- a/packages/relayer/CODING_GUIDELINES.md +++ b/packages/relayer/CODING_GUIDELINES.md @@ -1,6 +1,6 @@ -# Coding Guidelines for Relayer Utils +# Coding Guidelines for Relayer -This document outlines the coding guidelines for contributing to Relayer Utils. Following these guidelines will help maintain a consistent and high-quality codebase. +This document outlines the coding guidelines for contributing to the Relayer. Following these guidelines will help maintain a consistent and high-quality codebase. ## 1. Code Formatting diff --git a/packages/relayer/CONTRIBUTING.md b/packages/relayer/CONTRIBUTING.md index 39a0dcee..b249c89d 100644 --- a/packages/relayer/CONTRIBUTING.md +++ b/packages/relayer/CONTRIBUTING.md @@ -1,9 +1,9 @@ -# Contributing to Relayer Utils +# Contributing to Relayer Thank you for considering contributing to our project! We welcome contributions of all kinds, including code, documentation, bug reports, feature requests, and more. This document outlines the process for contributing to this project. ## Table of Contents -- [Contributing to Relayer Utils](#contributing-to-relayer-utils) +- [Contributing to Relayer](#contributing-to-relayer) - [Table of Contents](#table-of-contents) - [1. Code of Conduct](#1-code-of-conduct) - [2. Getting Started](#2-getting-started) From b268d72f0d9caf0e084a1a227e3f4b13d240fdda Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sun, 15 Sep 2024 17:38:28 +0530 Subject: [PATCH 081/121] chore: remove abis --- .gitignore | 4 + .../src/abis/ecdsa_owned_dkim_registry.rs | 2333 ------------- .../src/abis/email_account_recovery.rs | 1588 --------- packages/relayer/src/abis/email_auth.rs | 3055 ----------------- 4 files changed, 4 insertions(+), 6976 deletions(-) delete mode 100644 packages/relayer/src/abis/ecdsa_owned_dkim_registry.rs delete mode 100644 packages/relayer/src/abis/email_account_recovery.rs delete mode 100644 packages/relayer/src/abis/email_auth.rs diff --git a/.gitignore b/.gitignore index 1bfbf23a..dd8c2c66 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,10 @@ sql_database.db .sqlx .ic.pem +# ABIs +packages/relayer/src/abis/* +!packages/realyer/src/abis/mod.rs + # Prover packages/prover/build/* packages/prover/params/*.zkey diff --git a/packages/relayer/src/abis/ecdsa_owned_dkim_registry.rs b/packages/relayer/src/abis/ecdsa_owned_dkim_registry.rs deleted file mode 100644 index 98f2b254..00000000 --- a/packages/relayer/src/abis/ecdsa_owned_dkim_registry.rs +++ /dev/null @@ -1,2333 +0,0 @@ -pub use ecdsa_owned_dkim_registry::*; -/// This module was auto-generated with ethers-rs Abigen. -/// More information at: -#[allow( - clippy::enum_variant_names, - clippy::too_many_arguments, - clippy::upper_case_acronyms, - clippy::type_complexity, - dead_code, - non_camel_case_types, -)] -pub mod ecdsa_owned_dkim_registry { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("REVOKE_PREFIX"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("REVOKE_PREFIX"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("SET_PREFIX"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("SET_PREFIX"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "UPGRADE_INTERFACE_VERSION", - ), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("changeSigner"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("changeSigner"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_newSigner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("computeSignedMsg"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("computeSignedMsg"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("prefix"), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("selector"), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("domainName"), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("publicKeyHash"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("dkimRegistry"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("dkimRegistry"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("contract DKIMRegistry"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("initialize"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("initialize"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_initialOwner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_signer"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("isDKIMPublicKeyHashValid"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "isDKIMPublicKeyHashValid", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("domainName"), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("publicKeyHash"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("owner"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("owner"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("proxiableUUID"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proxiableUUID"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("renounceOwnership"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("renounceOwnership"), - inputs: ::std::vec![], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("revokeDKIMPublicKeyHash"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "revokeDKIMPublicKeyHash", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("selector"), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("domainName"), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("publicKeyHash"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("signature"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("setDKIMPublicKeyHash"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "setDKIMPublicKeyHash", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("selector"), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("domainName"), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("publicKeyHash"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("signature"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("signer"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("signer"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("transferOwnership"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("transferOwnership"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("newOwner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("newImplementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("data"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - }, - ], - ), - ]), - events: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("Initialized"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Initialized"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("version"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), - indexed: false, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("OwnershipTransferred"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "OwnershipTransferred", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("previousOwner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("newOwner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("Upgraded"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Upgraded"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ], - anonymous: false, - }, - ], - ), - ]), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("target"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignature"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "ECDSAInvalidSignature", - ), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignatureLength"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "ECDSAInvalidSignatureLength", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("length"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("ECDSAInvalidSignatureS"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "ECDSAInvalidSignatureS", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("s"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "ERC1967InvalidImplementation", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("InvalidInitialization"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "InvalidInitialization", - ), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("NotInitializing"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("NotInitializing"), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("OwnableInvalidOwner"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "OwnableInvalidOwner", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("OwnableUnauthorizedAccount"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "OwnableUnauthorizedAccount", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("StringsInsufficientHexLength"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "StringsInsufficientHexLength", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("value"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("length"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "UUPSUnauthorizedCallContext", - ), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "UUPSUnsupportedProxiableUUID", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("slot"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - }, - ], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static ECDSAOWNEDDKIMREGISTRY_ABI: ::ethers::contract::Lazy< - ::ethers::core::abi::Abi, - > = ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15`\x13W`\0\x80\xFD[P`\x80Qa/~a\0=`\09`\0\x81\x81a\x115\x01R\x81\x81a\x11^\x01Ra\x13\x7F\x01Ra/~`\0\xF3\xFE`\x80`@R`\x046\x10a\0\xF3W`\x005`\xE0\x1C\x80c\x97\x17\x0F+\x11a\0\x8AW\x80c\xD5\x07\xC3 \x11a\0YW\x80c\xD5\x07\xC3 \x14a\x036W\x80c\xE7\xA7\x97z\x14a\x03\x7FW\x80c\xF2\xFD\xE3\x8B\x14a\x03\xAFW\x80c\xF6\xB4\x93D\x14a\x03\xCFW`\0\x80\xFD[\x80c\x97\x17\x0F+\x14a\x02\x8DW\x80c\xAA\xD2\xB7#\x14a\x02\xADW\x80c\xAD<\xB1\xCC\x14a\x02\xCDW\x80c\xAE\xC7\x93a\x14a\x03\x16W`\0\x80\xFD[\x80cR\xD1\x90-\x11a\0\xC6W\x80cR\xD1\x90-\x14a\x01\xDEW\x80cd#\xF1\xE2\x14a\x02\x01W\x80cqP\x18\xA6\x14a\x02.W\x80c\x8D\xA5\xCB[\x14a\x02CW`\0\x80\xFD[\x80c\x07\xF1\xEA\xF5\x14a\0\xF8W\x80c#\x8A\xC93\x14a\x01WW\x80cH\\\xC9U\x14a\x01\xA9W\x80cO\x1E\xF2\x86\x14a\x01\xCBW[`\0\x80\xFD[4\x80\x15a\x01\x04W`\0\x80\xFD[Pa\x01A`@Q\x80`@\x01`@R\x80`\x04\x81R` \x01\x7FSET:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`@Qa\x01N\x91\x90a\x1F\x9CV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01cW`\0\x80\xFD[P`\x01Ta\x01\x84\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01NV[4\x80\x15a\x01\xB5W`\0\x80\xFD[Pa\x01\xC9a\x01\xC46`\x04a\x1F\xD8V[a\x03\xEFV[\0[a\x01\xC9a\x01\xD96`\x04a \xEEV[a\x06\x0BV[4\x80\x15a\x01\xEAW`\0\x80\xFD[Pa\x01\xF3a\x06*V[`@Q\x90\x81R` \x01a\x01NV[4\x80\x15a\x02\rW`\0\x80\xFD[P`\0Ta\x01\x84\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81V[4\x80\x15a\x02:W`\0\x80\xFD[Pa\x01\xC9a\x06YV[4\x80\x15a\x02OW`\0\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x01\x84V[4\x80\x15a\x02\x99W`\0\x80\xFD[Pa\x01\xC9a\x02\xA86`\x04a!#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x04:WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x04WWP0;\x15[\x90P\x81\x15\x80\x15a\x04eWP\x80\x15[\x15a\x04\x9CW`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x04\xFDW\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[a\x05\x06\x87a\x11\x0CV[0`@Qa\x05\x13\x90a\x1F!V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90`\0\xF0\x80\x15\x80\x15a\x05LW=`\0\x80>=`\0\xFD[P`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x81\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x93\x84\x16\x17\x90\x91U`\x01\x80T\x90\x91\x16\x91\x88\x16\x91\x90\x91\x17\x90U\x83\x15a\x06\x02W\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPV[a\x06\x13a\x11\x1DV[a\x06\x1C\x82a\x12!V[a\x06&\x82\x82a\x12)V[PPV[`\0a\x064a\x13gV[P\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x06aa\x13\xD6V[a\x06k`\0a\x14dV[V[\x83Q`\0\x03a\x06\xDDW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x10`$\x82\x01R\x7FInvalid selector\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[\x82Q`\0\x03a\x07HW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x13`$\x82\x01R\x7FInvalid domain name\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[\x81a\x07\xAFW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FInvalid public key hash\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[a\x07\xB9\x83\x83a\x0C\x1DV[\x15a\x08 W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FpublicKeyHash is already set\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\0T`@Q\x7FB\xD7\xCB\x98\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x84\x90Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x90cB\xD7\xCB\x98\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x08\x8FW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x08\xB3\x91\x90a\"\xD6V[\x15a\t\x1AW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x18`$\x82\x01R\x7FpublicKeyHash is revoked\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\0a\t]`@Q\x80`@\x01`@R\x80`\x04\x81R` \x01\x7FSET:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x86\x86\x86a\x0B\xE3V[\x90P`\0a\tj\x82a\x14\xFAV[\x90P`\0a\tx\x82\x85a\x155V[`\x01T\x90\x91Ps\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x83\x16\x91\x16\x14a\t\xFFW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7FInvalid signature\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\0T`@Q\x7F\xC1\\\xFF\xAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x90c\xC1\\\xFF\xAB\x90a\nW\x90\x89\x90\x89\x90`\x04\x01a\"\xF8V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\nqW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\n\x85W=`\0\x80>=`\0\xFD[PPPPPPPPPPPV[a\n\x9Aa\x13\xD6V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16a\x0B\x17W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7FInvalid signer\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\x01Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x81\x16\x90\x82\x16\x03a\x0B\x9CW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0B`$\x82\x01R\x7FSame signer\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\x01\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``\x84\x84\x84a\x0B\xF1\x85a\x15_V[`@Q` \x01a\x0C\x04\x94\x93\x92\x91\x90a#\x1AV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x94\x93PPPPV[`\0\x80T`@Q\x7F\xE7\xA7\x97z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x90c\xE7\xA7\x97z\x90a\x0Cv\x90\x86\x90\x86\x90`\x04\x01a\"\xF8V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0C\x93W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0C\xB7\x91\x90a\"\xD6V[\x90P[\x92\x91PPV[a\x0C\xC8a\x13\xD6V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16a\r\x18W`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\x06\xD4V[a\r!\x81a\x14dV[PV[\x83Q`\0\x03a\r\x8FW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x10`$\x82\x01R\x7FInvalid selector\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[\x82Q`\0\x03a\r\xFAW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x13`$\x82\x01R\x7FInvalid domain name\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[\x81a\x0EaW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FInvalid public key hash\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[a\x0Ek\x83\x83a\x0C\x1DV[\x15\x15`\x01\x14a\x0E\xD6W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x18`$\x82\x01R\x7FpublicKeyHash is not set\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\0T`@Q\x7FB\xD7\xCB\x98\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x84\x90Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x90cB\xD7\xCB\x98\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0FEW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0Fi\x91\x90a\"\xD6V[\x15a\x0F\xD0W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FpublicKeyHash is already revoked`D\x82\x01R`d\x01a\x06\xD4V[`\0a\x10\x13`@Q\x80`@\x01`@R\x80`\x07\x81R` \x01\x7FREVOKE:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x86\x86\x86a\x0B\xE3V[\x90P`\0a\x10 \x82a\x14\xFAV[\x90P`\0a\x10.\x82\x85a\x155V[`\x01T\x90\x91Ps\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x83\x16\x91\x16\x14a\x10\xB5W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7FInvalid signature\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\0T`@Q\x7F\x15\xD2Q.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x87\x90Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x90c\x15\xD2Q.\x90`$\x01a\nWV[a\x11\x14a\x15vV[a\r!\x81a\x15\xDDV[0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x11\xEAWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x11\xD1\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCTs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x06kW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\r!a\x13\xD6V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12\xAEWP`@\x80Q`\x1F=\x90\x81\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x82\x01\x90\x92Ra\x12\xAB\x91\x81\x01\x90a$\x1EV[`\x01[a\x12\xFCW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16`\x04\x82\x01R`$\x01a\x06\xD4V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x13XW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\x06\xD4V[a\x13b\x83\x83a\x15\xE5V[PPPV[0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x06kW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\x14\x15\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x06kW`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\x06\xD4V[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[`\0a\x15\x06\x82Qa\x16HV[\x82`@Q` \x01a\x15\x18\x92\x91\x90a$7V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\0\x80`\0\x80a\x15E\x86\x86a\x17\x06V[\x92P\x92P\x92Pa\x15U\x82\x82a\x17SV[P\x90\x94\x93PPPPV[``a\x0C\xBA\x82a\x15n\x84a\x18WV[`\x01\x01a\x18\xC1V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16a\x06kW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0C\xC8a\x15vV[a\x15\xEE\x82a\x1A\xE7V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x16@Wa\x13b\x82\x82a\x1B\xB6V[a\x06&a\x1C9V[```\0a\x16U\x83a\x1CqV[`\x01\x01\x90P`\0\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x16uWa\x16ua \x0BV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x16\x9FW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x81\x81\x01` \x01[\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x01\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x04\x94P\x84a\x16\xA9WP\x93\x92PPPV[`\0\x80`\0\x83Q`A\x03a\x17@W` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1Aa\x172\x88\x82\x85\x85a\x1DSV[\x95P\x95P\x95PPPPa\x17LV[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15a\x17gWa\x17ga$\x92V[\x03a\x17pWPPV[`\x01\x82`\x03\x81\x11\x15a\x17\x84Wa\x17\x84a$\x92V[\x03a\x17\xBBW`@Q\x7F\xF6E\xEE\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x82`\x03\x81\x11\x15a\x17\xCFWa\x17\xCFa$\x92V[\x03a\x18\tW`@Q\x7F\xFC\xE6\x98\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\x06\xD4V[`\x03\x82`\x03\x81\x11\x15a\x18\x1DWa\x18\x1Da$\x92V[\x03a\x06&W`@Q\x7F\xD7\x8B\xCE\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\x06\xD4V[`\0\x80`\x80\x83\x90\x1C\x15a\x18oW`\x80\x92\x90\x92\x1C\x91`\x10\x01[`@\x83\x90\x1C\x15a\x18\x84W`@\x92\x90\x92\x1C\x91`\x08\x01[` \x83\x90\x1C\x15a\x18\x99W` \x92\x90\x92\x1C\x91`\x04\x01[`\x10\x83\x90\x1C\x15a\x18\xAEW`\x10\x92\x90\x92\x1C\x91`\x02\x01[`\x08\x83\x90\x1C\x15a\x0C\xBAW`\x01\x01\x92\x91PPV[``\x82`\0a\x18\xD1\x84`\x02a$\xF0V[a\x18\xDC\x90`\x02a%\x07V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x18\xF4Wa\x18\xF4a \x0BV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x19\x1EW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x7F0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81`\0\x81Q\x81\x10a\x19UWa\x19Ua%\x1AV[` \x01\x01\x90~\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16\x90\x81`\0\x1A\x90SP\x7Fx\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81`\x01\x81Q\x81\x10a\x19\xB8Wa\x19\xB8a%\x1AV[` \x01\x01\x90~\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x19\xF4\x85`\x02a$\xF0V[a\x19\xFF\x90`\x01a%\x07V[\x90P[`\x01\x81\x11\x15a\x1A\x9CW\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x83`\x0F\x16`\x10\x81\x10a\x1A@Wa\x1A@a%\x1AV[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\x1AVWa\x1AVa%\x1AV[` \x01\x01\x90~\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x92\x90\x92\x1C\x91a\x1A\x95\x81a%IV[\x90Pa\x1A\x02V[P\x81\x15a\x1A\xDFW`@Q\x7F\xE2.'\xEB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x86\x90R`$\x81\x01\x85\x90R`D\x01a\x06\xD4V[\x94\x93PPPPV[\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;`\0\x03a\x1BPW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16`\x04\x82\x01R`$\x01a\x06\xD4V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa\x1B\xE0\x91\x90a%~V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x1C\x1BW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x1C V[``\x91P[P\x91P\x91Pa\x1C0\x85\x83\x83a\x1EMV[\x95\x94PPPPPV[4\x15a\x06kW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80z\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\x1C\xBAWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x04\x92P`@\x01[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\x1C\xE6Wm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x04\x92P` \x01[f#\x86\xF2o\xC1\0\0\x83\x10a\x1D\x04Wf#\x86\xF2o\xC1\0\0\x83\x04\x92P`\x10\x01[c\x05\xF5\xE1\0\x83\x10a\x1D\x1CWc\x05\xF5\xE1\0\x83\x04\x92P`\x08\x01[a'\x10\x83\x10a\x1D0Wa'\x10\x83\x04\x92P`\x04\x01[`d\x83\x10a\x1DBW`d\x83\x04\x92P`\x02\x01[`\n\x83\x10a\x0C\xBAW`\x01\x01\x92\x91PPV[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15a\x1D\x8EWP`\0\x91P`\x03\x90P\x82a\x1ECV[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a\x1D\xE2W=`\0\x80>=`\0\xFD[PP`@Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x01Q\x91PPs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16a\x1E9WP`\0\x92P`\x01\x91P\x82\x90Pa\x1ECV[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[``\x82a\x1EbWa\x1E]\x82a\x1E\xDFV[a\x1E\xD8V[\x81Q\x15\x80\x15a\x1E\x86WPs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16;\x15[\x15a\x1E\xD5W`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x16`\x04\x82\x01R`$\x01a\x06\xD4V[P\x80[\x93\x92PPPV[\x80Q\x15a\x1E\xEFW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\xAE\x80a%\x9B\x839\x01\x90V[`\0[\x83\x81\x10\x15a\x1FIW\x81\x81\x01Q\x83\x82\x01R` \x01a\x1F1V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x1Fj\x81` \x86\x01` \x86\x01a\x1F.V[`\x1F\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0a\x0C\xB7` \x83\x01\x84a\x1FRV[\x805s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x1F\xD3W`\0\x80\xFD[\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x1F\xEBW`\0\x80\xFD[a\x1F\xF4\x83a\x1F\xAFV[\x91Pa \x02` \x84\x01a\x1F\xAFV[\x90P\x92P\x92\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`A`\x04R`$`\0\xFD[`\0\x82`\x1F\x83\x01\x12a KW`\0\x80\xFD[\x815` \x83\x01`\0\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x11\x15a lWa la \x0BV[P`@Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x85\x01\x81\x16`?\x01\x16\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a \xB9Wa \xB9a \x0BV[`@R\x83\x81R\x90P\x80\x82\x84\x01\x87\x10\x15a \xD1W`\0\x80\xFD[\x83\x83` \x83\x017`\0` \x85\x83\x01\x01R\x80\x94PPPPP\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a!\x01W`\0\x80\xFD[a!\n\x83a\x1F\xAFV[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!&W`\0\x80\xFD[a!2\x85\x82\x86\x01a :V[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\x80\x85\x87\x03\x12\x15a!RW`\0\x80\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!iW`\0\x80\xFD[a!u\x87\x82\x88\x01a :V[\x94PP` \x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\x92W`\0\x80\xFD[a!\x9E\x87\x82\x88\x01a :V[\x93PP`@\x85\x015\x91P``\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\xC2W`\0\x80\xFD[a!\xCE\x87\x82\x88\x01a :V[\x91PP\x92\x95\x91\x94P\x92PV[`\0` \x82\x84\x03\x12\x15a!\xECW`\0\x80\xFD[a\x0C\xB7\x82a\x1F\xAFV[`\0\x80`\0\x80`\x80\x85\x87\x03\x12\x15a\"\x0BW`\0\x80\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\"\"W`\0\x80\xFD[a\".\x87\x82\x88\x01a :V[\x94PP` \x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\"KW`\0\x80\xFD[a\"W\x87\x82\x88\x01a :V[\x93PP`@\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\"tW`\0\x80\xFD[a\"\x80\x87\x82\x88\x01a :V[\x94\x97\x93\x96P\x93\x94``\x015\x93PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\"\xA4W`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\"\xBBW`\0\x80\xFD[a\"\xC7\x85\x82\x86\x01a :V[\x95` \x94\x90\x94\x015\x94PPPPV[`\0` \x82\x84\x03\x12\x15a\"\xE8W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x1E\xD8W`\0\x80\xFD[`@\x81R`\0a#\x0B`@\x83\x01\x85a\x1FRV[\x90P\x82` \x83\x01R\x93\x92PPPV[`\0\x85Qa#,\x81\x84` \x8A\x01a\x1F.V[\x7Fselector=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x83\x01\x90\x81R\x85Qa#f\x81`\t\x84\x01` \x8A\x01a\x1F.V[\x7F;domain=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\t\x92\x90\x91\x01\x91\x82\x01R\x84Qa#\xA4\x81`\x11\x84\x01` \x89\x01a\x1F.V[`\t\x81\x83\x01\x01\x91PP\x7F;public_key_hash=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x08\x82\x01R\x83Qa#\xE6\x81`\x19\x84\x01` \x88\x01a\x1F.V[\x7F;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x19\x92\x90\x91\x01\x91\x82\x01R`\x1A\x01\x96\x95PPPPPPV[`\0` \x82\x84\x03\x12\x15a$0W`\0\x80\xFD[PQ\x91\x90PV[\x7F\x19Ethereum Signed Message:\n\0\0\0\0\0\0\x81R`\0\x83Qa$o\x81`\x1A\x85\x01` \x88\x01a\x1F.V[\x83Q\x90\x83\x01\x90a$\x86\x81`\x1A\x84\x01` \x88\x01a\x1F.V[\x01`\x1A\x01\x94\x93PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`!`\x04R`$`\0\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x0C\xBAWa\x0C\xBAa$\xC1V[\x80\x82\x01\x80\x82\x11\x15a\x0C\xBAWa\x0C\xBAa$\xC1V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`2`\x04R`$`\0\xFD[`\0\x81a%XWa%Xa$\xC1V[P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x01\x90V[`\0\x82Qa%\x90\x81\x84` \x87\x01a\x1F.V[\x91\x90\x91\x01\x92\x91PPV\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\t\xAE8\x03\x80a\t\xAE\x839\x81\x01`@\x81\x90Ra\0/\x91a\0\xBEV[\x80`\x01`\x01`\xA0\x1B\x03\x81\x16a\0^W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01`@Q\x80\x91\x03\x90\xFD[a\0g\x81a\0nV[PPa\0\xEEV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[`\0` \x82\x84\x03\x12\x15a\0\xD0W`\0\x80\xFD[\x81Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0\xE7W`\0\x80\xFD[\x93\x92PPPV[a\x08\xB1\x80a\0\xFD`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xA3W`\x005`\xE0\x1C\x80c\x8D\xA5\xCB[\x11a\0vW\x80c\xE7\xA7\x97z\x11a\0[W\x80c\xE7\xA7\x97z\x14a\x01vW\x80c\xF2\xFD\xE3\x8B\x14a\x01\x89W\x80c\xF4\x9E\xB1d\x14a\x01\x9CW`\0\x80\xFD[\x80c\x8D\xA5\xCB[\x14a\x01;W\x80c\xC1\\\xFF\xAB\x14a\x01cW`\0\x80\xFD[\x80c\x06\x90\xBD8\x14a\0\xA8W\x80c\x15\xD2Q.\x14a\0\xFBW\x80cB\xD7\xCB\x98\x14a\x01\x10W\x80cqP\x18\xA6\x14a\x013W[`\0\x80\xFD[a\0\xE6a\0\xB66`\x04a\x069V[\x81Q` \x81\x84\x01\x81\x01\x80Q`\x01\x82R\x92\x82\x01\x94\x82\x01\x94\x90\x94 \x91\x90\x93R\x90\x91R`\0\x90\x81R`@\x90 T`\xFF\x16\x81V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x01\x0Ea\x01\t6`\x04a\x06~V[a\x01\xAFV[\0[a\0\xE6a\x01\x1E6`\x04a\x06~V[`\x02` R`\0\x90\x81R`@\x90 T`\xFF\x16\x81V[a\x01\x0Ea\x02+V[`\0T`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\0\xF2V[a\x01\x0Ea\x01q6`\x04a\x069V[a\x02?V[a\0\xE6a\x01\x846`\x04a\x069V[a\x03YV[a\x01\x0Ea\x01\x976`\x04a\x06\x97V[a\x03\xBDV[a\x01\x0Ea\x01\xAA6`\x04a\x06\xD4V[a\x04!V[a\x01\xB7a\x04eV[`\0\x81\x81R`\x02` R`@\x90\x81\x90 \x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\x16`\x01\x17\x90UQ\x7F\xB8\x0F\xFF+Lo=\xDF\x80Hw\x92|w\xB2\xFE\x18q\xCE\xCA\xA5\xADC\xD2\xC7\xC4/As1\xF8e\x90a\x02 \x90\x83\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA1PV[a\x023a\x04eV[a\x02=`\0a\x04\xB8V[V[a\x02Ga\x04eV[`\0\x81\x81R`\x02` R`@\x90 T`\xFF\x16\x15a\x02\xC5W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7Fcannot set revoked pubkey\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[`\x01\x80\x83`@Qa\x02\xD6\x91\x90a\x07\xD7V[\x90\x81R`@\x80Q` \x92\x81\x90\x03\x83\x01\x81 `\0\x86\x81R\x93R\x91 \x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\x16\x92\x15\x15\x92\x90\x92\x17\x90\x91U\x7FQ\r\xAC\x88\xEA\xF2\xDF\xBDS\x90BA\xFC\x19\x9A\xD4k c\xE6\xBFl?\xB2\x91\xF8\xCE\x86Cf4\x19\x90a\x03M\x90\x84\x90\x84\x90a\x07\xF3V[`@Q\x80\x91\x03\x90\xA1PPV[`\0\x81\x81R`\x02` R`@\x81 T`\xFF\x16\x15a\x03xWP`\0a\x03\xB7V[`\x01\x83`@Qa\x03\x88\x91\x90a\x07\xD7V[\x90\x81R`@\x80Q` \x92\x81\x90\x03\x83\x01\x90 `\0\x85\x81R\x92R\x90 T`\xFF\x16\x15a\x03\xB3WP`\x01a\x03\xB7V[P`\0[\x92\x91PPV[a\x03\xC5a\x04eV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16a\x04\x15W`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\x02\xBCV[a\x04\x1E\x81a\x04\xB8V[PV[a\x04)a\x04eV[`\0[\x81Q\x81\x10\x15a\x04`Wa\x04X\x83\x83\x83\x81Q\x81\x10a\x04KWa\x04Ka\x08LV[` \x02` \x01\x01Qa\x02?V[`\x01\x01a\x04,V[PPPV[`\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x02=W`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\x02\xBCV[`\0\x80Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x81\x16\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`A`\x04R`$`\0\xFD[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x05\xA3Wa\x05\xA3a\x05-V[`@R\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\x05\xBCW`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x05\xD6Wa\x05\xD6a\x05-V[a\x06\x07` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x01a\x05\\V[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x06\x1CW`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x06LW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x06cW`\0\x80\xFD[a\x06o\x85\x82\x86\x01a\x05\xABV[\x95` \x94\x90\x94\x015\x94PPPPV[`\0` \x82\x84\x03\x12\x15a\x06\x90W`\0\x80\xFD[P5\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x06\xA9W`\0\x80\xFD[\x815s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x06\xCDW`\0\x80\xFD[\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x06\xE7W`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x06\xFEW`\0\x80\xFD[a\x07\n\x85\x82\x86\x01a\x05\xABV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x07'W`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x078W`\0\x80\xFD[\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x07RWa\x07Ra\x05-V[\x80`\x05\x1Ba\x07b` \x82\x01a\x05\\V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x88\x84\x11\x15a\x07~W`\0\x80\xFD[` \x85\x01\x94P[\x83\x85\x10\x15a\x07\xA4W\x845\x80\x83R` \x95\x86\x01\x95\x90\x93P\x90\x91\x01\x90a\x07\x85V[\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x07\xCEW\x81\x81\x01Q\x83\x82\x01R` \x01a\x07\xB6V[PP`\0\x91\x01RV[`\0\x82Qa\x07\xE9\x81\x84` \x87\x01a\x07\xB3V[\x91\x90\x91\x01\x92\x91PPV[`@\x81R`\0\x83Q\x80`@\x84\x01Ra\x08\x12\x81``\x85\x01` \x88\x01a\x07\xB3V[` \x83\x01\x93\x90\x93RP`\x1F\x91\x90\x91\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x01``\x01\x91\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`2`\x04R`$`\0\xFD\xFE\xA2dipfsX\"\x12 -\x9Ee\xDAg\xA8\x9E\x94XP\xBB\xE47ClV\x95\xD85 \x14\x95XA\xAAs\xAA\x1C\xC4\x15\xD3IdsolcC\0\x08\x1A\x003\xA2dipfsX\"\x12 \x0E[\xF6h\xD37\xAE[\x83m\x7F\x86So\xD0\x05\xCE\xD9Ui~\xD1\xF0\x7F\xC3\xF4C\xC1b\xFE\x136dsolcC\0\x08\x1A\x003"; - /// The bytecode of the contract. - pub static ECDSAOWNEDDKIMREGISTRY_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __BYTECODE, - ); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0\xF3W`\x005`\xE0\x1C\x80c\x97\x17\x0F+\x11a\0\x8AW\x80c\xD5\x07\xC3 \x11a\0YW\x80c\xD5\x07\xC3 \x14a\x036W\x80c\xE7\xA7\x97z\x14a\x03\x7FW\x80c\xF2\xFD\xE3\x8B\x14a\x03\xAFW\x80c\xF6\xB4\x93D\x14a\x03\xCFW`\0\x80\xFD[\x80c\x97\x17\x0F+\x14a\x02\x8DW\x80c\xAA\xD2\xB7#\x14a\x02\xADW\x80c\xAD<\xB1\xCC\x14a\x02\xCDW\x80c\xAE\xC7\x93a\x14a\x03\x16W`\0\x80\xFD[\x80cR\xD1\x90-\x11a\0\xC6W\x80cR\xD1\x90-\x14a\x01\xDEW\x80cd#\xF1\xE2\x14a\x02\x01W\x80cqP\x18\xA6\x14a\x02.W\x80c\x8D\xA5\xCB[\x14a\x02CW`\0\x80\xFD[\x80c\x07\xF1\xEA\xF5\x14a\0\xF8W\x80c#\x8A\xC93\x14a\x01WW\x80cH\\\xC9U\x14a\x01\xA9W\x80cO\x1E\xF2\x86\x14a\x01\xCBW[`\0\x80\xFD[4\x80\x15a\x01\x04W`\0\x80\xFD[Pa\x01A`@Q\x80`@\x01`@R\x80`\x04\x81R` \x01\x7FSET:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x81V[`@Qa\x01N\x91\x90a\x1F\x9CV[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01cW`\0\x80\xFD[P`\x01Ta\x01\x84\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01NV[4\x80\x15a\x01\xB5W`\0\x80\xFD[Pa\x01\xC9a\x01\xC46`\x04a\x1F\xD8V[a\x03\xEFV[\0[a\x01\xC9a\x01\xD96`\x04a \xEEV[a\x06\x0BV[4\x80\x15a\x01\xEAW`\0\x80\xFD[Pa\x01\xF3a\x06*V[`@Q\x90\x81R` \x01a\x01NV[4\x80\x15a\x02\rW`\0\x80\xFD[P`\0Ta\x01\x84\x90s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x81V[4\x80\x15a\x02:W`\0\x80\xFD[Pa\x01\xC9a\x06YV[4\x80\x15a\x02OW`\0\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x01\x84V[4\x80\x15a\x02\x99W`\0\x80\xFD[Pa\x01\xC9a\x02\xA86`\x04a!#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x04:WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x04WWP0;\x15[\x90P\x81\x15\x80\x15a\x04eWP\x80\x15[\x15a\x04\x9CW`@Q\x7F\xF9.\xE8\xA9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\x16`\x01\x17\x85U\x83\x15a\x04\xFDW\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16h\x01\0\0\0\0\0\0\0\0\x17\x85U[a\x05\x06\x87a\x11\x0CV[0`@Qa\x05\x13\x90a\x1F!V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90`\0\xF0\x80\x15\x80\x15a\x05LW=`\0\x80>=`\0\xFD[P`\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x81\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x93\x84\x16\x17\x90\x91U`\x01\x80T\x90\x91\x16\x91\x88\x16\x91\x90\x91\x17\x90U\x83\x15a\x06\x02W\x84T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPV[a\x06\x13a\x11\x1DV[a\x06\x1C\x82a\x12!V[a\x06&\x82\x82a\x12)V[PPV[`\0a\x064a\x13gV[P\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x90V[a\x06aa\x13\xD6V[a\x06k`\0a\x14dV[V[\x83Q`\0\x03a\x06\xDDW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x10`$\x82\x01R\x7FInvalid selector\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[\x82Q`\0\x03a\x07HW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x13`$\x82\x01R\x7FInvalid domain name\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[\x81a\x07\xAFW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FInvalid public key hash\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[a\x07\xB9\x83\x83a\x0C\x1DV[\x15a\x08 W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FpublicKeyHash is already set\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\0T`@Q\x7FB\xD7\xCB\x98\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x84\x90Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x90cB\xD7\xCB\x98\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x08\x8FW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x08\xB3\x91\x90a\"\xD6V[\x15a\t\x1AW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x18`$\x82\x01R\x7FpublicKeyHash is revoked\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\0a\t]`@Q\x80`@\x01`@R\x80`\x04\x81R` \x01\x7FSET:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x86\x86\x86a\x0B\xE3V[\x90P`\0a\tj\x82a\x14\xFAV[\x90P`\0a\tx\x82\x85a\x155V[`\x01T\x90\x91Ps\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x83\x16\x91\x16\x14a\t\xFFW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7FInvalid signature\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\0T`@Q\x7F\xC1\\\xFF\xAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x90c\xC1\\\xFF\xAB\x90a\nW\x90\x89\x90\x89\x90`\x04\x01a\"\xF8V[`\0`@Q\x80\x83\x03\x81`\0\x87\x80;\x15\x80\x15a\nqW`\0\x80\xFD[PZ\xF1\x15\x80\x15a\n\x85W=`\0\x80>=`\0\xFD[PPPPPPPPPPPV[a\n\x9Aa\x13\xD6V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16a\x0B\x17W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0E`$\x82\x01R\x7FInvalid signer\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\x01Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x81\x16\x90\x82\x16\x03a\x0B\x9CW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x0B`$\x82\x01R\x7FSame signer\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\x01\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``\x84\x84\x84a\x0B\xF1\x85a\x15_V[`@Q` \x01a\x0C\x04\x94\x93\x92\x91\x90a#\x1AV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x94\x93PPPPV[`\0\x80T`@Q\x7F\xE7\xA7\x97z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x90c\xE7\xA7\x97z\x90a\x0Cv\x90\x86\x90\x86\x90`\x04\x01a\"\xF8V[` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0C\x93W=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0C\xB7\x91\x90a\"\xD6V[\x90P[\x92\x91PPV[a\x0C\xC8a\x13\xD6V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16a\r\x18W`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\x06\xD4V[a\r!\x81a\x14dV[PV[\x83Q`\0\x03a\r\x8FW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x10`$\x82\x01R\x7FInvalid selector\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[\x82Q`\0\x03a\r\xFAW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x13`$\x82\x01R\x7FInvalid domain name\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[\x81a\x0EaW`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FInvalid public key hash\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[a\x0Ek\x83\x83a\x0C\x1DV[\x15\x15`\x01\x14a\x0E\xD6W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x18`$\x82\x01R\x7FpublicKeyHash is not set\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\0T`@Q\x7FB\xD7\xCB\x98\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x84\x90Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x90cB\xD7\xCB\x98\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x0FEW=`\0\x80>=`\0\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0Fi\x91\x90a\"\xD6V[\x15a\x0F\xD0W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01\x81\x90R`$\x82\x01R\x7FpublicKeyHash is already revoked`D\x82\x01R`d\x01a\x06\xD4V[`\0a\x10\x13`@Q\x80`@\x01`@R\x80`\x07\x81R` \x01\x7FREVOKE:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81RP\x86\x86\x86a\x0B\xE3V[\x90P`\0a\x10 \x82a\x14\xFAV[\x90P`\0a\x10.\x82\x85a\x155V[`\x01T\x90\x91Ps\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x83\x16\x91\x16\x14a\x10\xB5W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x11`$\x82\x01R\x7FInvalid signature\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xD4V[`\0T`@Q\x7F\x15\xD2Q.\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x87\x90Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x90c\x15\xD2Q.\x90`$\x01a\nWV[a\x11\x14a\x15vV[a\r!\x81a\x15\xDDV[0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\x11\xEAWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16a\x11\xD1\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCTs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14\x15[\x15a\x06kW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\r!a\x13\xD6V[\x81s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12\xAEWP`@\x80Q`\x1F=\x90\x81\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x82\x01\x90\x92Ra\x12\xAB\x91\x81\x01\x90a$\x1EV[`\x01[a\x12\xFCW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16`\x04\x82\x01R`$\x01a\x06\xD4V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81\x14a\x13XW`@Q\x7F\xAA\x1DI\xA4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\x06\xD4V[a\x13b\x83\x83a\x15\xE5V[PPPV[0s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x06kW`@Q\x7F\xE0|\x8D\xBA\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\x14\x15\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90V[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x14a\x06kW`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\x06\xD4V[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[`\0a\x15\x06\x82Qa\x16HV[\x82`@Q` \x01a\x15\x18\x92\x91\x90a$7V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[`\0\x80`\0\x80a\x15E\x86\x86a\x17\x06V[\x92P\x92P\x92Pa\x15U\x82\x82a\x17SV[P\x90\x94\x93PPPPV[``a\x0C\xBA\x82a\x15n\x84a\x18WV[`\x01\x01a\x18\xC1V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16a\x06kW`@Q\x7F\xD7\xE6\xBC\xF8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0C\xC8a\x15vV[a\x15\xEE\x82a\x1A\xE7V[`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x16@Wa\x13b\x82\x82a\x1B\xB6V[a\x06&a\x1C9V[```\0a\x16U\x83a\x1CqV[`\x01\x01\x90P`\0\x81g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x16uWa\x16ua \x0BV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x16\x9FW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x81\x81\x01` \x01[\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x01\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\n\x86\x06\x1A\x81S`\n\x85\x04\x94P\x84a\x16\xA9WP\x93\x92PPPV[`\0\x80`\0\x83Q`A\x03a\x17@W` \x84\x01Q`@\x85\x01Q``\x86\x01Q`\0\x1Aa\x172\x88\x82\x85\x85a\x1DSV[\x95P\x95P\x95PPPPa\x17LV[PP\x81Q`\0\x91P`\x02\x90[\x92P\x92P\x92V[`\0\x82`\x03\x81\x11\x15a\x17gWa\x17ga$\x92V[\x03a\x17pWPPV[`\x01\x82`\x03\x81\x11\x15a\x17\x84Wa\x17\x84a$\x92V[\x03a\x17\xBBW`@Q\x7F\xF6E\xEE\xDF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x82`\x03\x81\x11\x15a\x17\xCFWa\x17\xCFa$\x92V[\x03a\x18\tW`@Q\x7F\xFC\xE6\x98\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\x06\xD4V[`\x03\x82`\x03\x81\x11\x15a\x18\x1DWa\x18\x1Da$\x92V[\x03a\x06&W`@Q\x7F\xD7\x8B\xCE\x0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x82\x90R`$\x01a\x06\xD4V[`\0\x80`\x80\x83\x90\x1C\x15a\x18oW`\x80\x92\x90\x92\x1C\x91`\x10\x01[`@\x83\x90\x1C\x15a\x18\x84W`@\x92\x90\x92\x1C\x91`\x08\x01[` \x83\x90\x1C\x15a\x18\x99W` \x92\x90\x92\x1C\x91`\x04\x01[`\x10\x83\x90\x1C\x15a\x18\xAEW`\x10\x92\x90\x92\x1C\x91`\x02\x01[`\x08\x83\x90\x1C\x15a\x0C\xBAW`\x01\x01\x92\x91PPV[``\x82`\0a\x18\xD1\x84`\x02a$\xF0V[a\x18\xDC\x90`\x02a%\x07V[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x18\xF4Wa\x18\xF4a \x0BV[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a\x19\x1EW` \x82\x01\x81\x806\x837\x01\x90P[P\x90P\x7F0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81`\0\x81Q\x81\x10a\x19UWa\x19Ua%\x1AV[` \x01\x01\x90~\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16\x90\x81`\0\x1A\x90SP\x7Fx\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81`\x01\x81Q\x81\x10a\x19\xB8Wa\x19\xB8a%\x1AV[` \x01\x01\x90~\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16\x90\x81`\0\x1A\x90SP`\0a\x19\xF4\x85`\x02a$\xF0V[a\x19\xFF\x90`\x01a%\x07V[\x90P[`\x01\x81\x11\x15a\x1A\x9CW\x7F0123456789abcdef\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x83`\x0F\x16`\x10\x81\x10a\x1A@Wa\x1A@a%\x1AV[\x1A`\xF8\x1B\x82\x82\x81Q\x81\x10a\x1AVWa\x1AVa%\x1AV[` \x01\x01\x90~\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16\x90\x81`\0\x1A\x90SP`\x04\x92\x90\x92\x1C\x91a\x1A\x95\x81a%IV[\x90Pa\x1A\x02V[P\x81\x15a\x1A\xDFW`@Q\x7F\xE2.'\xEB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x81\x01\x86\x90R`$\x81\x01\x85\x90R`D\x01a\x06\xD4V[\x94\x93PPPPV[\x80s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16;`\0\x03a\x1BPW`@Q\x7FL\x9C\x8C\xE3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16`\x04\x82\x01R`$\x01a\x06\xD4V[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x84`@Qa\x1B\xE0\x91\x90a%~V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x1C\x1BW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x1C V[``\x91P[P\x91P\x91Pa\x1C0\x85\x83\x83a\x1EMV[\x95\x94PPPPPV[4\x15a\x06kW`@Q\x7F\xB3\x98\x97\x9F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x80z\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x10a\x1C\xBAWz\x18O\x03\xE9?\xF9\xF4\xDA\xA7\x97\xEDn8\xEDd\xBFj\x1F\x01\0\0\0\0\0\0\0\0\x83\x04\x92P`@\x01[m\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x10a\x1C\xE6Wm\x04\xEE-mA[\x85\xAC\xEF\x81\0\0\0\0\x83\x04\x92P` \x01[f#\x86\xF2o\xC1\0\0\x83\x10a\x1D\x04Wf#\x86\xF2o\xC1\0\0\x83\x04\x92P`\x10\x01[c\x05\xF5\xE1\0\x83\x10a\x1D\x1CWc\x05\xF5\xE1\0\x83\x04\x92P`\x08\x01[a'\x10\x83\x10a\x1D0Wa'\x10\x83\x04\x92P`\x04\x01[`d\x83\x10a\x1DBW`d\x83\x04\x92P`\x02\x01[`\n\x83\x10a\x0C\xBAW`\x01\x01\x92\x91PPV[`\0\x80\x80\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF]WnsW\xA4P\x1D\xDF\xE9/Fh\x1B \xA0\x84\x11\x15a\x1D\x8EWP`\0\x91P`\x03\x90P\x82a\x1ECV[`@\x80Q`\0\x80\x82R` \x82\x01\x80\x84R\x8A\x90R`\xFF\x89\x16\x92\x82\x01\x92\x90\x92R``\x81\x01\x87\x90R`\x80\x81\x01\x86\x90R`\x01\x90`\xA0\x01` `@Q` \x81\x03\x90\x80\x84\x03\x90\x85Z\xFA\x15\x80\x15a\x1D\xE2W=`\0\x80>=`\0\xFD[PP`@Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x01Q\x91PPs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16a\x1E9WP`\0\x92P`\x01\x91P\x82\x90Pa\x1ECV[\x92P`\0\x91P\x81\x90P[\x94P\x94P\x94\x91PPV[``\x82a\x1EbWa\x1E]\x82a\x1E\xDFV[a\x1E\xD8V[\x81Q\x15\x80\x15a\x1E\x86WPs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x16;\x15[\x15a\x1E\xD5W`@Q\x7F\x99\x96\xB3\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81Rs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x85\x16`\x04\x82\x01R`$\x01a\x06\xD4V[P\x80[\x93\x92PPPV[\x80Q\x15a\x1E\xEFW\x80Q\x80\x82` \x01\xFD[`@Q\x7F\x14%\xEAB\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\xAE\x80a%\x9B\x839\x01\x90V[`\0[\x83\x81\x10\x15a\x1FIW\x81\x81\x01Q\x83\x82\x01R` \x01a\x1F1V[PP`\0\x91\x01RV[`\0\x81Q\x80\x84Ra\x1Fj\x81` \x86\x01` \x86\x01a\x1F.V[`\x1F\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x92\x90\x92\x01` \x01\x92\x91PPV[` \x81R`\0a\x0C\xB7` \x83\x01\x84a\x1FRV[\x805s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x1F\xD3W`\0\x80\xFD[\x91\x90PV[`\0\x80`@\x83\x85\x03\x12\x15a\x1F\xEBW`\0\x80\xFD[a\x1F\xF4\x83a\x1F\xAFV[\x91Pa \x02` \x84\x01a\x1F\xAFV[\x90P\x92P\x92\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`A`\x04R`$`\0\xFD[`\0\x82`\x1F\x83\x01\x12a KW`\0\x80\xFD[\x815` \x83\x01`\0\x80g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x84\x11\x15a lWa la \x0BV[P`@Q\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x85\x01\x81\x16`?\x01\x16\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a \xB9Wa \xB9a \x0BV[`@R\x83\x81R\x90P\x80\x82\x84\x01\x87\x10\x15a \xD1W`\0\x80\xFD[\x83\x83` \x83\x017`\0` \x85\x83\x01\x01R\x80\x94PPPPP\x92\x91PPV[`\0\x80`@\x83\x85\x03\x12\x15a!\x01W`\0\x80\xFD[a!\n\x83a\x1F\xAFV[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!&W`\0\x80\xFD[a!2\x85\x82\x86\x01a :V[\x91PP\x92P\x92\x90PV[`\0\x80`\0\x80`\x80\x85\x87\x03\x12\x15a!RW`\0\x80\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!iW`\0\x80\xFD[a!u\x87\x82\x88\x01a :V[\x94PP` \x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\x92W`\0\x80\xFD[a!\x9E\x87\x82\x88\x01a :V[\x93PP`@\x85\x015\x91P``\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a!\xC2W`\0\x80\xFD[a!\xCE\x87\x82\x88\x01a :V[\x91PP\x92\x95\x91\x94P\x92PV[`\0` \x82\x84\x03\x12\x15a!\xECW`\0\x80\xFD[a\x0C\xB7\x82a\x1F\xAFV[`\0\x80`\0\x80`\x80\x85\x87\x03\x12\x15a\"\x0BW`\0\x80\xFD[\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\"\"W`\0\x80\xFD[a\".\x87\x82\x88\x01a :V[\x94PP` \x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\"KW`\0\x80\xFD[a\"W\x87\x82\x88\x01a :V[\x93PP`@\x85\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\"tW`\0\x80\xFD[a\"\x80\x87\x82\x88\x01a :V[\x94\x97\x93\x96P\x93\x94``\x015\x93PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\"\xA4W`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\"\xBBW`\0\x80\xFD[a\"\xC7\x85\x82\x86\x01a :V[\x95` \x94\x90\x94\x015\x94PPPPV[`\0` \x82\x84\x03\x12\x15a\"\xE8W`\0\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x1E\xD8W`\0\x80\xFD[`@\x81R`\0a#\x0B`@\x83\x01\x85a\x1FRV[\x90P\x82` \x83\x01R\x93\x92PPPV[`\0\x85Qa#,\x81\x84` \x8A\x01a\x1F.V[\x7Fselector=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x83\x01\x90\x81R\x85Qa#f\x81`\t\x84\x01` \x8A\x01a\x1F.V[\x7F;domain=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\t\x92\x90\x91\x01\x91\x82\x01R\x84Qa#\xA4\x81`\x11\x84\x01` \x89\x01a\x1F.V[`\t\x81\x83\x01\x01\x91PP\x7F;public_key_hash=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x08\x82\x01R\x83Qa#\xE6\x81`\x19\x84\x01` \x88\x01a\x1F.V[\x7F;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x19\x92\x90\x91\x01\x91\x82\x01R`\x1A\x01\x96\x95PPPPPPV[`\0` \x82\x84\x03\x12\x15a$0W`\0\x80\xFD[PQ\x91\x90PV[\x7F\x19Ethereum Signed Message:\n\0\0\0\0\0\0\x81R`\0\x83Qa$o\x81`\x1A\x85\x01` \x88\x01a\x1F.V[\x83Q\x90\x83\x01\x90a$\x86\x81`\x1A\x84\x01` \x88\x01a\x1F.V[\x01`\x1A\x01\x94\x93PPPPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`!`\x04R`$`\0\xFD[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`\x11`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\x0C\xBAWa\x0C\xBAa$\xC1V[\x80\x82\x01\x80\x82\x11\x15a\x0C\xBAWa\x0C\xBAa$\xC1V[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`2`\x04R`$`\0\xFD[`\0\x81a%XWa%Xa$\xC1V[P\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x01\x90V[`\0\x82Qa%\x90\x81\x84` \x87\x01a\x1F.V[\x91\x90\x91\x01\x92\x91PPV\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`@Qa\t\xAE8\x03\x80a\t\xAE\x839\x81\x01`@\x81\x90Ra\0/\x91a\0\xBEV[\x80`\x01`\x01`\xA0\x1B\x03\x81\x16a\0^W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01`@Q\x80\x91\x03\x90\xFD[a\0g\x81a\0nV[PPa\0\xEEV[`\0\x80T`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x01`\x01`\xA0\x1B\x03\x19\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[`\0` \x82\x84\x03\x12\x15a\0\xD0W`\0\x80\xFD[\x81Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\0\xE7W`\0\x80\xFD[\x93\x92PPPV[a\x08\xB1\x80a\0\xFD`\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0\xA3W`\x005`\xE0\x1C\x80c\x8D\xA5\xCB[\x11a\0vW\x80c\xE7\xA7\x97z\x11a\0[W\x80c\xE7\xA7\x97z\x14a\x01vW\x80c\xF2\xFD\xE3\x8B\x14a\x01\x89W\x80c\xF4\x9E\xB1d\x14a\x01\x9CW`\0\x80\xFD[\x80c\x8D\xA5\xCB[\x14a\x01;W\x80c\xC1\\\xFF\xAB\x14a\x01cW`\0\x80\xFD[\x80c\x06\x90\xBD8\x14a\0\xA8W\x80c\x15\xD2Q.\x14a\0\xFBW\x80cB\xD7\xCB\x98\x14a\x01\x10W\x80cqP\x18\xA6\x14a\x013W[`\0\x80\xFD[a\0\xE6a\0\xB66`\x04a\x069V[\x81Q` \x81\x84\x01\x81\x01\x80Q`\x01\x82R\x92\x82\x01\x94\x82\x01\x94\x90\x94 \x91\x90\x93R\x90\x91R`\0\x90\x81R`@\x90 T`\xFF\x16\x81V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\x01\x0Ea\x01\t6`\x04a\x06~V[a\x01\xAFV[\0[a\0\xE6a\x01\x1E6`\x04a\x06~V[`\x02` R`\0\x90\x81R`@\x90 T`\xFF\x16\x81V[a\x01\x0Ea\x02+V[`\0T`@Qs\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\0\xF2V[a\x01\x0Ea\x01q6`\x04a\x069V[a\x02?V[a\0\xE6a\x01\x846`\x04a\x069V[a\x03YV[a\x01\x0Ea\x01\x976`\x04a\x06\x97V[a\x03\xBDV[a\x01\x0Ea\x01\xAA6`\x04a\x06\xD4V[a\x04!V[a\x01\xB7a\x04eV[`\0\x81\x81R`\x02` R`@\x90\x81\x90 \x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\x16`\x01\x17\x90UQ\x7F\xB8\x0F\xFF+Lo=\xDF\x80Hw\x92|w\xB2\xFE\x18q\xCE\xCA\xA5\xADC\xD2\xC7\xC4/As1\xF8e\x90a\x02 \x90\x83\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA1PV[a\x023a\x04eV[a\x02=`\0a\x04\xB8V[V[a\x02Ga\x04eV[`\0\x81\x81R`\x02` R`@\x90 T`\xFF\x16\x15a\x02\xC5W`@Q\x7F\x08\xC3y\xA0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7Fcannot set revoked pubkey\0\0\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[`\x01\x80\x83`@Qa\x02\xD6\x91\x90a\x07\xD7V[\x90\x81R`@\x80Q` \x92\x81\x90\x03\x83\x01\x81 `\0\x86\x81R\x93R\x91 \x80T\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\x16\x92\x15\x15\x92\x90\x92\x17\x90\x91U\x7FQ\r\xAC\x88\xEA\xF2\xDF\xBDS\x90BA\xFC\x19\x9A\xD4k c\xE6\xBFl?\xB2\x91\xF8\xCE\x86Cf4\x19\x90a\x03M\x90\x84\x90\x84\x90a\x07\xF3V[`@Q\x80\x91\x03\x90\xA1PPV[`\0\x81\x81R`\x02` R`@\x81 T`\xFF\x16\x15a\x03xWP`\0a\x03\xB7V[`\x01\x83`@Qa\x03\x88\x91\x90a\x07\xD7V[\x90\x81R`@\x80Q` \x92\x81\x90\x03\x83\x01\x90 `\0\x85\x81R\x92R\x90 T`\xFF\x16\x15a\x03\xB3WP`\x01a\x03\xB7V[P`\0[\x92\x91PPV[a\x03\xC5a\x04eV[s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16a\x04\x15W`@Q\x7F\x1EO\xBD\xF7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R`\0`\x04\x82\x01R`$\x01a\x02\xBCV[a\x04\x1E\x81a\x04\xB8V[PV[a\x04)a\x04eV[`\0[\x81Q\x81\x10\x15a\x04`Wa\x04X\x83\x83\x83\x81Q\x81\x10a\x04KWa\x04Ka\x08LV[` \x02` \x01\x01Qa\x02?V[`\x01\x01a\x04,V[PPPV[`\0Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x163\x14a\x02=W`@Q\x7F\x11\x8C\xDA\xA7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81R3`\x04\x82\x01R`$\x01a\x02\xBCV[`\0\x80Ts\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x81\x16\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x83\x16\x81\x17\x84U`@Q\x91\x90\x92\x16\x92\x83\x91\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x91\x90\xA3PPV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`A`\x04R`$`\0\xFD[`@Q`\x1F\x82\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\x05\xA3Wa\x05\xA3a\x05-V[`@R\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\x05\xBCW`\0\x80\xFD[\x815g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x05\xD6Wa\x05\xD6a\x05-V[a\x06\x07` \x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0`\x1F\x84\x01\x16\x01a\x05\\V[\x81\x81R\x84` \x83\x86\x01\x01\x11\x15a\x06\x1CW`\0\x80\xFD[\x81` \x85\x01` \x83\x017`\0\x91\x81\x01` \x01\x91\x90\x91R\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x06LW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x06cW`\0\x80\xFD[a\x06o\x85\x82\x86\x01a\x05\xABV[\x95` \x94\x90\x94\x015\x94PPPPV[`\0` \x82\x84\x03\x12\x15a\x06\x90W`\0\x80\xFD[P5\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\x06\xA9W`\0\x80\xFD[\x815s\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x06\xCDW`\0\x80\xFD[\x93\x92PPPV[`\0\x80`@\x83\x85\x03\x12\x15a\x06\xE7W`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x06\xFEW`\0\x80\xFD[a\x07\n\x85\x82\x86\x01a\x05\xABV[\x92PP` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x07'W`\0\x80\xFD[\x83\x01`\x1F\x81\x01\x85\x13a\x078W`\0\x80\xFD[\x805g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x15a\x07RWa\x07Ra\x05-V[\x80`\x05\x1Ba\x07b` \x82\x01a\x05\\V[\x91\x82R` \x81\x84\x01\x81\x01\x92\x90\x81\x01\x90\x88\x84\x11\x15a\x07~W`\0\x80\xFD[` \x85\x01\x94P[\x83\x85\x10\x15a\x07\xA4W\x845\x80\x83R` \x95\x86\x01\x95\x90\x93P\x90\x91\x01\x90a\x07\x85V[\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x07\xCEW\x81\x81\x01Q\x83\x82\x01R` \x01a\x07\xB6V[PP`\0\x91\x01RV[`\0\x82Qa\x07\xE9\x81\x84` \x87\x01a\x07\xB3V[\x91\x90\x91\x01\x92\x91PPV[`@\x81R`\0\x83Q\x80`@\x84\x01Ra\x08\x12\x81``\x85\x01` \x88\x01a\x07\xB3V[` \x83\x01\x93\x90\x93RP`\x1F\x91\x90\x91\x01\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE0\x16\x01``\x01\x91\x90PV[\x7FNH{q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0R`2`\x04R`$`\0\xFD\xFE\xA2dipfsX\"\x12 -\x9Ee\xDAg\xA8\x9E\x94XP\xBB\xE47ClV\x95\xD85 \x14\x95XA\xAAs\xAA\x1C\xC4\x15\xD3IdsolcC\0\x08\x1A\x003\xA2dipfsX\"\x12 \x0E[\xF6h\xD37\xAE[\x83m\x7F\x86So\xD0\x05\xCE\xD9Ui~\xD1\xF0\x7F\xC3\xF4C\xC1b\xFE\x136dsolcC\0\x08\x1A\x003"; - /// The deployed bytecode of the contract. - pub static ECDSAOWNEDDKIMREGISTRY_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( - __DEPLOYED_BYTECODE, - ); - pub struct ECDSAOwnedDKIMRegistry(::ethers::contract::Contract); - impl ::core::clone::Clone for ECDSAOwnedDKIMRegistry { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for ECDSAOwnedDKIMRegistry { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for ECDSAOwnedDKIMRegistry { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for ECDSAOwnedDKIMRegistry { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(ECDSAOwnedDKIMRegistry)) - .field(&self.address()) - .finish() - } - } - impl ECDSAOwnedDKIMRegistry { - /// Creates a new contract instance with the specified `ethers` client at - /// `address`. The contract derefs to a `ethers::Contract` object. - pub fn new>( - address: T, - client: ::std::sync::Arc, - ) -> Self { - Self( - ::ethers::contract::Contract::new( - address.into(), - ECDSAOWNEDDKIMREGISTRY_ABI.clone(), - client, - ), - ) - } - /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. - /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction - /// - /// Notes: - /// - If there are no constructor arguments, you should pass `()` as the argument. - /// - The default poll duration is 7 seconds. - /// - The default number of confirmations is 1 block. - /// - /// - /// # Example - /// - /// Generate contract bindings with `abigen!` and deploy a new contract instance. - /// - /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. - /// - /// ```ignore - /// # async fn deploy(client: ::std::sync::Arc) { - /// abigen!(Greeter, "../greeter.json"); - /// - /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); - /// let msg = greeter_contract.greet().call().await.unwrap(); - /// # } - /// ``` - pub fn deploy( - client: ::std::sync::Arc, - constructor_args: T, - ) -> ::core::result::Result< - ::ethers::contract::builders::ContractDeployer, - ::ethers::contract::ContractError, - > { - let factory = ::ethers::contract::ContractFactory::new( - ECDSAOWNEDDKIMREGISTRY_ABI.clone(), - ECDSAOWNEDDKIMREGISTRY_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `REVOKE_PREFIX` (0xd507c320) function - pub fn revoke_prefix( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([213, 7, 195, 32], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `SET_PREFIX` (0x07f1eaf5) function - pub fn set_prefix( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([7, 241, 234, 245], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `UPGRADE_INTERFACE_VERSION` (0xad3cb1cc) function - pub fn upgrade_interface_version( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([173, 60, 177, 204], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `changeSigner` (0xaad2b723) function - pub fn change_signer( - &self, - new_signer: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([170, 210, 183, 35], new_signer) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `computeSignedMsg` (0xaec79361) function - pub fn compute_signed_msg( - &self, - prefix: ::std::string::String, - selector: ::std::string::String, - domain_name: ::std::string::String, - public_key_hash: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash( - [174, 199, 147, 97], - (prefix, selector, domain_name, public_key_hash), - ) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `dkimRegistry` (0x6423f1e2) function - pub fn dkim_registry( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([100, 35, 241, 226], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `initialize` (0x485cc955) function - pub fn initialize( - &self, - initial_owner: ::ethers::core::types::Address, - signer: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([72, 92, 201, 85], (initial_owner, signer)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `isDKIMPublicKeyHashValid` (0xe7a7977a) function - pub fn is_dkim_public_key_hash_valid( - &self, - domain_name: ::std::string::String, - public_key_hash: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([231, 167, 151, 122], (domain_name, public_key_hash)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `owner` (0x8da5cb5b) function - pub fn owner( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([141, 165, 203, 91], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proxiableUUID` (0x52d1902d) function - pub fn proxiable_uuid( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([82, 209, 144, 45], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `renounceOwnership` (0x715018a6) function - pub fn renounce_ownership( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([113, 80, 24, 166], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `revokeDKIMPublicKeyHash` (0xf6b49344) function - pub fn revoke_dkim_public_key_hash( - &self, - selector: ::std::string::String, - domain_name: ::std::string::String, - public_key_hash: [u8; 32], - signature: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash( - [246, 180, 147, 68], - (selector, domain_name, public_key_hash, signature), - ) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `setDKIMPublicKeyHash` (0x97170f2b) function - pub fn set_dkim_public_key_hash( - &self, - selector: ::std::string::String, - domain_name: ::std::string::String, - public_key_hash: [u8; 32], - signature: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash( - [151, 23, 15, 43], - (selector, domain_name, public_key_hash, signature), - ) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `signer` (0x238ac933) function - pub fn signer( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([35, 138, 201, 51], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `transferOwnership` (0xf2fde38b) function - pub fn transfer_ownership( - &self, - new_owner: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([242, 253, 227, 139], new_owner) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `upgradeToAndCall` (0x4f1ef286) function - pub fn upgrade_to_and_call( - &self, - new_implementation: ::ethers::core::types::Address, - data: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([79, 30, 242, 134], (new_implementation, data)) - .expect("method not found (this should never happen)") - } - ///Gets the contract's `Initialized` event - pub fn initialized_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - InitializedFilter, - > { - self.0.event() - } - ///Gets the contract's `OwnershipTransferred` event - pub fn ownership_transferred_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - OwnershipTransferredFilter, - > { - self.0.event() - } - ///Gets the contract's `Upgraded` event - pub fn upgraded_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - UpgradedFilter, - > { - self.0.event() - } - /// Returns an `Event` builder for all the events of this contract. - pub fn events( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - ECDSAOwnedDKIMRegistryEvents, - > { - self.0.event_with_filter(::core::default::Default::default()) - } - } - impl From<::ethers::contract::Contract> - for ECDSAOwnedDKIMRegistry { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `AddressEmptyCode` with signature `AddressEmptyCode(address)` and selector `0x9996b315` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "AddressEmptyCode", abi = "AddressEmptyCode(address)")] - pub struct AddressEmptyCode { - pub target: ::ethers::core::types::Address, - } - ///Custom Error type `ECDSAInvalidSignature` with signature `ECDSAInvalidSignature()` and selector `0xf645eedf` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "ECDSAInvalidSignature", abi = "ECDSAInvalidSignature()")] - pub struct ECDSAInvalidSignature; - ///Custom Error type `ECDSAInvalidSignatureLength` with signature `ECDSAInvalidSignatureLength(uint256)` and selector `0xfce698f7` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror( - name = "ECDSAInvalidSignatureLength", - abi = "ECDSAInvalidSignatureLength(uint256)" - )] - pub struct ECDSAInvalidSignatureLength { - pub length: ::ethers::core::types::U256, - } - ///Custom Error type `ECDSAInvalidSignatureS` with signature `ECDSAInvalidSignatureS(bytes32)` and selector `0xd78bce0c` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "ECDSAInvalidSignatureS", abi = "ECDSAInvalidSignatureS(bytes32)")] - pub struct ECDSAInvalidSignatureS { - pub s: [u8; 32], - } - ///Custom Error type `ERC1967InvalidImplementation` with signature `ERC1967InvalidImplementation(address)` and selector `0x4c9c8ce3` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror( - name = "ERC1967InvalidImplementation", - abi = "ERC1967InvalidImplementation(address)" - )] - pub struct ERC1967InvalidImplementation { - pub implementation: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1967NonPayable` with signature `ERC1967NonPayable()` and selector `0xb398979f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "ERC1967NonPayable", abi = "ERC1967NonPayable()")] - pub struct ERC1967NonPayable; - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; - ///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "InvalidInitialization", abi = "InvalidInitialization()")] - pub struct InvalidInitialization; - ///Custom Error type `NotInitializing` with signature `NotInitializing()` and selector `0xd7e6bcf8` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "NotInitializing", abi = "NotInitializing()")] - pub struct NotInitializing; - ///Custom Error type `OwnableInvalidOwner` with signature `OwnableInvalidOwner(address)` and selector `0x1e4fbdf7` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "OwnableInvalidOwner", abi = "OwnableInvalidOwner(address)")] - pub struct OwnableInvalidOwner { - pub owner: ::ethers::core::types::Address, - } - ///Custom Error type `OwnableUnauthorizedAccount` with signature `OwnableUnauthorizedAccount(address)` and selector `0x118cdaa7` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror( - name = "OwnableUnauthorizedAccount", - abi = "OwnableUnauthorizedAccount(address)" - )] - pub struct OwnableUnauthorizedAccount { - pub account: ::ethers::core::types::Address, - } - ///Custom Error type `StringsInsufficientHexLength` with signature `StringsInsufficientHexLength(uint256,uint256)` and selector `0xe22e27eb` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror( - name = "StringsInsufficientHexLength", - abi = "StringsInsufficientHexLength(uint256,uint256)" - )] - pub struct StringsInsufficientHexLength { - pub value: ::ethers::core::types::U256, - pub length: ::ethers::core::types::U256, - } - ///Custom Error type `UUPSUnauthorizedCallContext` with signature `UUPSUnauthorizedCallContext()` and selector `0xe07c8dba` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror( - name = "UUPSUnauthorizedCallContext", - abi = "UUPSUnauthorizedCallContext()" - )] - pub struct UUPSUnauthorizedCallContext; - ///Custom Error type `UUPSUnsupportedProxiableUUID` with signature `UUPSUnsupportedProxiableUUID(bytes32)` and selector `0xaa1d49a4` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror( - name = "UUPSUnsupportedProxiableUUID", - abi = "UUPSUnsupportedProxiableUUID(bytes32)" - )] - pub struct UUPSUnsupportedProxiableUUID { - pub slot: [u8; 32], - } - ///Container type for all of the contract's custom errors - #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] - pub enum ECDSAOwnedDKIMRegistryErrors { - AddressEmptyCode(AddressEmptyCode), - ECDSAInvalidSignature(ECDSAInvalidSignature), - ECDSAInvalidSignatureLength(ECDSAInvalidSignatureLength), - ECDSAInvalidSignatureS(ECDSAInvalidSignatureS), - ERC1967InvalidImplementation(ERC1967InvalidImplementation), - ERC1967NonPayable(ERC1967NonPayable), - FailedInnerCall(FailedInnerCall), - InvalidInitialization(InvalidInitialization), - NotInitializing(NotInitializing), - OwnableInvalidOwner(OwnableInvalidOwner), - OwnableUnauthorizedAccount(OwnableUnauthorizedAccount), - StringsInsufficientHexLength(StringsInsufficientHexLength), - UUPSUnauthorizedCallContext(UUPSUnauthorizedCallContext), - UUPSUnsupportedProxiableUUID(UUPSUnsupportedProxiableUUID), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for ECDSAOwnedDKIMRegistryErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = <::std::string::String as ::ethers::core::abi::AbiDecode>::decode( - data, - ) { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::AddressEmptyCode(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ECDSAInvalidSignature(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ECDSAInvalidSignatureLength(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ECDSAInvalidSignatureS(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ERC1967InvalidImplementation(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ERC1967NonPayable(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::FailedInnerCall(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::InvalidInitialization(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::NotInitializing(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::OwnableInvalidOwner(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::OwnableUnauthorizedAccount(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::StringsInsufficientHexLength(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UUPSUnauthorizedCallContext(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UUPSUnsupportedProxiableUUID(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for ECDSAOwnedDKIMRegistryErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::AddressEmptyCode(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ECDSAInvalidSignature(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ECDSAInvalidSignatureLength(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ECDSAInvalidSignatureS(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1967InvalidImplementation(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1967NonPayable(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::FailedInnerCall(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::InvalidInitialization(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::NotInitializing(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::OwnableInvalidOwner(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::OwnableUnauthorizedAccount(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::StringsInsufficientHexLength(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UUPSUnauthorizedCallContext(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UUPSUnsupportedProxiableUUID(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for ECDSAOwnedDKIMRegistryErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for ECDSAOwnedDKIMRegistryErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AddressEmptyCode(element) => ::core::fmt::Display::fmt(element, f), - Self::ECDSAInvalidSignature(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ECDSAInvalidSignatureLength(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ECDSAInvalidSignatureS(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ERC1967InvalidImplementation(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), - Self::InvalidInitialization(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), - Self::OwnableInvalidOwner(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::OwnableUnauthorizedAccount(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::StringsInsufficientHexLength(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UUPSUnauthorizedCallContext(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UUPSUnsupportedProxiableUUID(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for ECDSAOwnedDKIMRegistryErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryErrors { - fn from(value: AddressEmptyCode) -> Self { - Self::AddressEmptyCode(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryErrors { - fn from(value: ECDSAInvalidSignature) -> Self { - Self::ECDSAInvalidSignature(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryErrors { - fn from(value: ECDSAInvalidSignatureLength) -> Self { - Self::ECDSAInvalidSignatureLength(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryErrors { - fn from(value: ECDSAInvalidSignatureS) -> Self { - Self::ECDSAInvalidSignatureS(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryErrors { - fn from(value: ERC1967InvalidImplementation) -> Self { - Self::ERC1967InvalidImplementation(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryErrors { - fn from(value: ERC1967NonPayable) -> Self { - Self::ERC1967NonPayable(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryErrors { - fn from(value: InvalidInitialization) -> Self { - Self::InvalidInitialization(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryErrors { - fn from(value: NotInitializing) -> Self { - Self::NotInitializing(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryErrors { - fn from(value: OwnableInvalidOwner) -> Self { - Self::OwnableInvalidOwner(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryErrors { - fn from(value: OwnableUnauthorizedAccount) -> Self { - Self::OwnableUnauthorizedAccount(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryErrors { - fn from(value: StringsInsufficientHexLength) -> Self { - Self::StringsInsufficientHexLength(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryErrors { - fn from(value: UUPSUnauthorizedCallContext) -> Self { - Self::UUPSUnauthorizedCallContext(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryErrors { - fn from(value: UUPSUnsupportedProxiableUUID) -> Self { - Self::UUPSUnsupportedProxiableUUID(value) - } - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "Initialized", abi = "Initialized(uint64)")] - pub struct InitializedFilter { - pub version: u64, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent( - name = "OwnershipTransferred", - abi = "OwnershipTransferred(address,address)" - )] - pub struct OwnershipTransferredFilter { - #[ethevent(indexed)] - pub previous_owner: ::ethers::core::types::Address, - #[ethevent(indexed)] - pub new_owner: ::ethers::core::types::Address, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] - pub struct UpgradedFilter { - #[ethevent(indexed)] - pub implementation: ::ethers::core::types::Address, - } - ///Container type for all of the contract's events - #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] - pub enum ECDSAOwnedDKIMRegistryEvents { - InitializedFilter(InitializedFilter), - OwnershipTransferredFilter(OwnershipTransferredFilter), - UpgradedFilter(UpgradedFilter), - } - impl ::ethers::contract::EthLogDecode for ECDSAOwnedDKIMRegistryEvents { - fn decode_log( - log: &::ethers::core::abi::RawLog, - ) -> ::core::result::Result { - if let Ok(decoded) = InitializedFilter::decode_log(log) { - return Ok(ECDSAOwnedDKIMRegistryEvents::InitializedFilter(decoded)); - } - if let Ok(decoded) = OwnershipTransferredFilter::decode_log(log) { - return Ok( - ECDSAOwnedDKIMRegistryEvents::OwnershipTransferredFilter(decoded), - ); - } - if let Ok(decoded) = UpgradedFilter::decode_log(log) { - return Ok(ECDSAOwnedDKIMRegistryEvents::UpgradedFilter(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData) - } - } - impl ::core::fmt::Display for ECDSAOwnedDKIMRegistryEvents { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::OwnershipTransferredFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryEvents { - fn from(value: InitializedFilter) -> Self { - Self::InitializedFilter(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryEvents { - fn from(value: OwnershipTransferredFilter) -> Self { - Self::OwnershipTransferredFilter(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryEvents { - fn from(value: UpgradedFilter) -> Self { - Self::UpgradedFilter(value) - } - } - ///Container type for all input parameters for the `REVOKE_PREFIX` function with signature `REVOKE_PREFIX()` and selector `0xd507c320` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "REVOKE_PREFIX", abi = "REVOKE_PREFIX()")] - pub struct RevokePrefixCall; - ///Container type for all input parameters for the `SET_PREFIX` function with signature `SET_PREFIX()` and selector `0x07f1eaf5` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "SET_PREFIX", abi = "SET_PREFIX()")] - pub struct SetPrefixCall; - ///Container type for all input parameters for the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "UPGRADE_INTERFACE_VERSION", abi = "UPGRADE_INTERFACE_VERSION()")] - pub struct UpgradeInterfaceVersionCall; - ///Container type for all input parameters for the `changeSigner` function with signature `changeSigner(address)` and selector `0xaad2b723` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "changeSigner", abi = "changeSigner(address)")] - pub struct ChangeSignerCall { - pub new_signer: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `computeSignedMsg` function with signature `computeSignedMsg(string,string,string,bytes32)` and selector `0xaec79361` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "computeSignedMsg", - abi = "computeSignedMsg(string,string,string,bytes32)" - )] - pub struct ComputeSignedMsgCall { - pub prefix: ::std::string::String, - pub selector: ::std::string::String, - pub domain_name: ::std::string::String, - pub public_key_hash: [u8; 32], - } - ///Container type for all input parameters for the `dkimRegistry` function with signature `dkimRegistry()` and selector `0x6423f1e2` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "dkimRegistry", abi = "dkimRegistry()")] - pub struct DkimRegistryCall; - ///Container type for all input parameters for the `initialize` function with signature `initialize(address,address)` and selector `0x485cc955` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "initialize", abi = "initialize(address,address)")] - pub struct InitializeCall { - pub initial_owner: ::ethers::core::types::Address, - pub signer: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `isDKIMPublicKeyHashValid` function with signature `isDKIMPublicKeyHashValid(string,bytes32)` and selector `0xe7a7977a` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "isDKIMPublicKeyHashValid", - abi = "isDKIMPublicKeyHashValid(string,bytes32)" - )] - pub struct IsDKIMPublicKeyHashValidCall { - pub domain_name: ::std::string::String, - pub public_key_hash: [u8; 32], - } - ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "owner", abi = "owner()")] - pub struct OwnerCall; - ///Container type for all input parameters for the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "proxiableUUID", abi = "proxiableUUID()")] - pub struct ProxiableUUIDCall; - ///Container type for all input parameters for the `renounceOwnership` function with signature `renounceOwnership()` and selector `0x715018a6` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "renounceOwnership", abi = "renounceOwnership()")] - pub struct RenounceOwnershipCall; - ///Container type for all input parameters for the `revokeDKIMPublicKeyHash` function with signature `revokeDKIMPublicKeyHash(string,string,bytes32,bytes)` and selector `0xf6b49344` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "revokeDKIMPublicKeyHash", - abi = "revokeDKIMPublicKeyHash(string,string,bytes32,bytes)" - )] - pub struct RevokeDKIMPublicKeyHashCall { - pub selector: ::std::string::String, - pub domain_name: ::std::string::String, - pub public_key_hash: [u8; 32], - pub signature: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `setDKIMPublicKeyHash` function with signature `setDKIMPublicKeyHash(string,string,bytes32,bytes)` and selector `0x97170f2b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "setDKIMPublicKeyHash", - abi = "setDKIMPublicKeyHash(string,string,bytes32,bytes)" - )] - pub struct SetDKIMPublicKeyHashCall { - pub selector: ::std::string::String, - pub domain_name: ::std::string::String, - pub public_key_hash: [u8; 32], - pub signature: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `signer` function with signature `signer()` and selector `0x238ac933` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "signer", abi = "signer()")] - pub struct SignerCall; - ///Container type for all input parameters for the `transferOwnership` function with signature `transferOwnership(address)` and selector `0xf2fde38b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "transferOwnership", abi = "transferOwnership(address)")] - pub struct TransferOwnershipCall { - pub new_owner: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `upgradeToAndCall` function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "upgradeToAndCall", abi = "upgradeToAndCall(address,bytes)")] - pub struct UpgradeToAndCallCall { - pub new_implementation: ::ethers::core::types::Address, - pub data: ::ethers::core::types::Bytes, - } - ///Container type for all of the contract's call - #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] - pub enum ECDSAOwnedDKIMRegistryCalls { - RevokePrefix(RevokePrefixCall), - SetPrefix(SetPrefixCall), - UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), - ChangeSigner(ChangeSignerCall), - ComputeSignedMsg(ComputeSignedMsgCall), - DkimRegistry(DkimRegistryCall), - Initialize(InitializeCall), - IsDKIMPublicKeyHashValid(IsDKIMPublicKeyHashValidCall), - Owner(OwnerCall), - ProxiableUUID(ProxiableUUIDCall), - RenounceOwnership(RenounceOwnershipCall), - RevokeDKIMPublicKeyHash(RevokeDKIMPublicKeyHashCall), - SetDKIMPublicKeyHash(SetDKIMPublicKeyHashCall), - Signer(SignerCall), - TransferOwnership(TransferOwnershipCall), - UpgradeToAndCall(UpgradeToAndCallCall), - } - impl ::ethers::core::abi::AbiDecode for ECDSAOwnedDKIMRegistryCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::RevokePrefix(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::SetPrefix(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UpgradeInterfaceVersion(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ChangeSigner(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ComputeSignedMsg(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::DkimRegistry(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::Initialize(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::IsDKIMPublicKeyHashValid(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::Owner(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ProxiableUUID(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::RenounceOwnership(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::RevokeDKIMPublicKeyHash(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::SetDKIMPublicKeyHash(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::Signer(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::TransferOwnership(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UpgradeToAndCall(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for ECDSAOwnedDKIMRegistryCalls { - fn encode(self) -> Vec { - match self { - Self::RevokePrefix(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::SetPrefix(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UpgradeInterfaceVersion(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ChangeSigner(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ComputeSignedMsg(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::DkimRegistry(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Initialize(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::IsDKIMPublicKeyHashValid(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ProxiableUUID(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RenounceOwnership(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevokeDKIMPublicKeyHash(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::SetDKIMPublicKeyHash(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Signer(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::TransferOwnership(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UpgradeToAndCall(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - } - } - } - impl ::core::fmt::Display for ECDSAOwnedDKIMRegistryCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::RevokePrefix(element) => ::core::fmt::Display::fmt(element, f), - Self::SetPrefix(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradeInterfaceVersion(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ChangeSigner(element) => ::core::fmt::Display::fmt(element, f), - Self::ComputeSignedMsg(element) => ::core::fmt::Display::fmt(element, f), - Self::DkimRegistry(element) => ::core::fmt::Display::fmt(element, f), - Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), - Self::IsDKIMPublicKeyHashValid(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::Owner(element) => ::core::fmt::Display::fmt(element, f), - Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f), - Self::RenounceOwnership(element) => ::core::fmt::Display::fmt(element, f), - Self::RevokeDKIMPublicKeyHash(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::SetDKIMPublicKeyHash(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::Signer(element) => ::core::fmt::Display::fmt(element, f), - Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: RevokePrefixCall) -> Self { - Self::RevokePrefix(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: SetPrefixCall) -> Self { - Self::SetPrefix(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryCalls { - fn from(value: UpgradeInterfaceVersionCall) -> Self { - Self::UpgradeInterfaceVersion(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: ChangeSignerCall) -> Self { - Self::ChangeSigner(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: ComputeSignedMsgCall) -> Self { - Self::ComputeSignedMsg(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: DkimRegistryCall) -> Self { - Self::DkimRegistry(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: InitializeCall) -> Self { - Self::Initialize(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryCalls { - fn from(value: IsDKIMPublicKeyHashValidCall) -> Self { - Self::IsDKIMPublicKeyHashValid(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: OwnerCall) -> Self { - Self::Owner(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: ProxiableUUIDCall) -> Self { - Self::ProxiableUUID(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: RenounceOwnershipCall) -> Self { - Self::RenounceOwnership(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryCalls { - fn from(value: RevokeDKIMPublicKeyHashCall) -> Self { - Self::RevokeDKIMPublicKeyHash(value) - } - } - impl ::core::convert::From - for ECDSAOwnedDKIMRegistryCalls { - fn from(value: SetDKIMPublicKeyHashCall) -> Self { - Self::SetDKIMPublicKeyHash(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: SignerCall) -> Self { - Self::Signer(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: TransferOwnershipCall) -> Self { - Self::TransferOwnership(value) - } - } - impl ::core::convert::From for ECDSAOwnedDKIMRegistryCalls { - fn from(value: UpgradeToAndCallCall) -> Self { - Self::UpgradeToAndCall(value) - } - } - ///Container type for all return fields from the `REVOKE_PREFIX` function with signature `REVOKE_PREFIX()` and selector `0xd507c320` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct RevokePrefixReturn(pub ::std::string::String); - ///Container type for all return fields from the `SET_PREFIX` function with signature `SET_PREFIX()` and selector `0x07f1eaf5` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct SetPrefixReturn(pub ::std::string::String); - ///Container type for all return fields from the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); - ///Container type for all return fields from the `computeSignedMsg` function with signature `computeSignedMsg(string,string,string,bytes32)` and selector `0xaec79361` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ComputeSignedMsgReturn(pub ::std::string::String); - ///Container type for all return fields from the `dkimRegistry` function with signature `dkimRegistry()` and selector `0x6423f1e2` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct DkimRegistryReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `isDKIMPublicKeyHashValid` function with signature `isDKIMPublicKeyHashValid(string,bytes32)` and selector `0xe7a7977a` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct IsDKIMPublicKeyHashValidReturn(pub bool); - ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct OwnerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ProxiableUUIDReturn(pub [u8; 32]); - ///Container type for all return fields from the `signer` function with signature `signer()` and selector `0x238ac933` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct SignerReturn(pub ::ethers::core::types::Address); -} diff --git a/packages/relayer/src/abis/email_account_recovery.rs b/packages/relayer/src/abis/email_account_recovery.rs deleted file mode 100644 index 72cf8eb6..00000000 --- a/packages/relayer/src/abis/email_account_recovery.rs +++ /dev/null @@ -1,1588 +0,0 @@ -pub use email_account_recovery::*; -/// This module was auto-generated with ethers-rs Abigen. -/// More information at: -#[allow( - clippy::enum_variant_names, - clippy::too_many_arguments, - clippy::upper_case_acronyms, - clippy::type_complexity, - dead_code, - non_camel_case_types, -)] -pub mod email_account_recovery { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("acceptanceCommandTemplates"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "acceptanceCommandTemplates", - ), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::String, - ), - ), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string[][]"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("completeRecovery"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("completeRecovery"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("completeCalldata"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("computeAcceptanceTemplateId"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "computeAcceptanceTemplateId", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("computeEmailAuthAddress"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "computeEmailAuthAddress", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("recoveredAccount"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("accountSalt"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("computeRecoveryTemplateId"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "computeRecoveryTemplateId", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("dkim"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("dkim"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("dkimAddr"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("dkimAddr"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("emailAuthImplementation"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "emailAuthImplementation", - ), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("emailAuthImplementationAddr"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "emailAuthImplementationAddr", - ), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned( - "extractRecoveredAccountFromAcceptanceCommand", - ), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "extractRecoveredAccountFromAcceptanceCommand", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("commandParams"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes[]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned( - "extractRecoveredAccountFromRecoveryCommand", - ), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "extractRecoveredAccountFromRecoveryCommand", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("commandParams"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes[]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("handleAcceptance"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("handleAcceptance"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("emailAuthMsg"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple( - ::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), - ), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Tuple( - ::std::vec![ - ::ethers::core::abi::ethabi::ParamType::String, - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::String, - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::Bool, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ], - ), - ], - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct EmailAuthMsg"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("handleRecovery"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("handleRecovery"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("emailAuthMsg"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple( - ::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), - ), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Tuple( - ::std::vec![ - ::ethers::core::abi::ethabi::ParamType::String, - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::String, - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::Bool, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ], - ), - ], - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct EmailAuthMsg"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("templateIdx"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("isActivated"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("isActivated"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("recoveredAccount"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("recoveryCommandTemplates"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "recoveryCommandTemplates", - ), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::String, - ), - ), - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string[][]"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("verifier"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifier"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("verifierAddr"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifierAddr"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::std::collections::BTreeMap::new(), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static EMAILACCOUNTRECOVERY_ABI: ::ethers::contract::Lazy< - ::ethers::core::abi::Abi, - > = ::ethers::contract::Lazy::new(__abi); - pub struct EmailAccountRecovery(::ethers::contract::Contract); - impl ::core::clone::Clone for EmailAccountRecovery { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for EmailAccountRecovery { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for EmailAccountRecovery { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for EmailAccountRecovery { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(EmailAccountRecovery)) - .field(&self.address()) - .finish() - } - } - impl EmailAccountRecovery { - /// Creates a new contract instance with the specified `ethers` client at - /// `address`. The contract derefs to a `ethers::Contract` object. - pub fn new>( - address: T, - client: ::std::sync::Arc, - ) -> Self { - Self( - ::ethers::contract::Contract::new( - address.into(), - EMAILACCOUNTRECOVERY_ABI.clone(), - client, - ), - ) - } - ///Calls the contract's `acceptanceCommandTemplates` (0x222f6cb5) function - pub fn acceptance_command_templates( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, - > { - self.0 - .method_hash([34, 47, 108, 181], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `completeRecovery` (0xc18d09cf) function - pub fn complete_recovery( - &self, - account: ::ethers::core::types::Address, - complete_calldata: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([193, 141, 9, 207], (account, complete_calldata)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `computeAcceptanceTemplateId` (0x32ccc2f2) function - pub fn compute_acceptance_template_id( - &self, - template_idx: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([50, 204, 194, 242], template_idx) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `computeEmailAuthAddress` (0x3a8eab14) function - pub fn compute_email_auth_address( - &self, - recovered_account: ::ethers::core::types::Address, - account_salt: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([58, 142, 171, 20], (recovered_account, account_salt)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `computeRecoveryTemplateId` (0x6da99515) function - pub fn compute_recovery_template_id( - &self, - template_idx: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([109, 169, 149, 21], template_idx) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `dkim` (0x400ad5ce) function - pub fn dkim( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([64, 10, 213, 206], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `dkimAddr` (0x73357f85) function - pub fn dkim_addr( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([115, 53, 127, 133], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `emailAuthImplementation` (0xb6201692) function - pub fn email_auth_implementation( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([182, 32, 22, 146], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `emailAuthImplementationAddr` (0x1098e02e) function - pub fn email_auth_implementation_addr( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([16, 152, 224, 46], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `extractRecoveredAccountFromAcceptanceCommand` (0x2c4ce129) function - pub fn extract_recovered_account_from_acceptance_command( - &self, - command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - template_idx: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([44, 76, 225, 41], (command_params, template_idx)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `extractRecoveredAccountFromRecoveryCommand` (0xa5e3ee70) function - pub fn extract_recovered_account_from_recovery_command( - &self, - command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - template_idx: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([165, 227, 238, 112], (command_params, template_idx)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `handleAcceptance` (0x0481af67) function - pub fn handle_acceptance( - &self, - email_auth_msg: EmailAuthMsg, - template_idx: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([4, 129, 175, 103], (email_auth_msg, template_idx)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `handleRecovery` (0xb68126fa) function - pub fn handle_recovery( - &self, - email_auth_msg: EmailAuthMsg, - template_idx: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([182, 129, 38, 250], (email_auth_msg, template_idx)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `isActivated` (0xc9faa7c5) function - pub fn is_activated( - &self, - recovered_account: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([201, 250, 167, 197], recovered_account) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `recoveryCommandTemplates` (0x3ef01b8f) function - pub fn recovery_command_templates( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, - > { - self.0 - .method_hash([62, 240, 27, 143], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifier` (0x2b7ac3f3) function - pub fn verifier( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([43, 122, 195, 243], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifierAddr` (0x663ea2e2) function - pub fn verifier_addr( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([102, 62, 162, 226], ()) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for EmailAccountRecovery { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Container type for all input parameters for the `acceptanceCommandTemplates` function with signature `acceptanceCommandTemplates()` and selector `0x222f6cb5` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "acceptanceCommandTemplates", abi = "acceptanceCommandTemplates()")] - pub struct AcceptanceCommandTemplatesCall; - ///Container type for all input parameters for the `completeRecovery` function with signature `completeRecovery(address,bytes)` and selector `0xc18d09cf` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "completeRecovery", abi = "completeRecovery(address,bytes)")] - pub struct CompleteRecoveryCall { - pub account: ::ethers::core::types::Address, - pub complete_calldata: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `computeAcceptanceTemplateId` function with signature `computeAcceptanceTemplateId(uint256)` and selector `0x32ccc2f2` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "computeAcceptanceTemplateId", - abi = "computeAcceptanceTemplateId(uint256)" - )] - pub struct ComputeAcceptanceTemplateIdCall { - pub template_idx: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `computeEmailAuthAddress` function with signature `computeEmailAuthAddress(address,bytes32)` and selector `0x3a8eab14` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "computeEmailAuthAddress", - abi = "computeEmailAuthAddress(address,bytes32)" - )] - pub struct ComputeEmailAuthAddressCall { - pub recovered_account: ::ethers::core::types::Address, - pub account_salt: [u8; 32], - } - ///Container type for all input parameters for the `computeRecoveryTemplateId` function with signature `computeRecoveryTemplateId(uint256)` and selector `0x6da99515` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "computeRecoveryTemplateId", - abi = "computeRecoveryTemplateId(uint256)" - )] - pub struct ComputeRecoveryTemplateIdCall { - pub template_idx: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `dkim` function with signature `dkim()` and selector `0x400ad5ce` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "dkim", abi = "dkim()")] - pub struct DkimCall; - ///Container type for all input parameters for the `dkimAddr` function with signature `dkimAddr()` and selector `0x73357f85` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "dkimAddr", abi = "dkimAddr()")] - pub struct DkimAddrCall; - ///Container type for all input parameters for the `emailAuthImplementation` function with signature `emailAuthImplementation()` and selector `0xb6201692` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "emailAuthImplementation", abi = "emailAuthImplementation()")] - pub struct EmailAuthImplementationCall; - ///Container type for all input parameters for the `emailAuthImplementationAddr` function with signature `emailAuthImplementationAddr()` and selector `0x1098e02e` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "emailAuthImplementationAddr", - abi = "emailAuthImplementationAddr()" - )] - pub struct EmailAuthImplementationAddrCall; - ///Container type for all input parameters for the `extractRecoveredAccountFromAcceptanceCommand` function with signature `extractRecoveredAccountFromAcceptanceCommand(bytes[],uint256)` and selector `0x2c4ce129` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "extractRecoveredAccountFromAcceptanceCommand", - abi = "extractRecoveredAccountFromAcceptanceCommand(bytes[],uint256)" - )] - pub struct ExtractRecoveredAccountFromAcceptanceCommandCall { - pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub template_idx: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `extractRecoveredAccountFromRecoveryCommand` function with signature `extractRecoveredAccountFromRecoveryCommand(bytes[],uint256)` and selector `0xa5e3ee70` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "extractRecoveredAccountFromRecoveryCommand", - abi = "extractRecoveredAccountFromRecoveryCommand(bytes[],uint256)" - )] - pub struct ExtractRecoveredAccountFromRecoveryCommandCall { - pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub template_idx: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `handleAcceptance` function with signature `handleAcceptance((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0x0481af67` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "handleAcceptance", - abi = "handleAcceptance((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)" - )] - pub struct HandleAcceptanceCall { - pub email_auth_msg: EmailAuthMsg, - pub template_idx: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `handleRecovery` function with signature `handleRecovery((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)` and selector `0xb68126fa` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "handleRecovery", - abi = "handleRecovery((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),uint256)" - )] - pub struct HandleRecoveryCall { - pub email_auth_msg: EmailAuthMsg, - pub template_idx: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `isActivated` function with signature `isActivated(address)` and selector `0xc9faa7c5` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "isActivated", abi = "isActivated(address)")] - pub struct IsActivatedCall { - pub recovered_account: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `recoveryCommandTemplates` function with signature `recoveryCommandTemplates()` and selector `0x3ef01b8f` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "recoveryCommandTemplates", abi = "recoveryCommandTemplates()")] - pub struct RecoveryCommandTemplatesCall; - ///Container type for all input parameters for the `verifier` function with signature `verifier()` and selector `0x2b7ac3f3` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "verifier", abi = "verifier()")] - pub struct VerifierCall; - ///Container type for all input parameters for the `verifierAddr` function with signature `verifierAddr()` and selector `0x663ea2e2` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "verifierAddr", abi = "verifierAddr()")] - pub struct VerifierAddrCall; - ///Container type for all of the contract's call - #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] - pub enum EmailAccountRecoveryCalls { - AcceptanceCommandTemplates(AcceptanceCommandTemplatesCall), - CompleteRecovery(CompleteRecoveryCall), - ComputeAcceptanceTemplateId(ComputeAcceptanceTemplateIdCall), - ComputeEmailAuthAddress(ComputeEmailAuthAddressCall), - ComputeRecoveryTemplateId(ComputeRecoveryTemplateIdCall), - Dkim(DkimCall), - DkimAddr(DkimAddrCall), - EmailAuthImplementation(EmailAuthImplementationCall), - EmailAuthImplementationAddr(EmailAuthImplementationAddrCall), - ExtractRecoveredAccountFromAcceptanceCommand( - ExtractRecoveredAccountFromAcceptanceCommandCall, - ), - ExtractRecoveredAccountFromRecoveryCommand( - ExtractRecoveredAccountFromRecoveryCommandCall, - ), - HandleAcceptance(HandleAcceptanceCall), - HandleRecovery(HandleRecoveryCall), - IsActivated(IsActivatedCall), - RecoveryCommandTemplates(RecoveryCommandTemplatesCall), - Verifier(VerifierCall), - VerifierAddr(VerifierAddrCall), - } - impl ::ethers::core::abi::AbiDecode for EmailAccountRecoveryCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::AcceptanceCommandTemplates(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::CompleteRecovery(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ComputeAcceptanceTemplateId(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ComputeEmailAuthAddress(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ComputeRecoveryTemplateId(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::Dkim(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::DkimAddr(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::EmailAuthImplementation(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::EmailAuthImplementationAddr(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ExtractRecoveredAccountFromAcceptanceCommand(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ExtractRecoveredAccountFromRecoveryCommand(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::HandleAcceptance(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::HandleRecovery(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::IsActivated(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::RecoveryCommandTemplates(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::Verifier(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::VerifierAddr(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for EmailAccountRecoveryCalls { - fn encode(self) -> Vec { - match self { - Self::AcceptanceCommandTemplates(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::CompleteRecovery(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ComputeAcceptanceTemplateId(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ComputeEmailAuthAddress(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ComputeRecoveryTemplateId(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Dkim(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::DkimAddr(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::EmailAuthImplementation(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::EmailAuthImplementationAddr(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ExtractRecoveredAccountFromAcceptanceCommand(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ExtractRecoveredAccountFromRecoveryCommand(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::HandleAcceptance(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::HandleRecovery(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::IsActivated(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RecoveryCommandTemplates(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Verifier(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::VerifierAddr(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - } - } - } - impl ::core::fmt::Display for EmailAccountRecoveryCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AcceptanceCommandTemplates(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::CompleteRecovery(element) => ::core::fmt::Display::fmt(element, f), - Self::ComputeAcceptanceTemplateId(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ComputeEmailAuthAddress(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ComputeRecoveryTemplateId(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::Dkim(element) => ::core::fmt::Display::fmt(element, f), - Self::DkimAddr(element) => ::core::fmt::Display::fmt(element, f), - Self::EmailAuthImplementation(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::EmailAuthImplementationAddr(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ExtractRecoveredAccountFromAcceptanceCommand(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ExtractRecoveredAccountFromRecoveryCommand(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::HandleAcceptance(element) => ::core::fmt::Display::fmt(element, f), - Self::HandleRecovery(element) => ::core::fmt::Display::fmt(element, f), - Self::IsActivated(element) => ::core::fmt::Display::fmt(element, f), - Self::RecoveryCommandTemplates(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::Verifier(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifierAddr(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From - for EmailAccountRecoveryCalls { - fn from(value: AcceptanceCommandTemplatesCall) -> Self { - Self::AcceptanceCommandTemplates(value) - } - } - impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: CompleteRecoveryCall) -> Self { - Self::CompleteRecovery(value) - } - } - impl ::core::convert::From - for EmailAccountRecoveryCalls { - fn from(value: ComputeAcceptanceTemplateIdCall) -> Self { - Self::ComputeAcceptanceTemplateId(value) - } - } - impl ::core::convert::From - for EmailAccountRecoveryCalls { - fn from(value: ComputeEmailAuthAddressCall) -> Self { - Self::ComputeEmailAuthAddress(value) - } - } - impl ::core::convert::From - for EmailAccountRecoveryCalls { - fn from(value: ComputeRecoveryTemplateIdCall) -> Self { - Self::ComputeRecoveryTemplateId(value) - } - } - impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: DkimCall) -> Self { - Self::Dkim(value) - } - } - impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: DkimAddrCall) -> Self { - Self::DkimAddr(value) - } - } - impl ::core::convert::From - for EmailAccountRecoveryCalls { - fn from(value: EmailAuthImplementationCall) -> Self { - Self::EmailAuthImplementation(value) - } - } - impl ::core::convert::From - for EmailAccountRecoveryCalls { - fn from(value: EmailAuthImplementationAddrCall) -> Self { - Self::EmailAuthImplementationAddr(value) - } - } - impl ::core::convert::From - for EmailAccountRecoveryCalls { - fn from(value: ExtractRecoveredAccountFromAcceptanceCommandCall) -> Self { - Self::ExtractRecoveredAccountFromAcceptanceCommand(value) - } - } - impl ::core::convert::From - for EmailAccountRecoveryCalls { - fn from(value: ExtractRecoveredAccountFromRecoveryCommandCall) -> Self { - Self::ExtractRecoveredAccountFromRecoveryCommand(value) - } - } - impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: HandleAcceptanceCall) -> Self { - Self::HandleAcceptance(value) - } - } - impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: HandleRecoveryCall) -> Self { - Self::HandleRecovery(value) - } - } - impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: IsActivatedCall) -> Self { - Self::IsActivated(value) - } - } - impl ::core::convert::From - for EmailAccountRecoveryCalls { - fn from(value: RecoveryCommandTemplatesCall) -> Self { - Self::RecoveryCommandTemplates(value) - } - } - impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: VerifierCall) -> Self { - Self::Verifier(value) - } - } - impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: VerifierAddrCall) -> Self { - Self::VerifierAddr(value) - } - } - ///Container type for all return fields from the `acceptanceCommandTemplates` function with signature `acceptanceCommandTemplates()` and selector `0x222f6cb5` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct AcceptanceCommandTemplatesReturn( - pub ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, - ); - ///Container type for all return fields from the `computeAcceptanceTemplateId` function with signature `computeAcceptanceTemplateId(uint256)` and selector `0x32ccc2f2` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ComputeAcceptanceTemplateIdReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `computeEmailAuthAddress` function with signature `computeEmailAuthAddress(address,bytes32)` and selector `0x3a8eab14` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ComputeEmailAuthAddressReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `computeRecoveryTemplateId` function with signature `computeRecoveryTemplateId(uint256)` and selector `0x6da99515` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ComputeRecoveryTemplateIdReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `dkim` function with signature `dkim()` and selector `0x400ad5ce` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct DkimReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `dkimAddr` function with signature `dkimAddr()` and selector `0x73357f85` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct DkimAddrReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `emailAuthImplementation` function with signature `emailAuthImplementation()` and selector `0xb6201692` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct EmailAuthImplementationReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `emailAuthImplementationAddr` function with signature `emailAuthImplementationAddr()` and selector `0x1098e02e` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct EmailAuthImplementationAddrReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `extractRecoveredAccountFromAcceptanceCommand` function with signature `extractRecoveredAccountFromAcceptanceCommand(bytes[],uint256)` and selector `0x2c4ce129` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ExtractRecoveredAccountFromAcceptanceCommandReturn( - pub ::ethers::core::types::Address, - ); - ///Container type for all return fields from the `extractRecoveredAccountFromRecoveryCommand` function with signature `extractRecoveredAccountFromRecoveryCommand(bytes[],uint256)` and selector `0xa5e3ee70` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ExtractRecoveredAccountFromRecoveryCommandReturn( - pub ::ethers::core::types::Address, - ); - ///Container type for all return fields from the `isActivated` function with signature `isActivated(address)` and selector `0xc9faa7c5` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct IsActivatedReturn(pub bool); - ///Container type for all return fields from the `recoveryCommandTemplates` function with signature `recoveryCommandTemplates()` and selector `0x3ef01b8f` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct RecoveryCommandTemplatesReturn( - pub ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, - ); - ///Container type for all return fields from the `verifier` function with signature `verifier()` and selector `0x2b7ac3f3` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct VerifierReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `verifierAddr` function with signature `verifierAddr()` and selector `0x663ea2e2` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct VerifierAddrReturn(pub ::ethers::core::types::Address); - ///`EmailAuthMsg(uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct EmailAuthMsg { - pub template_id: ::ethers::core::types::U256, - pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub skipped_command_prefix: ::ethers::core::types::U256, - pub proof: EmailProof, - } - ///`EmailProof(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct EmailProof { - pub domain_name: ::std::string::String, - pub public_key_hash: [u8; 32], - pub timestamp: ::ethers::core::types::U256, - pub masked_command: ::std::string::String, - pub email_nullifier: [u8; 32], - pub account_salt: [u8; 32], - pub is_code_exist: bool, - pub proof: ::ethers::core::types::Bytes, - } -} diff --git a/packages/relayer/src/abis/email_auth.rs b/packages/relayer/src/abis/email_auth.rs deleted file mode 100644 index 01764e80..00000000 --- a/packages/relayer/src/abis/email_auth.rs +++ /dev/null @@ -1,3055 +0,0 @@ -pub use email_auth::*; -/// This module was auto-generated with ethers-rs Abigen. -/// More information at: -#[allow( - clippy::enum_variant_names, - clippy::too_many_arguments, - clippy::upper_case_acronyms, - clippy::type_complexity, - dead_code, - non_camel_case_types, -)] -pub mod email_auth { - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { - inputs: ::std::vec![], - }), - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "UPGRADE_INTERFACE_VERSION", - ), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("accountSalt"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("accountSalt"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("authEmail"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("authEmail"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("emailAuthMsg"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple( - ::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Bytes, - ), - ), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Tuple( - ::std::vec![ - ::ethers::core::abi::ethabi::ParamType::String, - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::String, - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::Bool, - ::ethers::core::abi::ethabi::ParamType::Bytes, - ], - ), - ], - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct EmailAuthMsg"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("commandTemplates"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("commandTemplates"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::String, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("controller"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("controller"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("deleteCommandTemplate"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "deleteCommandTemplate", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_templateId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("dkimRegistryAddr"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("dkimRegistryAddr"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("getCommandTemplate"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("getCommandTemplate"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_templateId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::String, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string[]"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("initDKIMRegistry"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("initDKIMRegistry"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_dkimRegistryAddr"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("initVerifier"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("initVerifier"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_verifierAddr"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("initialize"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("initialize"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_initialOwner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_accountSalt"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_controller"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("insertCommandTemplate"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "insertCommandTemplate", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_templateId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_commandTemplate"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::String, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string[]"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("lastTimestamp"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("lastTimestamp"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("owner"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("owner"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("proxiableUUID"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("proxiableUUID"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("renounceOwnership"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("renounceOwnership"), - inputs: ::std::vec![], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("setTimestampCheckEnabled"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "setTimestampCheckEnabled", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_enabled"), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("timestampCheckEnabled"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "timestampCheckEnabled", - ), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("transferOwnership"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("transferOwnership"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("newOwner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("updateCommandTemplate"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "updateCommandTemplate", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_templateId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_commandTemplate"), - kind: ::ethers::core::abi::ethabi::ParamType::Array( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::String, - ), - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("string[]"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("updateDKIMRegistry"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("updateDKIMRegistry"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_dkimRegistryAddr"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("updateVerifier"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("updateVerifier"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_verifierAddr"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("newImplementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("data"), - kind: ::ethers::core::abi::ethabi::ParamType::Bytes, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes"), - ), - }, - ], - outputs: ::std::vec![], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("usedNullifiers"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("usedNullifiers"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("verifierAddr"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verifierAddr"), - inputs: ::std::vec![], - outputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - }, - ], - ), - ]), - events: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("CommandTemplateDeleted"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "CommandTemplateDeleted", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("templateId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: true, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("CommandTemplateInserted"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "CommandTemplateInserted", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("templateId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: true, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("CommandTemplateUpdated"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "CommandTemplateUpdated", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("templateId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: true, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("DKIMRegistryUpdated"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "DKIMRegistryUpdated", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("dkimRegistry"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("EmailAuthed"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("EmailAuthed"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("emailNullifier"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("accountSalt"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("isCodeExist"), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - indexed: false, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("templateId"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint( - 256usize, - ), - indexed: false, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("Initialized"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Initialized"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("version"), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), - indexed: false, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("OwnershipTransferred"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "OwnershipTransferred", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("previousOwner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("newOwner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("TimestampCheckEnabled"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "TimestampCheckEnabled", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("enabled"), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - indexed: false, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("Upgraded"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("Upgraded"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ], - anonymous: false, - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("VerifierUpdated"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned("VerifierUpdated"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::EventParam { - name: ::std::borrow::ToOwned::to_owned("verifier"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - indexed: true, - }, - ], - anonymous: false, - }, - ], - ), - ]), - errors: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("target"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "ERC1967InvalidImplementation", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("implementation"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("InvalidInitialization"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "InvalidInitialization", - ), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("NotInitializing"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("NotInitializing"), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("OwnableInvalidOwner"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "OwnableInvalidOwner", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("owner"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("OwnableUnauthorizedAccount"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "OwnableUnauthorizedAccount", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("account"), - kind: ::ethers::core::abi::ethabi::ParamType::Address, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("address"), - ), - }, - ], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "UUPSUnauthorizedCallContext", - ), - inputs: ::std::vec![], - }, - ], - ), - ( - ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID"), - ::std::vec![ - ::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned( - "UUPSUnsupportedProxiableUUID", - ), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("slot"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes( - 32usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bytes32"), - ), - }, - ], - }, - ], - ), - ]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static EMAILAUTH_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new( - __abi, - ); - pub struct EmailAuth(::ethers::contract::Contract); - impl ::core::clone::Clone for EmailAuth { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for EmailAuth { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for EmailAuth { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for EmailAuth { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(EmailAuth)).field(&self.address()).finish() - } - } - impl EmailAuth { - /// Creates a new contract instance with the specified `ethers` client at - /// `address`. The contract derefs to a `ethers::Contract` object. - pub fn new>( - address: T, - client: ::std::sync::Arc, - ) -> Self { - Self( - ::ethers::contract::Contract::new( - address.into(), - EMAILAUTH_ABI.clone(), - client, - ), - ) - } - ///Calls the contract's `UPGRADE_INTERFACE_VERSION` (0xad3cb1cc) function - pub fn upgrade_interface_version( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([173, 60, 177, 204], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `accountSalt` (0x6c74921e) function - pub fn account_salt( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([108, 116, 146, 30], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `authEmail` (0xad3f5f9b) function - pub fn auth_email( - &self, - email_auth_msg: EmailAuthMsg, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([173, 63, 95, 155], (email_auth_msg,)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `commandTemplates` (0x091c1650) function - pub fn command_templates( - &self, - p0: ::ethers::core::types::U256, - p1: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([9, 28, 22, 80], (p0, p1)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `controller` (0xf77c4791) function - pub fn controller( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([247, 124, 71, 145], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `deleteCommandTemplate` (0x640e8b69) function - pub fn delete_command_template( - &self, - template_id: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([100, 14, 139, 105], template_id) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `dkimRegistryAddr` (0x1bc01b83) function - pub fn dkim_registry_addr( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([27, 192, 27, 131], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `getCommandTemplate` (0x95e33c08) function - pub fn get_command_template( - &self, - template_id: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::std::vec::Vec<::std::string::String>, - > { - self.0 - .method_hash([149, 227, 60, 8], template_id) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `initDKIMRegistry` (0x557cf5ef) function - pub fn init_dkim_registry( - &self, - dkim_registry_addr: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([85, 124, 245, 239], dkim_registry_addr) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `initVerifier` (0x4141407c) function - pub fn init_verifier( - &self, - verifier_addr: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([65, 65, 64, 124], verifier_addr) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `initialize` (0xd26b3e6e) function - pub fn initialize( - &self, - initial_owner: ::ethers::core::types::Address, - account_salt: [u8; 32], - controller: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash( - [210, 107, 62, 110], - (initial_owner, account_salt, controller), - ) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `insertCommandTemplate` (0x8ff3730f) function - pub fn insert_command_template( - &self, - template_id: ::ethers::core::types::U256, - command_template: ::std::vec::Vec<::std::string::String>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([143, 243, 115, 15], (template_id, command_template)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `lastTimestamp` (0x19d8ac61) function - pub fn last_timestamp( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([25, 216, 172, 97], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `owner` (0x8da5cb5b) function - pub fn owner( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([141, 165, 203, 91], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `proxiableUUID` (0x52d1902d) function - pub fn proxiable_uuid( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([82, 209, 144, 45], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `renounceOwnership` (0x715018a6) function - pub fn renounce_ownership( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([113, 80, 24, 166], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `setTimestampCheckEnabled` (0xe453c0f3) function - pub fn set_timestamp_check_enabled( - &self, - enabled: bool, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([228, 83, 192, 243], enabled) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `timestampCheckEnabled` (0x3e56f529) function - pub fn timestamp_check_enabled( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([62, 86, 245, 41], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `transferOwnership` (0xf2fde38b) function - pub fn transfer_ownership( - &self, - new_owner: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([242, 253, 227, 139], new_owner) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `updateCommandTemplate` (0x24e33f11) function - pub fn update_command_template( - &self, - template_id: ::ethers::core::types::U256, - command_template: ::std::vec::Vec<::std::string::String>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([36, 227, 63, 17], (template_id, command_template)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `updateDKIMRegistry` (0xa500125c) function - pub fn update_dkim_registry( - &self, - dkim_registry_addr: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([165, 0, 18, 92], dkim_registry_addr) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `updateVerifier` (0x97fc007c) function - pub fn update_verifier( - &self, - verifier_addr: ::ethers::core::types::Address, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([151, 252, 0, 124], verifier_addr) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `upgradeToAndCall` (0x4f1ef286) function - pub fn upgrade_to_and_call( - &self, - new_implementation: ::ethers::core::types::Address, - data: ::ethers::core::types::Bytes, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([79, 30, 242, 134], (new_implementation, data)) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `usedNullifiers` (0x206137aa) function - pub fn used_nullifiers( - &self, - p0: [u8; 32], - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([32, 97, 55, 170], p0) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifierAddr` (0x663ea2e2) function - pub fn verifier_addr( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::ethers::core::types::Address, - > { - self.0 - .method_hash([102, 62, 162, 226], ()) - .expect("method not found (this should never happen)") - } - ///Gets the contract's `CommandTemplateDeleted` event - pub fn command_template_deleted_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - CommandTemplateDeletedFilter, - > { - self.0.event() - } - ///Gets the contract's `CommandTemplateInserted` event - pub fn command_template_inserted_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - CommandTemplateInsertedFilter, - > { - self.0.event() - } - ///Gets the contract's `CommandTemplateUpdated` event - pub fn command_template_updated_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - CommandTemplateUpdatedFilter, - > { - self.0.event() - } - ///Gets the contract's `DKIMRegistryUpdated` event - pub fn dkim_registry_updated_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - DkimregistryUpdatedFilter, - > { - self.0.event() - } - ///Gets the contract's `EmailAuthed` event - pub fn email_authed_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - EmailAuthedFilter, - > { - self.0.event() - } - ///Gets the contract's `Initialized` event - pub fn initialized_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - InitializedFilter, - > { - self.0.event() - } - ///Gets the contract's `OwnershipTransferred` event - pub fn ownership_transferred_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - OwnershipTransferredFilter, - > { - self.0.event() - } - ///Gets the contract's `TimestampCheckEnabled` event - pub fn timestamp_check_enabled_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - TimestampCheckEnabledFilter, - > { - self.0.event() - } - ///Gets the contract's `Upgraded` event - pub fn upgraded_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - UpgradedFilter, - > { - self.0.event() - } - ///Gets the contract's `VerifierUpdated` event - pub fn verifier_updated_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - VerifierUpdatedFilter, - > { - self.0.event() - } - /// Returns an `Event` builder for all the events of this contract. - pub fn events( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - EmailAuthEvents, - > { - self.0.event_with_filter(::core::default::Default::default()) - } - } - impl From<::ethers::contract::Contract> - for EmailAuth { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `AddressEmptyCode` with signature `AddressEmptyCode(address)` and selector `0x9996b315` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "AddressEmptyCode", abi = "AddressEmptyCode(address)")] - pub struct AddressEmptyCode { - pub target: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1967InvalidImplementation` with signature `ERC1967InvalidImplementation(address)` and selector `0x4c9c8ce3` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror( - name = "ERC1967InvalidImplementation", - abi = "ERC1967InvalidImplementation(address)" - )] - pub struct ERC1967InvalidImplementation { - pub implementation: ::ethers::core::types::Address, - } - ///Custom Error type `ERC1967NonPayable` with signature `ERC1967NonPayable()` and selector `0xb398979f` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "ERC1967NonPayable", abi = "ERC1967NonPayable()")] - pub struct ERC1967NonPayable; - ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] - pub struct FailedInnerCall; - ///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "InvalidInitialization", abi = "InvalidInitialization()")] - pub struct InvalidInitialization; - ///Custom Error type `NotInitializing` with signature `NotInitializing()` and selector `0xd7e6bcf8` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "NotInitializing", abi = "NotInitializing()")] - pub struct NotInitializing; - ///Custom Error type `OwnableInvalidOwner` with signature `OwnableInvalidOwner(address)` and selector `0x1e4fbdf7` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror(name = "OwnableInvalidOwner", abi = "OwnableInvalidOwner(address)")] - pub struct OwnableInvalidOwner { - pub owner: ::ethers::core::types::Address, - } - ///Custom Error type `OwnableUnauthorizedAccount` with signature `OwnableUnauthorizedAccount(address)` and selector `0x118cdaa7` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror( - name = "OwnableUnauthorizedAccount", - abi = "OwnableUnauthorizedAccount(address)" - )] - pub struct OwnableUnauthorizedAccount { - pub account: ::ethers::core::types::Address, - } - ///Custom Error type `UUPSUnauthorizedCallContext` with signature `UUPSUnauthorizedCallContext()` and selector `0xe07c8dba` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror( - name = "UUPSUnauthorizedCallContext", - abi = "UUPSUnauthorizedCallContext()" - )] - pub struct UUPSUnauthorizedCallContext; - ///Custom Error type `UUPSUnsupportedProxiableUUID` with signature `UUPSUnsupportedProxiableUUID(bytes32)` and selector `0xaa1d49a4` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[etherror( - name = "UUPSUnsupportedProxiableUUID", - abi = "UUPSUnsupportedProxiableUUID(bytes32)" - )] - pub struct UUPSUnsupportedProxiableUUID { - pub slot: [u8; 32], - } - ///Container type for all of the contract's custom errors - #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] - pub enum EmailAuthErrors { - AddressEmptyCode(AddressEmptyCode), - ERC1967InvalidImplementation(ERC1967InvalidImplementation), - ERC1967NonPayable(ERC1967NonPayable), - FailedInnerCall(FailedInnerCall), - InvalidInitialization(InvalidInitialization), - NotInitializing(NotInitializing), - OwnableInvalidOwner(OwnableInvalidOwner), - OwnableUnauthorizedAccount(OwnableUnauthorizedAccount), - UUPSUnauthorizedCallContext(UUPSUnauthorizedCallContext), - UUPSUnsupportedProxiableUUID(UUPSUnsupportedProxiableUUID), - /// The standard solidity revert string, with selector - /// Error(string) -- 0x08c379a0 - RevertString(::std::string::String), - } - impl ::ethers::core::abi::AbiDecode for EmailAuthErrors { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = <::std::string::String as ::ethers::core::abi::AbiDecode>::decode( - data, - ) { - return Ok(Self::RevertString(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::AddressEmptyCode(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ERC1967InvalidImplementation(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ERC1967NonPayable(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::FailedInnerCall(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::InvalidInitialization(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::NotInitializing(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::OwnableInvalidOwner(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::OwnableUnauthorizedAccount(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UUPSUnauthorizedCallContext(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UUPSUnsupportedProxiableUUID(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for EmailAuthErrors { - fn encode(self) -> ::std::vec::Vec { - match self { - Self::AddressEmptyCode(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1967InvalidImplementation(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::ERC1967NonPayable(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::FailedInnerCall(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::InvalidInitialization(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::NotInitializing(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::OwnableInvalidOwner(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::OwnableUnauthorizedAccount(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UUPSUnauthorizedCallContext(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UUPSUnsupportedProxiableUUID(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), - } - } - } - impl ::ethers::contract::ContractRevert for EmailAuthErrors { - fn valid_selector(selector: [u8; 4]) -> bool { - match selector { - [0x08, 0xc3, 0x79, 0xa0] => true, - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ if selector - == ::selector() => { - true - } - _ => false, - } - } - } - impl ::core::fmt::Display for EmailAuthErrors { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::AddressEmptyCode(element) => ::core::fmt::Display::fmt(element, f), - Self::ERC1967InvalidImplementation(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), - Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), - Self::InvalidInitialization(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), - Self::OwnableInvalidOwner(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::OwnableUnauthorizedAccount(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UUPSUnauthorizedCallContext(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UUPSUnsupportedProxiableUUID(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), - } - } - } - impl ::core::convert::From<::std::string::String> for EmailAuthErrors { - fn from(value: String) -> Self { - Self::RevertString(value) - } - } - impl ::core::convert::From for EmailAuthErrors { - fn from(value: AddressEmptyCode) -> Self { - Self::AddressEmptyCode(value) - } - } - impl ::core::convert::From for EmailAuthErrors { - fn from(value: ERC1967InvalidImplementation) -> Self { - Self::ERC1967InvalidImplementation(value) - } - } - impl ::core::convert::From for EmailAuthErrors { - fn from(value: ERC1967NonPayable) -> Self { - Self::ERC1967NonPayable(value) - } - } - impl ::core::convert::From for EmailAuthErrors { - fn from(value: FailedInnerCall) -> Self { - Self::FailedInnerCall(value) - } - } - impl ::core::convert::From for EmailAuthErrors { - fn from(value: InvalidInitialization) -> Self { - Self::InvalidInitialization(value) - } - } - impl ::core::convert::From for EmailAuthErrors { - fn from(value: NotInitializing) -> Self { - Self::NotInitializing(value) - } - } - impl ::core::convert::From for EmailAuthErrors { - fn from(value: OwnableInvalidOwner) -> Self { - Self::OwnableInvalidOwner(value) - } - } - impl ::core::convert::From for EmailAuthErrors { - fn from(value: OwnableUnauthorizedAccount) -> Self { - Self::OwnableUnauthorizedAccount(value) - } - } - impl ::core::convert::From for EmailAuthErrors { - fn from(value: UUPSUnauthorizedCallContext) -> Self { - Self::UUPSUnauthorizedCallContext(value) - } - } - impl ::core::convert::From for EmailAuthErrors { - fn from(value: UUPSUnsupportedProxiableUUID) -> Self { - Self::UUPSUnsupportedProxiableUUID(value) - } - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "CommandTemplateDeleted", abi = "CommandTemplateDeleted(uint256)")] - pub struct CommandTemplateDeletedFilter { - #[ethevent(indexed)] - pub template_id: ::ethers::core::types::U256, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent( - name = "CommandTemplateInserted", - abi = "CommandTemplateInserted(uint256)" - )] - pub struct CommandTemplateInsertedFilter { - #[ethevent(indexed)] - pub template_id: ::ethers::core::types::U256, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "CommandTemplateUpdated", abi = "CommandTemplateUpdated(uint256)")] - pub struct CommandTemplateUpdatedFilter { - #[ethevent(indexed)] - pub template_id: ::ethers::core::types::U256, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "DKIMRegistryUpdated", abi = "DKIMRegistryUpdated(address)")] - pub struct DkimregistryUpdatedFilter { - #[ethevent(indexed)] - pub dkim_registry: ::ethers::core::types::Address, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "EmailAuthed", abi = "EmailAuthed(bytes32,bytes32,bool,uint256)")] - pub struct EmailAuthedFilter { - #[ethevent(indexed)] - pub email_nullifier: [u8; 32], - #[ethevent(indexed)] - pub account_salt: [u8; 32], - pub is_code_exist: bool, - pub template_id: ::ethers::core::types::U256, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "Initialized", abi = "Initialized(uint64)")] - pub struct InitializedFilter { - pub version: u64, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent( - name = "OwnershipTransferred", - abi = "OwnershipTransferred(address,address)" - )] - pub struct OwnershipTransferredFilter { - #[ethevent(indexed)] - pub previous_owner: ::ethers::core::types::Address, - #[ethevent(indexed)] - pub new_owner: ::ethers::core::types::Address, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "TimestampCheckEnabled", abi = "TimestampCheckEnabled(bool)")] - pub struct TimestampCheckEnabledFilter { - pub enabled: bool, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] - pub struct UpgradedFilter { - #[ethevent(indexed)] - pub implementation: ::ethers::core::types::Address, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "VerifierUpdated", abi = "VerifierUpdated(address)")] - pub struct VerifierUpdatedFilter { - #[ethevent(indexed)] - pub verifier: ::ethers::core::types::Address, - } - ///Container type for all of the contract's events - #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] - pub enum EmailAuthEvents { - CommandTemplateDeletedFilter(CommandTemplateDeletedFilter), - CommandTemplateInsertedFilter(CommandTemplateInsertedFilter), - CommandTemplateUpdatedFilter(CommandTemplateUpdatedFilter), - DkimregistryUpdatedFilter(DkimregistryUpdatedFilter), - EmailAuthedFilter(EmailAuthedFilter), - InitializedFilter(InitializedFilter), - OwnershipTransferredFilter(OwnershipTransferredFilter), - TimestampCheckEnabledFilter(TimestampCheckEnabledFilter), - UpgradedFilter(UpgradedFilter), - VerifierUpdatedFilter(VerifierUpdatedFilter), - } - impl ::ethers::contract::EthLogDecode for EmailAuthEvents { - fn decode_log( - log: &::ethers::core::abi::RawLog, - ) -> ::core::result::Result { - if let Ok(decoded) = CommandTemplateDeletedFilter::decode_log(log) { - return Ok(EmailAuthEvents::CommandTemplateDeletedFilter(decoded)); - } - if let Ok(decoded) = CommandTemplateInsertedFilter::decode_log(log) { - return Ok(EmailAuthEvents::CommandTemplateInsertedFilter(decoded)); - } - if let Ok(decoded) = CommandTemplateUpdatedFilter::decode_log(log) { - return Ok(EmailAuthEvents::CommandTemplateUpdatedFilter(decoded)); - } - if let Ok(decoded) = DkimregistryUpdatedFilter::decode_log(log) { - return Ok(EmailAuthEvents::DkimregistryUpdatedFilter(decoded)); - } - if let Ok(decoded) = EmailAuthedFilter::decode_log(log) { - return Ok(EmailAuthEvents::EmailAuthedFilter(decoded)); - } - if let Ok(decoded) = InitializedFilter::decode_log(log) { - return Ok(EmailAuthEvents::InitializedFilter(decoded)); - } - if let Ok(decoded) = OwnershipTransferredFilter::decode_log(log) { - return Ok(EmailAuthEvents::OwnershipTransferredFilter(decoded)); - } - if let Ok(decoded) = TimestampCheckEnabledFilter::decode_log(log) { - return Ok(EmailAuthEvents::TimestampCheckEnabledFilter(decoded)); - } - if let Ok(decoded) = UpgradedFilter::decode_log(log) { - return Ok(EmailAuthEvents::UpgradedFilter(decoded)); - } - if let Ok(decoded) = VerifierUpdatedFilter::decode_log(log) { - return Ok(EmailAuthEvents::VerifierUpdatedFilter(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData) - } - } - impl ::core::fmt::Display for EmailAuthEvents { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::CommandTemplateDeletedFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::CommandTemplateInsertedFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::CommandTemplateUpdatedFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::DkimregistryUpdatedFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::EmailAuthedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::OwnershipTransferredFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::TimestampCheckEnabledFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifierUpdatedFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - } - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: CommandTemplateDeletedFilter) -> Self { - Self::CommandTemplateDeletedFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: CommandTemplateInsertedFilter) -> Self { - Self::CommandTemplateInsertedFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: CommandTemplateUpdatedFilter) -> Self { - Self::CommandTemplateUpdatedFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: DkimregistryUpdatedFilter) -> Self { - Self::DkimregistryUpdatedFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: EmailAuthedFilter) -> Self { - Self::EmailAuthedFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: InitializedFilter) -> Self { - Self::InitializedFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: OwnershipTransferredFilter) -> Self { - Self::OwnershipTransferredFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: TimestampCheckEnabledFilter) -> Self { - Self::TimestampCheckEnabledFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: UpgradedFilter) -> Self { - Self::UpgradedFilter(value) - } - } - impl ::core::convert::From for EmailAuthEvents { - fn from(value: VerifierUpdatedFilter) -> Self { - Self::VerifierUpdatedFilter(value) - } - } - ///Container type for all input parameters for the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "UPGRADE_INTERFACE_VERSION", abi = "UPGRADE_INTERFACE_VERSION()")] - pub struct UpgradeInterfaceVersionCall; - ///Container type for all input parameters for the `accountSalt` function with signature `accountSalt()` and selector `0x6c74921e` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "accountSalt", abi = "accountSalt()")] - pub struct AccountSaltCall; - ///Container type for all input parameters for the `authEmail` function with signature `authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))` and selector `0xad3f5f9b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "authEmail", - abi = "authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))" - )] - pub struct AuthEmailCall { - pub email_auth_msg: EmailAuthMsg, - } - ///Container type for all input parameters for the `commandTemplates` function with signature `commandTemplates(uint256,uint256)` and selector `0x091c1650` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "commandTemplates", abi = "commandTemplates(uint256,uint256)")] - pub struct CommandTemplatesCall( - pub ::ethers::core::types::U256, - pub ::ethers::core::types::U256, - ); - ///Container type for all input parameters for the `controller` function with signature `controller()` and selector `0xf77c4791` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "controller", abi = "controller()")] - pub struct ControllerCall; - ///Container type for all input parameters for the `deleteCommandTemplate` function with signature `deleteCommandTemplate(uint256)` and selector `0x640e8b69` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "deleteCommandTemplate", abi = "deleteCommandTemplate(uint256)")] - pub struct DeleteCommandTemplateCall { - pub template_id: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `dkimRegistryAddr` function with signature `dkimRegistryAddr()` and selector `0x1bc01b83` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "dkimRegistryAddr", abi = "dkimRegistryAddr()")] - pub struct DkimRegistryAddrCall; - ///Container type for all input parameters for the `getCommandTemplate` function with signature `getCommandTemplate(uint256)` and selector `0x95e33c08` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "getCommandTemplate", abi = "getCommandTemplate(uint256)")] - pub struct GetCommandTemplateCall { - pub template_id: ::ethers::core::types::U256, - } - ///Container type for all input parameters for the `initDKIMRegistry` function with signature `initDKIMRegistry(address)` and selector `0x557cf5ef` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "initDKIMRegistry", abi = "initDKIMRegistry(address)")] - pub struct InitDKIMRegistryCall { - pub dkim_registry_addr: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `initVerifier` function with signature `initVerifier(address)` and selector `0x4141407c` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "initVerifier", abi = "initVerifier(address)")] - pub struct InitVerifierCall { - pub verifier_addr: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `initialize` function with signature `initialize(address,bytes32,address)` and selector `0xd26b3e6e` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "initialize", abi = "initialize(address,bytes32,address)")] - pub struct InitializeCall { - pub initial_owner: ::ethers::core::types::Address, - pub account_salt: [u8; 32], - pub controller: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `insertCommandTemplate` function with signature `insertCommandTemplate(uint256,string[])` and selector `0x8ff3730f` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "insertCommandTemplate", - abi = "insertCommandTemplate(uint256,string[])" - )] - pub struct InsertCommandTemplateCall { - pub template_id: ::ethers::core::types::U256, - pub command_template: ::std::vec::Vec<::std::string::String>, - } - ///Container type for all input parameters for the `lastTimestamp` function with signature `lastTimestamp()` and selector `0x19d8ac61` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "lastTimestamp", abi = "lastTimestamp()")] - pub struct LastTimestampCall; - ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "owner", abi = "owner()")] - pub struct OwnerCall; - ///Container type for all input parameters for the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "proxiableUUID", abi = "proxiableUUID()")] - pub struct ProxiableUUIDCall; - ///Container type for all input parameters for the `renounceOwnership` function with signature `renounceOwnership()` and selector `0x715018a6` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "renounceOwnership", abi = "renounceOwnership()")] - pub struct RenounceOwnershipCall; - ///Container type for all input parameters for the `setTimestampCheckEnabled` function with signature `setTimestampCheckEnabled(bool)` and selector `0xe453c0f3` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "setTimestampCheckEnabled", abi = "setTimestampCheckEnabled(bool)")] - pub struct SetTimestampCheckEnabledCall { - pub enabled: bool, - } - ///Container type for all input parameters for the `timestampCheckEnabled` function with signature `timestampCheckEnabled()` and selector `0x3e56f529` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "timestampCheckEnabled", abi = "timestampCheckEnabled()")] - pub struct TimestampCheckEnabledCall; - ///Container type for all input parameters for the `transferOwnership` function with signature `transferOwnership(address)` and selector `0xf2fde38b` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "transferOwnership", abi = "transferOwnership(address)")] - pub struct TransferOwnershipCall { - pub new_owner: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `updateCommandTemplate` function with signature `updateCommandTemplate(uint256,string[])` and selector `0x24e33f11` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "updateCommandTemplate", - abi = "updateCommandTemplate(uint256,string[])" - )] - pub struct UpdateCommandTemplateCall { - pub template_id: ::ethers::core::types::U256, - pub command_template: ::std::vec::Vec<::std::string::String>, - } - ///Container type for all input parameters for the `updateDKIMRegistry` function with signature `updateDKIMRegistry(address)` and selector `0xa500125c` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "updateDKIMRegistry", abi = "updateDKIMRegistry(address)")] - pub struct UpdateDKIMRegistryCall { - pub dkim_registry_addr: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `updateVerifier` function with signature `updateVerifier(address)` and selector `0x97fc007c` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "updateVerifier", abi = "updateVerifier(address)")] - pub struct UpdateVerifierCall { - pub verifier_addr: ::ethers::core::types::Address, - } - ///Container type for all input parameters for the `upgradeToAndCall` function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "upgradeToAndCall", abi = "upgradeToAndCall(address,bytes)")] - pub struct UpgradeToAndCallCall { - pub new_implementation: ::ethers::core::types::Address, - pub data: ::ethers::core::types::Bytes, - } - ///Container type for all input parameters for the `usedNullifiers` function with signature `usedNullifiers(bytes32)` and selector `0x206137aa` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "usedNullifiers", abi = "usedNullifiers(bytes32)")] - pub struct UsedNullifiersCall(pub [u8; 32]); - ///Container type for all input parameters for the `verifierAddr` function with signature `verifierAddr()` and selector `0x663ea2e2` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "verifierAddr", abi = "verifierAddr()")] - pub struct VerifierAddrCall; - ///Container type for all of the contract's call - #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] - pub enum EmailAuthCalls { - UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), - AccountSalt(AccountSaltCall), - AuthEmail(AuthEmailCall), - CommandTemplates(CommandTemplatesCall), - Controller(ControllerCall), - DeleteCommandTemplate(DeleteCommandTemplateCall), - DkimRegistryAddr(DkimRegistryAddrCall), - GetCommandTemplate(GetCommandTemplateCall), - InitDKIMRegistry(InitDKIMRegistryCall), - InitVerifier(InitVerifierCall), - Initialize(InitializeCall), - InsertCommandTemplate(InsertCommandTemplateCall), - LastTimestamp(LastTimestampCall), - Owner(OwnerCall), - ProxiableUUID(ProxiableUUIDCall), - RenounceOwnership(RenounceOwnershipCall), - SetTimestampCheckEnabled(SetTimestampCheckEnabledCall), - TimestampCheckEnabled(TimestampCheckEnabledCall), - TransferOwnership(TransferOwnershipCall), - UpdateCommandTemplate(UpdateCommandTemplateCall), - UpdateDKIMRegistry(UpdateDKIMRegistryCall), - UpdateVerifier(UpdateVerifierCall), - UpgradeToAndCall(UpgradeToAndCallCall), - UsedNullifiers(UsedNullifiersCall), - VerifierAddr(VerifierAddrCall), - } - impl ::ethers::core::abi::AbiDecode for EmailAuthCalls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UpgradeInterfaceVersion(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::AccountSalt(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::AuthEmail(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::CommandTemplates(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::Controller(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::DeleteCommandTemplate(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::DkimRegistryAddr(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::GetCommandTemplate(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::InitDKIMRegistry(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::InitVerifier(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::Initialize(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::InsertCommandTemplate(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::LastTimestamp(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::Owner(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ProxiableUUID(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::RenounceOwnership(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::SetTimestampCheckEnabled(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::TimestampCheckEnabled(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::TransferOwnership(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UpdateCommandTemplate(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UpdateDKIMRegistry(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UpdateVerifier(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UpgradeToAndCall(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UsedNullifiers(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::VerifierAddr(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for EmailAuthCalls { - fn encode(self) -> Vec { - match self { - Self::UpgradeInterfaceVersion(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AccountSalt(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::AuthEmail(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::CommandTemplates(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Controller(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::DeleteCommandTemplate(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::DkimRegistryAddr(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::GetCommandTemplate(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::InitDKIMRegistry(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::InitVerifier(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Initialize(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::InsertCommandTemplate(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::LastTimestamp(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::ProxiableUUID(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::RenounceOwnership(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::SetTimestampCheckEnabled(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::TimestampCheckEnabled(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::TransferOwnership(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UpdateCommandTemplate(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UpdateDKIMRegistry(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UpdateVerifier(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UpgradeToAndCall(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UsedNullifiers(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::VerifierAddr(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - } - } - } - impl ::core::fmt::Display for EmailAuthCalls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::UpgradeInterfaceVersion(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::AccountSalt(element) => ::core::fmt::Display::fmt(element, f), - Self::AuthEmail(element) => ::core::fmt::Display::fmt(element, f), - Self::CommandTemplates(element) => ::core::fmt::Display::fmt(element, f), - Self::Controller(element) => ::core::fmt::Display::fmt(element, f), - Self::DeleteCommandTemplate(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::DkimRegistryAddr(element) => ::core::fmt::Display::fmt(element, f), - Self::GetCommandTemplate(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::InitDKIMRegistry(element) => ::core::fmt::Display::fmt(element, f), - Self::InitVerifier(element) => ::core::fmt::Display::fmt(element, f), - Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), - Self::InsertCommandTemplate(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::LastTimestamp(element) => ::core::fmt::Display::fmt(element, f), - Self::Owner(element) => ::core::fmt::Display::fmt(element, f), - Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f), - Self::RenounceOwnership(element) => ::core::fmt::Display::fmt(element, f), - Self::SetTimestampCheckEnabled(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::TimestampCheckEnabled(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), - Self::UpdateCommandTemplate(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UpdateDKIMRegistry(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UpdateVerifier(element) => ::core::fmt::Display::fmt(element, f), - Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), - Self::UsedNullifiers(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifierAddr(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: UpgradeInterfaceVersionCall) -> Self { - Self::UpgradeInterfaceVersion(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: AccountSaltCall) -> Self { - Self::AccountSalt(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: AuthEmailCall) -> Self { - Self::AuthEmail(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: CommandTemplatesCall) -> Self { - Self::CommandTemplates(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: ControllerCall) -> Self { - Self::Controller(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: DeleteCommandTemplateCall) -> Self { - Self::DeleteCommandTemplate(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: DkimRegistryAddrCall) -> Self { - Self::DkimRegistryAddr(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: GetCommandTemplateCall) -> Self { - Self::GetCommandTemplate(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: InitDKIMRegistryCall) -> Self { - Self::InitDKIMRegistry(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: InitVerifierCall) -> Self { - Self::InitVerifier(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: InitializeCall) -> Self { - Self::Initialize(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: InsertCommandTemplateCall) -> Self { - Self::InsertCommandTemplate(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: LastTimestampCall) -> Self { - Self::LastTimestamp(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: OwnerCall) -> Self { - Self::Owner(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: ProxiableUUIDCall) -> Self { - Self::ProxiableUUID(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: RenounceOwnershipCall) -> Self { - Self::RenounceOwnership(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: SetTimestampCheckEnabledCall) -> Self { - Self::SetTimestampCheckEnabled(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: TimestampCheckEnabledCall) -> Self { - Self::TimestampCheckEnabled(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: TransferOwnershipCall) -> Self { - Self::TransferOwnership(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: UpdateCommandTemplateCall) -> Self { - Self::UpdateCommandTemplate(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: UpdateDKIMRegistryCall) -> Self { - Self::UpdateDKIMRegistry(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: UpdateVerifierCall) -> Self { - Self::UpdateVerifier(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: UpgradeToAndCallCall) -> Self { - Self::UpgradeToAndCall(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: UsedNullifiersCall) -> Self { - Self::UsedNullifiers(value) - } - } - impl ::core::convert::From for EmailAuthCalls { - fn from(value: VerifierAddrCall) -> Self { - Self::VerifierAddr(value) - } - } - ///Container type for all return fields from the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); - ///Container type for all return fields from the `accountSalt` function with signature `accountSalt()` and selector `0x6c74921e` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct AccountSaltReturn(pub [u8; 32]); - ///Container type for all return fields from the `commandTemplates` function with signature `commandTemplates(uint256,uint256)` and selector `0x091c1650` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct CommandTemplatesReturn(pub ::std::string::String); - ///Container type for all return fields from the `controller` function with signature `controller()` and selector `0xf77c4791` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ControllerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `dkimRegistryAddr` function with signature `dkimRegistryAddr()` and selector `0x1bc01b83` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct DkimRegistryAddrReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `getCommandTemplate` function with signature `getCommandTemplate(uint256)` and selector `0x95e33c08` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct GetCommandTemplateReturn(pub ::std::vec::Vec<::std::string::String>); - ///Container type for all return fields from the `lastTimestamp` function with signature `lastTimestamp()` and selector `0x19d8ac61` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct LastTimestampReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct OwnerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct ProxiableUUIDReturn(pub [u8; 32]); - ///Container type for all return fields from the `timestampCheckEnabled` function with signature `timestampCheckEnabled()` and selector `0x3e56f529` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct TimestampCheckEnabledReturn(pub bool); - ///Container type for all return fields from the `usedNullifiers` function with signature `usedNullifiers(bytes32)` and selector `0x206137aa` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct UsedNullifiersReturn(pub bool); - ///Container type for all return fields from the `verifierAddr` function with signature `verifierAddr()` and selector `0x663ea2e2` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct VerifierAddrReturn(pub ::ethers::core::types::Address); - ///`EmailAuthMsg(uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes))` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct EmailAuthMsg { - pub template_id: ::ethers::core::types::U256, - pub command_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub skipped_command_prefix: ::ethers::core::types::U256, - pub proof: EmailProof, - } - ///`EmailProof(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct EmailProof { - pub domain_name: ::std::string::String, - pub public_key_hash: [u8; 32], - pub timestamp: ::ethers::core::types::U256, - pub masked_command: ::std::string::String, - pub email_nullifier: [u8; 32], - pub account_salt: [u8; 32], - pub is_code_exist: bool, - pub proof: ::ethers::core::types::Bytes, - } -} From f91fc0244eef3559ac3ab3c64c0da137ebd1c53a Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sun, 15 Sep 2024 17:47:07 +0530 Subject: [PATCH 082/121] chore: update github actions and add PR template --- .github/pull_request_template.md | 28 +++++++++++++++++++ .../workflows/{build.yml => build-fmt.yml} | 17 +++++++++-- .github/workflows/clippy.yml | 13 --------- .github/workflows/rustfmt.yml | 13 --------- .github/workflows/unit-tests.yml | 6 ++-- 5 files changed, 45 insertions(+), 32 deletions(-) create mode 100644 .github/pull_request_template.md rename .github/workflows/{build.yml => build-fmt.yml} (77%) delete mode 100644 .github/workflows/clippy.yml delete mode 100644 .github/workflows/rustfmt.yml diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..8b688cb0 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,28 @@ +## Description + + + + +## Type of change + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] This change requires a documentation update + +## How Has This Been Tested? + + +- [ ] Test A +- [ ] Test B + +## Checklist: + +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes +- [ ] Any dependent changes have been merged and published in downstream modules \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build-fmt.yml similarity index 77% rename from .github/workflows/build.yml rename to .github/workflows/build-fmt.yml index 083784e1..df36a2a9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build-fmt.yml @@ -1,9 +1,9 @@ -name: Build-Test-Fmt +name: Build and Format on: [push] jobs: - build-test-fmt: + build-and-format: runs-on: ubuntu-latest steps: @@ -11,6 +11,11 @@ jobs: - run: rustup show + - name: Install rustfmt and clippy + run: | + rustup component add rustfmt + rustup component add clippy + - uses: Swatinem/rust-cache@v2 - name: Setup Node.js @@ -27,7 +32,7 @@ jobs: with: version: nightly-0079a1146b79a4aeda58b0258215bedb1f92700b - - name: Run tests + - name: Build contracts working-directory: packages/contracts run: yarn build @@ -49,3 +54,9 @@ jobs: - name: Build and check for warnings run: cargo build --release -D warnings + + - name: Check formatting + run: cargo fmt -- --check + + - name: Run clippy + run: cargo clippy -- -D warnings diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml deleted file mode 100644 index 584a0ff3..00000000 --- a/.github/workflows/clippy.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Clippy Lint Check - -on: [pull_request] - -jobs: - clippy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Install clippy - run: rustup component add clippy - - name: Run clippy - run: cargo clippy -- -D warnings diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml deleted file mode 100644 index 9764b118..00000000 --- a/.github/workflows/rustfmt.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Rustfmt Check - -on: [pull_request] - -jobs: - format: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Install rustfmt - run: rustup component add rustfmt - - name: Check formatting - run: cargo fmt -- --check diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 457f42e1..3d784ba0 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -1,4 +1,4 @@ -name: unit-tests +name: Unit Tests on: [push] @@ -85,9 +85,9 @@ jobs: with: version: nightly-0079a1146b79a4aeda58b0258215bedb1f92700b - - name: Forge Build + - name: Build contracts working-directory: packages/contracts - run: forge build + run: yarn build - name: Run tests working-directory: packages/relayer From b4e547ad84327bbda7048aa1dd19a673e2cbc387 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sun, 15 Sep 2024 18:02:39 +0530 Subject: [PATCH 083/121] fix: github action --- .github/workflows/build-fmt.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-fmt.yml b/.github/workflows/build-fmt.yml index df36a2a9..0cb1b536 100644 --- a/.github/workflows/build-fmt.yml +++ b/.github/workflows/build-fmt.yml @@ -53,7 +53,9 @@ jobs: swap-storage: true - name: Build and check for warnings - run: cargo build --release -D warnings + env: + RUSTFLAGS: "-D warnings" + run: cargo build --release - name: Check formatting run: cargo fmt -- --check From f036aaca1ce2440d05ca183fbb133aced1a9e808 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Mon, 16 Sep 2024 13:42:28 +0700 Subject: [PATCH 084/121] Remove hard-coded file_paths; Fix clippy warnings --- packages/relayer/.env.example | 2 + packages/relayer/src/abis/mod.rs | 1 + packages/relayer/src/chain.rs | 43 +++++++++---------- packages/relayer/src/core.rs | 32 +++++++------- packages/relayer/src/modules/dkim.rs | 28 ++++++------ packages/relayer/src/modules/mail.rs | 6 +-- .../relayer/src/modules/web_server/mod.rs | 4 +- .../{errors.rs => relayer_errors.rs} | 0 .../src/modules/web_server/rest_api.rs | 6 +-- packages/relayer/src/utils/mod.rs | 3 ++ packages/relayer/src/utils/strings.rs | 2 + .../relayer/src/utils/subject_templates.rs | 16 ++----- packages/relayer/src/utils/utils.rs | 4 +- rustfmt.toml | 8 ++++ 14 files changed, 79 insertions(+), 76 deletions(-) rename packages/relayer/src/modules/web_server/{errors.rs => relayer_errors.rs} (100%) create mode 100644 rustfmt.toml diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example index 12957976..34721015 100644 --- a/packages/relayer/.env.example +++ b/packages/relayer/.env.example @@ -13,6 +13,8 @@ RELAYER_EMAIL_ADDR= WEB_SERVER_ADDRESS="127.0.0.1:4500" CIRCUITS_DIR_PATH= #Path to email-wallet/packages/circuits EMAIL_TEMPLATES_PATH= #Path to email templates, e.g. ./packages/relayer/eml_templates/ +SELECTOR_DEF_PATH="./src/regex_json/selector_def.json" +REQUEST_DEF_PATH="./src/regex_json/request_def.json" CANISTER_ID="q7eci-dyaaa-aaaak-qdbia-cai" PEM_PATH="./.ic.pem" diff --git a/packages/relayer/src/abis/mod.rs b/packages/relayer/src/abis/mod.rs index 5fb44ddb..6a38feb0 100644 --- a/packages/relayer/src/abis/mod.rs +++ b/packages/relayer/src/abis/mod.rs @@ -1,3 +1,4 @@ +#![allow(clippy::all)] pub mod ecdsa_owned_dkim_registry; pub mod email_account_recovery; pub mod email_auth; diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index 8de83d4e..27127ca4 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -66,7 +66,7 @@ impl ChainClient { pub async fn get_dkim_from_wallet( &self, - controller_eth_addr: &String, + controller_eth_addr: &str, ) -> Result, anyhow::Error> { let controller_eth_addr: H160 = controller_eth_addr.parse()?; let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); @@ -76,7 +76,7 @@ impl ChainClient { pub async fn get_dkim_from_email_auth( &self, - email_auth_addr: &String, + email_auth_addr: &str, ) -> Result, anyhow::Error> { let email_auth_address: H160 = email_auth_addr.parse()?; let contract = EmailAuth::new(email_auth_address, self.client.clone()); @@ -87,9 +87,9 @@ impl ChainClient { pub async fn get_email_auth_addr_from_wallet( &self, - controller_eth_addr: &String, - wallet_addr: &String, - account_salt: &String, + controller_eth_addr: &str, + wallet_addr: &str, + account_salt: &str, ) -> Result { let controller_eth_addr: H160 = controller_eth_addr.parse()?; let wallet_address: H160 = wallet_addr.parse()?; @@ -107,7 +107,7 @@ impl ChainClient { Ok(email_auth_addr) } - pub async fn is_wallet_deployed(&self, wallet_addr_str: &String) -> Result { + pub async fn is_wallet_deployed(&self, wallet_addr_str: &str) -> Result { let wallet_addr: H160 = wallet_addr_str.parse().map_err(ChainError::HexError)?; match self.client.get_code(wallet_addr, None).await { Ok(code) => Ok(!code.is_empty()), @@ -123,7 +123,7 @@ impl ChainClient { pub async fn get_acceptance_command_templates( &self, - controller_eth_addr: &String, + controller_eth_addr: &str, template_idx: u64, ) -> Result, ChainError> { let controller_eth_addr: H160 = @@ -141,7 +141,7 @@ impl ChainClient { pub async fn get_recovery_command_templates( &self, - controller_eth_addr: &String, + controller_eth_addr: &str, template_idx: u64, ) -> Result, ChainError> { let controller_eth_addr: H160 = @@ -159,9 +159,9 @@ impl ChainClient { pub async fn complete_recovery( &self, - controller_eth_addr: &String, - account_eth_addr: &String, - complete_calldata: &String, + controller_eth_addr: &str, + account_eth_addr: &str, + complete_calldata: &str, ) -> Result { println!("doing complete recovery"); let controller_eth_addr: H160 = @@ -170,7 +170,7 @@ impl ChainClient { let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); let decoded_calldata = - hex::decode(&complete_calldata.trim_start_matches("0x")).expect("Decoding failed"); + hex::decode(complete_calldata.trim_start_matches("0x")).expect("Decoding failed"); println!("decoded_calldata : {:?}", decoded_calldata); let account_eth_addr = account_eth_addr @@ -208,7 +208,7 @@ impl ChainClient { pub async fn handle_acceptance( &self, - controller_eth_addr: &String, + controller_eth_addr: &str, email_auth_msg: EmailAuthMsg, template_idx: u64, ) -> std::result::Result { @@ -239,7 +239,7 @@ impl ChainClient { pub async fn handle_recovery( &self, - controller_eth_addr: &String, + controller_eth_addr: &str, email_auth_msg: EmailAuthMsg, template_idx: u64, ) -> std::result::Result { @@ -265,10 +265,7 @@ impl ChainClient { .unwrap_or(false)) } - pub async fn get_bytecode( - &self, - wallet_addr: &String, - ) -> std::result::Result { + pub async fn get_bytecode(&self, wallet_addr: &str) -> std::result::Result { let wallet_address: H160 = wallet_addr.parse().map_err(ChainError::HexError)?; let client_code = self .client @@ -280,7 +277,7 @@ impl ChainClient { pub async fn get_storage_at( &self, - wallet_addr: &String, + wallet_addr: &str, slot: u64, ) -> Result { let wallet_address: H160 = wallet_addr.parse()?; @@ -292,7 +289,7 @@ impl ChainClient { pub async fn get_recovered_account_from_acceptance_command( &self, - controller_eth_addr: &String, + controller_eth_addr: &str, command_params: Vec, template_idx: u64, ) -> Result { @@ -324,7 +321,7 @@ impl ChainClient { pub async fn get_recovered_account_from_recovery_command( &self, - controller_eth_addr: &String, + controller_eth_addr: &str, command_params: Vec, template_idx: u64, ) -> Result { @@ -357,8 +354,8 @@ impl ChainClient { pub async fn get_is_activated( &self, - controller_eth_addr: &String, - account_eth_addr: &String, + controller_eth_addr: &str, + account_eth_addr: &str, ) -> Result { let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ChainError::HexError)?; diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 7af369ae..f1b1926f 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -1,6 +1,8 @@ #![allow(clippy::upper_case_acronyms)] #![allow(clippy::identity_op)] +use std::fs; + use crate::abis::email_account_recovery::{EmailAuthMsg, EmailProof}; use crate::*; @@ -22,9 +24,12 @@ pub async fn handle_email(email: String) -> Result { trace!(LOG, "From address: {}", guardian_email_addr); let email_body = parsed_email.get_cleaned_body()?; - let request_decomposed_def = - serde_json::from_str(include_str!("./regex_json/request_def.json")) - .map_err(|e| EmailError::Parse(format!("Failed to parse request_def.json: {}", e)))?; + let request_def_path = env::var(REQUEST_DEF_PATH_KEY) + .map_err(|_| anyhow!("ENV var {} not set", REQUEST_DEF_PATH_KEY))?; + let request_def_contents = fs::read_to_string(&request_def_path) + .map_err(|e| anyhow!("Failed to read file {}: {}", request_def_path, e))?; + let request_decomposed_def = serde_json::from_str(&request_def_contents) + .map_err(|e| EmailError::Parse(format!("Failed to parse request_def.json: {}", e)))?; let request_idxes = extract_substr_idxes(&email, &request_decomposed_def)?; if request_idxes.is_empty() { return Err(EmailError::Body(WRONG_COMMAND_FORMAT.to_string())); @@ -221,15 +226,13 @@ async fn recover(params: EmailRequestContext) -> Result, start_idx: usize) -> Result { // Gather signals from start_idx to start_idx + COMMAND_FIELDS - let mut command_bytes = Vec::new(); - for i in start_idx..start_idx + COMMAND_FIELDS { - let signal = public_signals[i as usize]; - if signal == U256::zero() { - break; - } - let bytes = u256_to_bytes32_little(&signal); - command_bytes.extend_from_slice(&bytes); - } + let command_bytes: Vec = public_signals + .iter() + .skip(start_idx) + .take(COMMAND_FIELDS) + .take_while(|&signal| *signal != U256::zero()) + .flat_map(u256_to_bytes32_little) + .collect(); // Bytes to string, removing null bytes let command = String::from_utf8(command_bytes.into_iter().filter(|&b| b != 0u8).collect()) @@ -257,7 +260,7 @@ async fn update_request( account_salt: Some(bytes32_to_hex(&account_salt)), }; - let update_request_result = DB.update_request(&updated_request).await?; + DB.update_request(&updated_request).await?; Ok(()) } @@ -313,8 +316,7 @@ fn get_template_id(params: &EmailRequestContext) -> [u8; 32] { Token::Uint(params.request.template_idx.into()), ]; - let template_id = keccak256(encode(&tokens)); - template_id + keccak256(encode(&tokens)) } async fn get_encoded_command_params( diff --git a/packages/relayer/src/modules/dkim.rs b/packages/relayer/src/modules/dkim.rs index 82e9f912..b1d29c26 100644 --- a/packages/relayer/src/modules/dkim.rs +++ b/packages/relayer/src/modules/dkim.rs @@ -1,3 +1,5 @@ +use std::fs; + use anyhow::anyhow; use relayer_utils::extract_substr_idxes; use relayer_utils::LOG; @@ -41,7 +43,7 @@ impl<'a> DkimOracleClient<'a> { pub fn new(canister_id: &str, agent: &'a Agent) -> anyhow::Result { let canister = CanisterBuilder::new() .with_canister_id(canister_id) - .with_agent(&agent) + .with_agent(agent) .build()?; Ok(Self { canister }) } @@ -78,22 +80,16 @@ pub async fn check_and_update_dkim( info!(LOG, "public_key_hash {:?}", public_key_hash); let domain = parsed_email.get_email_domain()?; info!(LOG, "domain {:?}", domain); - if CLIENT.get_bytecode(&wallet_addr.to_string()).await? == Bytes::from(vec![0u8; 20]) { + if CLIENT.get_bytecode(wallet_addr).await? == Bytes::from_static(&[0u8; 20]) { info!(LOG, "wallet not deployed"); return Ok(()); } let email_auth_addr = CLIENT - .get_email_auth_addr_from_wallet( - &controller_eth_addr.to_string(), - &wallet_addr.to_string(), - &account_salt.to_string(), - ) + .get_email_auth_addr_from_wallet(controller_eth_addr, wallet_addr, account_salt) .await?; let email_auth_addr = format!("0x{:x}", email_auth_addr); - let mut dkim = CLIENT - .get_dkim_from_wallet(&controller_eth_addr.to_string()) - .await?; - if CLIENT.get_bytecode(&email_auth_addr).await? != Bytes::from(vec![]) { + let mut dkim = CLIENT.get_dkim_from_wallet(controller_eth_addr).await?; + if CLIENT.get_bytecode(&email_auth_addr).await? != Bytes::new() { dkim = CLIENT.get_dkim_from_email_auth(&email_auth_addr).await?; } info!(LOG, "dkim {:?}", dkim); @@ -108,13 +104,15 @@ pub async fn check_and_update_dkim( info!(LOG, "public key registered"); return Ok(()); } - let selector_decomposed_def = - serde_json::from_str(include_str!("../regex_json/selector_def.json")).unwrap(); + let selector_def_path = env::var(SELECTOR_DEF_PATH_KEY) + .map_err(|_| anyhow!("ENV var {} not set", SELECTOR_DEF_PATH_KEY))?; + let selector_def_contents = fs::read_to_string(&selector_def_path) + .map_err(|e| anyhow!("Failed to read file {}: {}", selector_def_path, e))?; + let selector_decomposed_def = serde_json::from_str(&selector_def_path).unwrap(); let selector = { let idxes = extract_substr_idxes(&parsed_email.canonicalized_header, &selector_decomposed_def)?[0]; - let str = parsed_email.canonicalized_header[idxes.0..idxes.1].to_string(); - str + parsed_email.canonicalized_header[idxes.0..idxes.1].to_string() }; info!(LOG, "selector {}", selector); let ic_agent = DkimOracleClient::gen_agent( diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs index dfb237dc..ffc15d8e 100644 --- a/packages/relayer/src/modules/mail.rs +++ b/packages/relayer/src/modules/mail.rs @@ -100,7 +100,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> account_eth_addr, command, account_code, request_id ); - let subject = format!("Email Recovery: Acceptance Request"); + let subject = "Email Recovery: Acceptance Request".to_string(); let render_data = serde_json::json!({ "userEmailAddr": guardian_email_addr, @@ -197,7 +197,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> account_eth_addr, request_id ); - let subject = format!("Email Recovery: Recovery Request"); + let subject = "Email Recovery: Recovery Request".to_string(); let render_data = serde_json::json!({ "userEmailAddr": guardian_email_addr, @@ -408,7 +408,7 @@ pub fn parse_error(error: String) -> Result> { let revert_bytes = hex::decode(revert_data) .unwrap() .into_iter() - .filter(|&b| b >= 0x20 && b <= 0x7E) + .filter(|&b| (0x20..=0x7E).contains(&b)) .collect(); error = String::from_utf8(revert_bytes).unwrap().trim().to_string(); } diff --git a/packages/relayer/src/modules/web_server/mod.rs b/packages/relayer/src/modules/web_server/mod.rs index 14a44e7b..35ed632a 100644 --- a/packages/relayer/src/modules/web_server/mod.rs +++ b/packages/relayer/src/modules/web_server/mod.rs @@ -1,7 +1,7 @@ -pub mod errors; +pub mod relayer_errors; pub mod rest_api; pub mod server; -pub use errors::*; +pub use relayer_errors::*; pub use rest_api::*; pub use server::*; diff --git a/packages/relayer/src/modules/web_server/errors.rs b/packages/relayer/src/modules/web_server/relayer_errors.rs similarity index 100% rename from packages/relayer/src/modules/web_server/errors.rs rename to packages/relayer/src/modules/web_server/relayer_errors.rs diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 823eb6e0..454bf088 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -122,7 +122,7 @@ pub async fn handle_acceptance_request( let account_salt = calculate_account_salt(&payload.guardian_email_addr, &payload.account_code); DB.insert_request(&Request { - request_id: request_id.clone(), + request_id, account_eth_addr: account_eth_addr.clone(), controller_eth_addr: payload.controller_eth_addr.clone(), guardian_email_addr: payload.guardian_email_addr.clone(), @@ -310,7 +310,7 @@ pub async fn handle_recovery_request( { println!("email and wallet are not registered"); DB.insert_request(&Request { - request_id: request_id.clone(), + request_id, account_eth_addr: account_eth_addr.clone(), controller_eth_addr: payload.controller_eth_addr.clone(), guardian_email_addr: payload.guardian_email_addr.clone(), @@ -338,7 +338,7 @@ pub async fn handle_recovery_request( } DB.insert_request(&Request { - request_id: request_id.clone(), + request_id, account_eth_addr: account_eth_addr.clone(), controller_eth_addr: payload.controller_eth_addr.clone(), guardian_email_addr: payload.guardian_email_addr.clone(), diff --git a/packages/relayer/src/utils/mod.rs b/packages/relayer/src/utils/mod.rs index 361a451a..92b1cf5b 100644 --- a/packages/relayer/src/utils/mod.rs +++ b/packages/relayer/src/utils/mod.rs @@ -1,3 +1,6 @@ +// TODO: Remove this once we remove the utils +#![allow(clippy::module_inception)] + pub mod strings; pub mod subject_templates; pub mod utils; diff --git a/packages/relayer/src/utils/strings.rs b/packages/relayer/src/utils/strings.rs index c33a1e7f..51b610ac 100644 --- a/packages/relayer/src/utils/strings.rs +++ b/packages/relayer/src/utils/strings.rs @@ -11,6 +11,8 @@ pub const PRIVATE_KEY_KEY: &str = "PRIVATE_KEY"; pub const CHAIN_ID_KEY: &str = "CHAIN_ID"; pub const EMAIL_ACCOUNT_RECOVERY_VERSION_ID_KEY: &str = "EMAIL_ACCOUNT_RECOVERY_VERSION_ID"; pub const EMAIL_TEMPLATES_PATH_KEY: &str = "EMAIL_TEMPLATES_PATH"; +pub const SELECTOR_DEF_PATH_KEY: &str = "SELECTOR_DEF_PATH"; +pub const REQUEST_DEF_PATH_KEY: &str = "REQUEST_DEF_PATH"; // Log strings pub const JSON_LOGGER_KEY: &str = "JSON_LOGGER"; diff --git a/packages/relayer/src/utils/subject_templates.rs b/packages/relayer/src/utils/subject_templates.rs index e8ccd734..f2fe37a1 100644 --- a/packages/relayer/src/utils/subject_templates.rs +++ b/packages/relayer/src/utils/subject_templates.rs @@ -24,7 +24,7 @@ impl TemplateValue { Self::Uint(uint) => Ok(Bytes::from(abi::encode(&[Token::Uint(*uint)]))), Self::Int(int) => Ok(Bytes::from(abi::encode(&[Token::Int(int.into_raw())]))), Self::Decimals(string) => Ok(Bytes::from(abi::encode(&[Token::Uint( - Self::decimals_str_to_uint(&string, decimal_size.unwrap_or(18)), + Self::decimals_str_to_uint(string, decimal_size.unwrap_or(18)), )]))), Self::EthAddr(address) => Ok(Bytes::from(abi::encode(&[Token::Address(*address)]))), Self::Fixed(string) => Err(anyhow!("Fixed value must not be passed to abi_encode")), @@ -76,10 +76,7 @@ pub fn extract_template_vals_from_command( // Extract the values based on the matched pattern let current_input = &input[skipped_bytes..]; - match extract_template_vals(current_input, templates) { - Ok(vals) => Ok(vals), - Err(e) => Err(e), - } + extract_template_vals(current_input, templates) } else { // If there's no match, return an error indicating no match was found Err(anyhow!("Unable to match templates with input")) @@ -89,13 +86,8 @@ pub fn extract_template_vals_from_command( pub fn extract_template_vals(input: &str, templates: Vec) -> Result> { let input_decomposed: Vec<&str> = input.split_whitespace().collect(); let mut template_vals = Vec::new(); - let mut input_idx = 0; - - for template in templates.iter() { - if input_idx >= input_decomposed.len() { - break; // Prevents index out of bounds if input is shorter than template - } + for (input_idx, template) in templates.iter().enumerate() { match template.as_str() { "{string}" => { let string_match = Regex::new(STRING_REGEX) @@ -171,8 +163,6 @@ pub fn extract_template_vals(input: &str, templates: Vec) -> Result {} // Skip unknown placeholders } - - input_idx += 1; // Move to the next piece of input } Ok(template_vals) diff --git a/packages/relayer/src/utils/utils.rs b/packages/relayer/src/utils/utils.rs index 948c83fe..80bbc4dc 100644 --- a/packages/relayer/src/utils/utils.rs +++ b/packages/relayer/src/utils/utils.rs @@ -81,9 +81,9 @@ pub fn calculate_default_hash(input: &str) -> String { } pub fn calculate_account_salt(email_addr: &str, account_code: &str) -> String { - let padded_email_addr = PaddedEmailAddr::from_email_addr(&email_addr); + let padded_email_addr = PaddedEmailAddr::from_email_addr(email_addr); let account_code = if account_code.starts_with("0x") { - hex_to_field(&account_code).unwrap() + hex_to_field(account_code).unwrap() } else { hex_to_field(&format!("0x{}", account_code)).unwrap() }; diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 00000000..a8f43d10 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,8 @@ +max_width = 100 +indent_style = "Block" +use_small_heuristics = "Default" +imports_layout = "Mixed" +imports_granularity = "Crate" +group_imports = "StdExternalCrate" +reorder_imports = true +reorder_modules = true From deba9f3e3aa0eb19089ef62eb8f436adf01b3a7d Mon Sep 17 00:00:00 2001 From: Dimitri Date: Mon, 16 Sep 2024 15:35:41 +0700 Subject: [PATCH 085/121] Move util files from ether-email-auth to utils repo --- Cargo.lock | 4 +- packages/relayer/Cargo.toml | 3 +- packages/relayer/src/chain.rs | 1 + packages/relayer/src/core.rs | 5 +- packages/relayer/src/lib.rs | 4 +- .../src/modules/web_server/rest_api.rs | 2 +- packages/relayer/src/{utils => }/strings.rs | 0 packages/relayer/src/utils/mod.rs | 10 - .../relayer/src/utils/subject_templates.rs | 236 ------------------ packages/relayer/src/utils/utils.rs | 94 ------- 10 files changed, 12 insertions(+), 347 deletions(-) rename packages/relayer/src/{utils => }/strings.rs (100%) delete mode 100644 packages/relayer/src/utils/mod.rs delete mode 100644 packages/relayer/src/utils/subject_templates.rs delete mode 100644 packages/relayer/src/utils/utils.rs diff --git a/Cargo.lock b/Cargo.lock index fa7bc496..ac64a597 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4141,7 +4141,6 @@ dependencies = [ [[package]] name = "relayer-utils" version = "0.3.7" -source = "git+https://github.com/zkemail/relayer-utils.git#c9371a327fecb422f5e0f015ebca9199a06b658f" dependencies = [ "anyhow", "base64 0.21.7", @@ -4160,6 +4159,7 @@ dependencies = [ "poseidon-rs", "rand_core", "regex", + "reqwest 0.11.27", "rsa", "serde", "serde_json", @@ -6555,7 +6555,7 @@ dependencies = [ [[package]] name = "zk-regex-apis" version = "2.1.1" -source = "git+https://github.com/zkemail/zk-regex.git#3b626316b07081378ffdca0d36ed2bec6df5b55a" +source = "git+https://github.com/zkemail/zk-regex.git#531575345558ba938675d725bd54df45c866ef74" dependencies = [ "fancy-regex", "itertools 0.13.0", diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index c55e95bf..505b5a52 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -24,7 +24,8 @@ serde_json = "1.0.68" tiny_http = "0.12.0" lettre = { version = "0.10.4", features = ["tokio1", "tokio1-native-tls"] } ethers = { version = "2.0.10", features = ["abigen"] } -relayer-utils = { version = "0.3.7", git = "https://github.com/zkemail/relayer-utils.git" } +# relayer-utils = { version = "0.3.7", git = "https://github.com/zkemail/relayer-utils.git" } +relayer-utils = { path = "../../../relayer-utils" } futures = "0.3.28" sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } regex = "1.10.2" diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index 27127ca4..0cffe7f0 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -4,6 +4,7 @@ use ethers::middleware::Middleware; use ethers::prelude::*; use ethers::signers::Signer; use relayer_utils::converters::u64_to_u8_array_32; +use relayer_utils::TemplateValue; const CONFIRMATIONS: usize = 1; diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index f1b1926f..fd4e16ae 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -10,7 +10,10 @@ use ethers::{ abi::{encode, Token}, utils::keccak256, }; -use relayer_utils::{extract_substr_idxes, generate_email_circuit_input, EmailCircuitParams, LOG}; +use relayer_utils::{ + extract_substr_idxes, extract_template_vals_from_command, generate_email_circuit_input, + generate_proof, EmailCircuitParams, LOG, +}; const DOMAIN_FIELDS: usize = 9; const COMMAND_FIELDS: usize = 20; diff --git a/packages/relayer/src/lib.rs b/packages/relayer/src/lib.rs index c9c8a781..5cc01621 100644 --- a/packages/relayer/src/lib.rs +++ b/packages/relayer/src/lib.rs @@ -8,7 +8,7 @@ pub mod config; pub mod core; pub mod database; pub mod modules; -pub mod utils; +pub mod strings; pub use abis::*; pub use chain::*; @@ -17,7 +17,7 @@ pub use core::*; pub use database::*; pub use modules::*; use relayer_utils::LOG; -pub use utils::*; +pub use strings::*; use tokio::sync::Mutex; diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 454bf088..1f520ce7 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -3,7 +3,7 @@ use anyhow::Result; use axum::Json; use hex::decode; use rand::Rng; -use relayer_utils::LOG; +use relayer_utils::{calculate_account_salt, extract_template_vals, TemplateValue, LOG}; use serde::{Deserialize, Serialize}; use std::str; diff --git a/packages/relayer/src/utils/strings.rs b/packages/relayer/src/strings.rs similarity index 100% rename from packages/relayer/src/utils/strings.rs rename to packages/relayer/src/strings.rs diff --git a/packages/relayer/src/utils/mod.rs b/packages/relayer/src/utils/mod.rs deleted file mode 100644 index 92b1cf5b..00000000 --- a/packages/relayer/src/utils/mod.rs +++ /dev/null @@ -1,10 +0,0 @@ -// TODO: Remove this once we remove the utils -#![allow(clippy::module_inception)] - -pub mod strings; -pub mod subject_templates; -pub mod utils; - -pub use strings::*; -pub use subject_templates::*; -pub use utils::*; diff --git a/packages/relayer/src/utils/subject_templates.rs b/packages/relayer/src/utils/subject_templates.rs deleted file mode 100644 index f2fe37a1..00000000 --- a/packages/relayer/src/utils/subject_templates.rs +++ /dev/null @@ -1,236 +0,0 @@ -#![allow(clippy::upper_case_acronyms)] - -use crate::*; - -use ethers::abi::{self, Token}; -use ethers::types::{Address, Bytes, I256, U256}; -use regex::Regex; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum TemplateValue { - String(String), - Uint(U256), - Int(I256), - Decimals(String), - EthAddr(Address), - Fixed(String), -} - -impl TemplateValue { - pub fn abi_encode(&self, decimal_size: Option) -> Result { - match self { - Self::String(string) => Ok(Bytes::from(abi::encode(&[Token::String(string.clone())]))), - Self::Uint(uint) => Ok(Bytes::from(abi::encode(&[Token::Uint(*uint)]))), - Self::Int(int) => Ok(Bytes::from(abi::encode(&[Token::Int(int.into_raw())]))), - Self::Decimals(string) => Ok(Bytes::from(abi::encode(&[Token::Uint( - Self::decimals_str_to_uint(string, decimal_size.unwrap_or(18)), - )]))), - Self::EthAddr(address) => Ok(Bytes::from(abi::encode(&[Token::Address(*address)]))), - Self::Fixed(string) => Err(anyhow!("Fixed value must not be passed to abi_encode")), - } - } - - pub fn decimals_str_to_uint(str: &str, decimal_size: u8) -> U256 { - let decimal_size = decimal_size as usize; - let dot = Regex::new("\\.").unwrap().find(str); - let (before_dot_str, mut after_dot_str) = match dot { - Some(dot_match) => ( - str[0..dot_match.start()].to_string(), - str[dot_match.end()..].to_string(), - ), - None => (str.to_string(), "".to_string()), - }; - assert!(after_dot_str.len() <= decimal_size); - let num_leading_zeros = decimal_size - after_dot_str.len(); - after_dot_str.push_str(&"0".repeat(num_leading_zeros)); - U256::from_dec_str(&(before_dot_str + &after_dot_str)) - .expect("composed amount string is not valid decimal") - } -} - -pub fn extract_template_vals_from_command( - input: &str, - templates: Vec, -) -> Result, anyhow::Error> { - // Convert the template to a regex pattern, escaping necessary characters and replacing placeholders - let pattern = templates - .iter() - .map(|template| match template.as_str() { - "{string}" => STRING_REGEX.to_string(), - "{uint}" => UINT_REGEX.to_string(), - "{int}" => INT_REGEX.to_string(), - "{decimals}" => DECIMALS_REGEX.to_string(), - "{ethAddr}" => ETH_ADDR_REGEX.to_string(), - _ => regex::escape(template), - }) - .collect::>() - .join("\\s+"); - - let regex = Regex::new(&pattern).map_err(|e| anyhow!("Regex compilation failed: {}", e))?; - - // Attempt to find the pattern in the input - if let Some(matched) = regex.find(input) { - // Calculate the number of bytes to skip before the match - let skipped_bytes = matched.start(); - - // Extract the values based on the matched pattern - let current_input = &input[skipped_bytes..]; - extract_template_vals(current_input, templates) - } else { - // If there's no match, return an error indicating no match was found - Err(anyhow!("Unable to match templates with input")) - } -} - -pub fn extract_template_vals(input: &str, templates: Vec) -> Result> { - let input_decomposed: Vec<&str> = input.split_whitespace().collect(); - let mut template_vals = Vec::new(); - - for (input_idx, template) in templates.iter().enumerate() { - match template.as_str() { - "{string}" => { - let string_match = Regex::new(STRING_REGEX) - .unwrap() - .find(input_decomposed[input_idx]) - .ok_or(anyhow!("No string found"))?; - if string_match.start() != 0 { - return Err(anyhow!("String must be the whole word")); - } - let mut string = string_match.as_str().to_string(); - if string.contains("
") { - string = string.split("").collect::>()[0].to_string(); - } - template_vals.push(TemplateValue::String(string)); - } - "{uint}" => { - let uint_match = Regex::new(UINT_REGEX) - .unwrap() - .find(input_decomposed[input_idx]) - .ok_or(anyhow!("No uint found"))?; - if uint_match.start() != 0 || uint_match.end() != input_decomposed[input_idx].len() - { - return Err(anyhow!("Uint must be the whole word")); - } - let mut uint_match = uint_match.as_str(); - if uint_match.contains("") { - uint_match = uint_match.split("").collect::>()[0]; - } - let uint = U256::from_dec_str(uint_match).unwrap(); - template_vals.push(TemplateValue::Uint(uint)); - } - "{int}" => { - let int_match = Regex::new(INT_REGEX) - .unwrap() - .find(input_decomposed[input_idx]) - .ok_or(anyhow!("No int found"))?; - if int_match.start() != 0 || int_match.end() != input_decomposed[input_idx].len() { - return Err(anyhow!("Int must be the whole word")); - } - let mut int_match = int_match.as_str(); - if int_match.contains("") { - int_match = int_match.split("").collect::>()[0]; - } - let int = I256::from_dec_str(int_match).unwrap(); - template_vals.push(TemplateValue::Int(int)); - } - "{decimals}" => { - let decimals_match = Regex::new(DECIMALS_REGEX) - .unwrap() - .find(input_decomposed[input_idx]) - .ok_or(anyhow!("No decimals found"))?; - if decimals_match.start() != 0 - || decimals_match.end() != input_decomposed[input_idx].len() - { - return Err(anyhow!("Decimals must be the whole word")); - } - let mut decimals = decimals_match.as_str().to_string(); - if decimals.contains("") { - decimals = decimals.split("").collect::>()[0].to_string(); - } - template_vals.push(TemplateValue::Decimals(decimals)); - } - "{ethAddr}" => { - let address_match = Regex::new(ETH_ADDR_REGEX) - .unwrap() - .find(input_decomposed[input_idx]) - .ok_or(anyhow!("No address found"))?; - if address_match.start() != 0 { - return Err(anyhow!("Address must be the whole word")); - } - let address = address_match.as_str().parse::
().unwrap(); - template_vals.push(TemplateValue::EthAddr(address)); - } - _ => {} // Skip unknown placeholders - } - } - - Ok(template_vals) -} - -// Generated by Github Copilot! -pub fn uint_to_decimal_string(uint: u128, decimal: usize) -> String { - // Convert amount to string in wei format (no decimals) - let uint_str = uint.to_string(); - let uint_length = uint_str.len(); - - // Create result vector with max length - // If less than 18 decimals, then 2 extra for "0.", otherwise one extra for "." - let mut result = vec![ - '0'; - if uint_length > decimal { - uint_length + 1 - } else { - decimal + 2 - } - ]; - let result_length = result.len(); - - // Difference between result and amount array index when copying - // If more than 18, then 1 index diff for ".", otherwise actual diff in length - let mut delta = if uint_length > decimal { - 1 - } else { - result_length - uint_length - }; - - // Boolean to indicate if we found a non-zero digit when scanning from last to first index - let mut found_non_zero_decimal = false; - - let mut actual_result_len = 0; - - // In each iteration we fill one index of result array (starting from end) - for i in (0..result_length).rev() { - // Check if we have reached the index where we need to add decimal point - if i == result_length - decimal - 1 { - // No need to add "." if there was no value in decimal places - if found_non_zero_decimal { - result[i] = '.'; - actual_result_len += 1; - } - // Set delta to 0, as we have already added decimal point (only for amount_length > 18) - delta = 0; - } - // If amountLength < 18 and we have copied everything, fill zeros - else if uint_length <= decimal && i < result_length - uint_length { - result[i] = '0'; - actual_result_len += 1; - } - // If non-zero decimal is found, or decimal point inserted (delta == 0), copy from amount array - else if found_non_zero_decimal || delta == 0 { - result[i] = uint_str.chars().nth(i - delta).unwrap(); - actual_result_len += 1; - } - // If we find non-zero decimal for the first time (trailing zeros are skipped) - else if uint_str.chars().nth(i - delta).unwrap() != '0' { - result[i] = uint_str.chars().nth(i - delta).unwrap(); - actual_result_len += 1; - found_non_zero_decimal = true; - } - } - - // Create final result string with correct length - let compact_result: String = result.into_iter().take(actual_result_len).collect(); - - compact_result -} diff --git a/packages/relayer/src/utils/utils.rs b/packages/relayer/src/utils/utils.rs deleted file mode 100644 index 80bbc4dc..00000000 --- a/packages/relayer/src/utils/utils.rs +++ /dev/null @@ -1,94 +0,0 @@ -#![allow(clippy::upper_case_acronyms)] -#![allow(clippy::identity_op)] - -use crate::*; -use ethers::abi::Token; -use ethers::types::{Bytes, U256}; - -use ::serde::Deserialize; - -use relayer_utils::*; -use std::collections::hash_map::DefaultHasher; -use std::hash::{Hash, Hasher}; - -#[derive(Debug, Clone, Deserialize)] -pub struct ProverRes { - proof: ProofJson, - pub_signals: Vec, -} - -#[derive(Debug, Clone, Deserialize)] -pub struct ProofJson { - pi_a: Vec, - pi_b: Vec>, - pi_c: Vec, -} - -impl ProofJson { - pub fn to_eth_bytes(&self) -> Result { - let pi_a = Token::FixedArray(vec![ - Token::Uint(U256::from_dec_str(self.pi_a[0].as_str())?), - Token::Uint(U256::from_dec_str(self.pi_a[1].as_str())?), - ]); - let pi_b = Token::FixedArray(vec![ - Token::FixedArray(vec![ - Token::Uint(U256::from_dec_str(self.pi_b[0][1].as_str())?), - Token::Uint(U256::from_dec_str(self.pi_b[0][0].as_str())?), - ]), - Token::FixedArray(vec![ - Token::Uint(U256::from_dec_str(self.pi_b[1][1].as_str())?), - Token::Uint(U256::from_dec_str(self.pi_b[1][0].as_str())?), - ]), - ]); - let pi_c = Token::FixedArray(vec![ - Token::Uint(U256::from_dec_str(self.pi_c[0].as_str())?), - Token::Uint(U256::from_dec_str(self.pi_c[1].as_str())?), - ]); - Ok(Bytes::from(abi::encode(&[pi_a, pi_b, pi_c]))) - } -} - -pub async fn generate_proof( - input: &str, - request: &str, - address: &str, -) -> Result<(Bytes, Vec)> { - let client = reqwest::Client::new(); - info!(LOG, "prover input {}", input); - let res = client - .post(format!("{}/prove/{}", address, request)) - .json(&serde_json::json!({ "input": input })) - .send() - .await? - .error_for_status()?; - let res_json = res.json::().await?; - info!(LOG, "prover response {:?}", res_json); - let proof = res_json.proof.to_eth_bytes()?; - let pub_signals = res_json - .pub_signals - .into_iter() - .map(|str| U256::from_dec_str(&str).expect("pub signal should be u256")) - .collect(); - Ok((proof, pub_signals)) -} - -pub fn calculate_default_hash(input: &str) -> String { - let mut hasher = DefaultHasher::new(); - input.hash(&mut hasher); - let hash_code = hasher.finish(); - - hash_code.to_string() -} - -pub fn calculate_account_salt(email_addr: &str, account_code: &str) -> String { - let padded_email_addr = PaddedEmailAddr::from_email_addr(email_addr); - let account_code = if account_code.starts_with("0x") { - hex_to_field(account_code).unwrap() - } else { - hex_to_field(&format!("0x{}", account_code)).unwrap() - }; - let account_code = AccountCode::from(account_code); - let account_salt = AccountSalt::new(&padded_email_addr, account_code).unwrap(); - - field_to_hex(&account_salt.0) -} From 2d3347a2d5d3e615cdd4ad8cb7103e971bb4b6ae Mon Sep 17 00:00:00 2001 From: Dimitri Date: Mon, 16 Sep 2024 16:19:30 +0700 Subject: [PATCH 086/121] Fix relayer-utils version to refactor commit --- packages/relayer/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 505b5a52..2240108a 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -25,7 +25,7 @@ tiny_http = "0.12.0" lettre = { version = "0.10.4", features = ["tokio1", "tokio1-native-tls"] } ethers = { version = "2.0.10", features = ["abigen"] } # relayer-utils = { version = "0.3.7", git = "https://github.com/zkemail/relayer-utils.git" } -relayer-utils = { path = "../../../relayer-utils" } +relayer-utils = { rev = "94d78d6", git = "https://github.com/zkemail/relayer-utils.git" } futures = "0.3.28" sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } regex = "1.10.2" From 19bd27e045279c1075ff583fd60b6758acf3ec39 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Tue, 17 Sep 2024 15:41:17 +0700 Subject: [PATCH 087/121] Force db initialization on startup --- Cargo.lock | 1 + packages/relayer/src/database.rs | 25 ++++++++++++++- packages/relayer/src/lib.rs | 32 ++++++++++++------- .../relayer/src/modules/web_server/server.rs | 17 ++++++++++ 4 files changed, 63 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac64a597..212f8687 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4141,6 +4141,7 @@ dependencies = [ [[package]] name = "relayer-utils" version = "0.3.7" +source = "git+https://github.com/zkemail/relayer-utils.git?rev=94d78d6#94d78d67862b6d6c15bebac66d184c7557f6aff5" dependencies = [ "anyhow", "base64 0.21.7", diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs index 5dd0fbb9..1af6a220 100644 --- a/packages/relayer/src/database.rs +++ b/packages/relayer/src/database.rs @@ -73,6 +73,28 @@ impl Database { Ok(()) } + pub(crate) async fn test_db_connection(&self) -> Result<()> { + // Try up to 3 times + for i in 1..4 { + match sqlx::query("SELECT 1").execute(&self.db).await { + Ok(_) => { + info!(LOG, "Connected successfully to database"); + return Ok(()); + } + Err(e) => { + error!( + LOG, + "Failed to initialize connection to the database: {:?}. Retrying...", e + ); + tokio::time::sleep(Duration::from_secs(i * i)).await; + } + } + } + Err(anyhow::anyhow!( + "Failed to initialize database connection after 3 attempts" + )) + } + pub(crate) async fn get_credentials(&self, account_code: &str) -> Result> { let row = sqlx::query("SELECT * FROM credentials WHERE account_code = $1") .bind(account_code) @@ -326,6 +348,7 @@ impl Database { &self, row: &Request, ) -> std::result::Result<(), DatabaseError> { + let request_id = row.request_id; let row = sqlx::query( "INSERT INTO requests (request_id, account_eth_addr, controller_eth_addr, guardian_email_addr, is_for_recovery, template_idx, is_processed, is_success, email_nullifier, account_salt) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *", ) @@ -342,7 +365,7 @@ impl Database { .fetch_one(&self.db) .await .map_err(|e| DatabaseError::new("Failed to insert request", e))?; - info!(LOG, "Request inserted"); + info!(LOG, "Request inserted with request_id: {}", request_id); Ok(()) } } diff --git a/packages/relayer/src/lib.rs b/packages/relayer/src/lib.rs index 5cc01621..42348138 100644 --- a/packages/relayer/src/lib.rs +++ b/packages/relayer/src/lib.rs @@ -19,7 +19,7 @@ pub use modules::*; use relayer_utils::LOG; pub use strings::*; -use tokio::sync::Mutex; +use tokio::sync::{Mutex, OnceCell}; use anyhow::{anyhow, Result}; use dotenv::dotenv; @@ -44,17 +44,27 @@ pub static EMAIL_TEMPLATES: OnceLock = OnceLock::new(); pub static RELAYER_EMAIL_ADDRESS: OnceLock = OnceLock::new(); pub static SMTP_SERVER: OnceLock = OnceLock::new(); +static DB_CELL: OnceCell> = OnceCell::const_new(); + +struct DBWrapper; + +impl DBWrapper { + fn get() -> &'static Arc { + DB_CELL.get().expect("Database not initialized") + } +} + +impl std::ops::Deref for DBWrapper { + type Target = Database; + + fn deref(&self) -> &Self::Target { + &**Self::get() + } +} + +static DB: DBWrapper = DBWrapper; + lazy_static! { - pub static ref DB: Arc = { - dotenv().ok(); - let db = tokio::task::block_in_place(|| { - tokio::runtime::Runtime::new() - .unwrap() - .block_on(Database::open(&env::var(DATABASE_PATH_KEY).unwrap())) - }) - .unwrap(); - Arc::new(db) - }; pub static ref CLIENT: Arc = { dotenv().ok(); let client = tokio::task::block_in_place(|| { diff --git a/packages/relayer/src/modules/web_server/server.rs b/packages/relayer/src/modules/web_server/server.rs index fbf85e77..f96afb12 100644 --- a/packages/relayer/src/modules/web_server/server.rs +++ b/packages/relayer/src/modules/web_server/server.rs @@ -6,6 +6,23 @@ use tower_http::cors::{AllowHeaders, AllowMethods, Any, CorsLayer}; pub async fn run_server() -> Result<()> { let addr = WEB_SERVER_ADDRESS.get().unwrap(); + DB_CELL + .get_or_init(|| async { + dotenv::dotenv().ok(); + let db = Database::open(&std::env::var("DATABASE_URL").unwrap()) + .await + .unwrap(); + Arc::new(db) + }) + .await; + + info!(LOG, "Testing connection to database"); + if let Err(e) = DB.test_db_connection().await { + error!(LOG, "Failed to initialize db with e: {}", e); + panic!("Forcing panic, since connection to DB could not be established"); + }; + info!(LOG, "Testing connection to database successfull"); + let mut app = Router::new() .route( "/api/echo", From adcefd6e504b1de4d84961653e63b14b5b09879d Mon Sep 17 00:00:00 2001 From: Dimitri Date: Wed, 18 Sep 2024 11:29:01 +0700 Subject: [PATCH 088/121] AI generated doc comments --- packages/relayer/src/chain.rs | 171 ++++++++++++++++++ packages/relayer/src/core.rs | 9 + packages/relayer/src/database.rs | 24 +++ packages/relayer/src/modules/dkim.rs | 43 +++++ packages/relayer/src/modules/mail.rs | 37 ++++ .../relayer/src/modules/web_server/mod.rs | 2 + .../src/modules/web_server/rest_api.rs | 64 ++++++- .../relayer/src/modules/web_server/server.rs | 5 + 8 files changed, 354 insertions(+), 1 deletion(-) diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index 0cffe7f0..d3df1e62 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -16,6 +16,11 @@ pub struct ChainClient { } impl ChainClient { + /// Sets up a new ChainClient. + /// + /// # Returns + /// + /// A `Result` containing the new `ChainClient` if successful, or an error if not. pub async fn setup() -> Result { let wallet: LocalWallet = PRIVATE_KEY.get().unwrap().parse()?; let provider = Provider::::try_from(CHAIN_RPC_PROVIDER.get().unwrap())?; @@ -28,6 +33,19 @@ impl ChainClient { Ok(Self { client }) } + /// Sets the DKIM public key hash. + /// + /// # Arguments + /// + /// * `selector` - The selector string. + /// * `domain_name` - The domain name. + /// * `public_key_hash` - The public key hash as a 32-byte array. + /// * `signature` - The signature as Bytes. + /// * `dkim` - The ECDSA Owned DKIM Registry. + /// + /// # Returns + /// + /// A `Result` containing the transaction hash as a String if successful, or an error if not. pub async fn set_dkim_public_key_hash( &self, selector: String, @@ -52,6 +70,17 @@ impl ChainClient { Ok(tx_hash) } + /// Checks if a DKIM public key hash is valid. + /// + /// # Arguments + /// + /// * `domain_name` - The domain name. + /// * `public_key_hash` - The public key hash as a 32-byte array. + /// * `dkim` - The ECDSA Owned DKIM Registry. + /// + /// # Returns + /// + /// A `Result` containing a boolean indicating if the hash is valid. pub async fn check_if_dkim_public_key_hash_valid( &self, domain_name: ::std::string::String, @@ -65,6 +94,15 @@ impl ChainClient { Ok(is_valid) } + /// Gets the DKIM from a wallet. + /// + /// # Arguments + /// + /// * `controller_eth_addr` - The controller Ethereum address as a string. + /// + /// # Returns + /// + /// A `Result` containing the ECDSA Owned DKIM Registry if successful, or an error if not. pub async fn get_dkim_from_wallet( &self, controller_eth_addr: &str, @@ -75,6 +113,15 @@ impl ChainClient { Ok(ECDSAOwnedDKIMRegistry::new(dkim, self.client.clone())) } + /// Gets the DKIM from an email auth address. + /// + /// # Arguments + /// + /// * `email_auth_addr` - The email auth address as a string. + /// + /// # Returns + /// + /// A `Result` containing the ECDSA Owned DKIM Registry if successful, or an error if not. pub async fn get_dkim_from_email_auth( &self, email_auth_addr: &str, @@ -86,6 +133,17 @@ impl ChainClient { Ok(ECDSAOwnedDKIMRegistry::new(dkim, self.client.clone())) } + /// Gets the email auth address from a wallet. + /// + /// # Arguments + /// + /// * `controller_eth_addr` - The controller Ethereum address as a string. + /// * `wallet_addr` - The wallet address as a string. + /// * `account_salt` - The account salt as a string. + /// + /// # Returns + /// + /// A `Result` containing the email auth address as H160 if successful, or an error if not. pub async fn get_email_auth_addr_from_wallet( &self, controller_eth_addr: &str, @@ -108,6 +166,15 @@ impl ChainClient { Ok(email_auth_addr) } + /// Checks if a wallet is deployed. + /// + /// # Arguments + /// + /// * `wallet_addr_str` - The wallet address as a string. + /// + /// # Returns + /// + /// A `Result` containing a boolean indicating if the wallet is deployed. pub async fn is_wallet_deployed(&self, wallet_addr_str: &str) -> Result { let wallet_addr: H160 = wallet_addr_str.parse().map_err(ChainError::HexError)?; match self.client.get_code(wallet_addr, None).await { @@ -122,6 +189,16 @@ impl ChainClient { } } + /// Gets the acceptance command templates. + /// + /// # Arguments + /// + /// * `controller_eth_addr` - The controller Ethereum address as a string. + /// * `template_idx` - The template index. + /// + /// # Returns + /// + /// A `Result` containing a vector of acceptance command templates. pub async fn get_acceptance_command_templates( &self, controller_eth_addr: &str, @@ -140,6 +217,16 @@ impl ChainClient { Ok(templates[template_idx as usize].clone()) } + /// Gets the recovery command templates. + /// + /// # Arguments + /// + /// * `controller_eth_addr` - The controller Ethereum address as a string. + /// * `template_idx` - The template index. + /// + /// # Returns + /// + /// A `Result` containing a vector of recovery command templates. pub async fn get_recovery_command_templates( &self, controller_eth_addr: &str, @@ -158,6 +245,17 @@ impl ChainClient { Ok(templates[template_idx as usize].clone()) } + /// Completes the recovery process. + /// + /// # Arguments + /// + /// * `controller_eth_addr` - The controller Ethereum address as a string. + /// * `account_eth_addr` - The account Ethereum address as a string. + /// * `complete_calldata` - The complete calldata as a string. + /// + /// # Returns + /// + /// A `Result` containing a boolean indicating if the recovery was successful. pub async fn complete_recovery( &self, controller_eth_addr: &str, @@ -207,6 +305,17 @@ impl ChainClient { .unwrap_or(false)) } + /// Handles the acceptance process. + /// + /// # Arguments + /// + /// * `controller_eth_addr` - The controller Ethereum address as a string. + /// * `email_auth_msg` - The email authentication message. + /// * `template_idx` - The template index. + /// + /// # Returns + /// + /// A `Result` containing a boolean indicating if the acceptance was successful. pub async fn handle_acceptance( &self, controller_eth_addr: &str, @@ -238,6 +347,17 @@ impl ChainClient { .unwrap_or(false)) } + /// Handles the recovery process. + /// + /// # Arguments + /// + /// * `controller_eth_addr` - The controller Ethereum address as a string. + /// * `email_auth_msg` - The email authentication message. + /// * `template_idx` - The template index. + /// + /// # Returns + /// + /// A `Result` containing a boolean indicating if the recovery was successful. pub async fn handle_recovery( &self, controller_eth_addr: &str, @@ -266,6 +386,15 @@ impl ChainClient { .unwrap_or(false)) } + /// Gets the bytecode of a wallet. + /// + /// # Arguments + /// + /// * `wallet_addr` - The wallet address as a string. + /// + /// # Returns + /// + /// A `Result` containing the bytecode as Bytes. pub async fn get_bytecode(&self, wallet_addr: &str) -> std::result::Result { let wallet_address: H160 = wallet_addr.parse().map_err(ChainError::HexError)?; let client_code = self @@ -276,6 +405,16 @@ impl ChainClient { Ok(client_code) } + /// Gets the storage at a specific slot for a wallet. + /// + /// # Arguments + /// + /// * `wallet_addr` - The wallet address as a string. + /// * `slot` - The storage slot. + /// + /// # Returns + /// + /// A `Result` containing the storage value as H256. pub async fn get_storage_at( &self, wallet_addr: &str, @@ -288,6 +427,17 @@ impl ChainClient { .await?) } + /// Gets the recovered account from an acceptance command. + /// + /// # Arguments + /// + /// * `controller_eth_addr` - The controller Ethereum address as a string. + /// * `command_params` - The command parameters. + /// * `template_idx` - The template index. + /// + /// # Returns + /// + /// A `Result` containing the recovered account address as H160. pub async fn get_recovered_account_from_acceptance_command( &self, controller_eth_addr: &str, @@ -320,6 +470,17 @@ impl ChainClient { Ok(recovered_account) } + /// Gets the recovered account from a recovery command. + /// + /// # Arguments + /// + /// * `controller_eth_addr` - The controller Ethereum address as a string. + /// * `command_params` - The command parameters. + /// * `template_idx` - The template index. + /// + /// # Returns + /// + /// A `Result` containing the recovered account address as H160. pub async fn get_recovered_account_from_recovery_command( &self, controller_eth_addr: &str, @@ -353,6 +514,16 @@ impl ChainClient { Ok(recovered_account) } + /// Checks if an account is activated. + /// + /// # Arguments + /// + /// * `controller_eth_addr` - The controller Ethereum address as a string. + /// * `account_eth_addr` - The account Ethereum address as a string. + /// + /// # Returns + /// + /// A `Result` containing a boolean indicating if the account is activated. pub async fn get_is_activated( &self, controller_eth_addr: &str, diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index fd4e16ae..43986c63 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -19,6 +19,15 @@ const DOMAIN_FIELDS: usize = 9; const COMMAND_FIELDS: usize = 20; const EMAIL_ADDR_FIELDS: usize = 9; +/// Handles an incoming email for authentication or recovery. +/// +/// # Arguments +/// +/// * `email` - The raw email string to be processed. +/// +/// # Returns +/// +/// A `Result` containing an `EmailAuthEvent` on success, or an `EmailError` on failure. pub async fn handle_email(email: String) -> Result { let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; trace!(LOG, "email: {}", email); diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs index 1af6a220..59984139 100644 --- a/packages/relayer/src/database.rs +++ b/packages/relayer/src/database.rs @@ -30,6 +30,15 @@ pub struct Database { } impl Database { + /// Opens a new database connection. + /// + /// # Arguments + /// + /// * `path` - The connection string for the database. + /// + /// # Returns + /// + /// A `Result` containing the `Database` struct if successful, or an error if the connection fails. pub async fn open(path: &str) -> Result { let res = Self { db: PgPool::connect(path) @@ -42,6 +51,11 @@ impl Database { Ok(res) } + /// Sets up the database by creating necessary tables if they don't exist. + /// + /// # Returns + /// + /// A `Result` indicating success or failure of the setup process. pub async fn setup_database(&self) -> Result<()> { sqlx::query( "CREATE TABLE IF NOT EXISTS credentials ( @@ -208,6 +222,16 @@ impl Database { Ok(()) } + /// Checks if a guardian is set for a given account and email address. + /// + /// # Arguments + /// + /// * `account_eth_addr` - The Ethereum address of the account. + /// * `guardian_email_addr` - The email address of the guardian. + /// + /// # Returns + /// + /// A `Result` containing a boolean indicating whether the guardian is set. pub async fn is_guardian_set( &self, account_eth_addr: &str, diff --git a/packages/relayer/src/modules/dkim.rs b/packages/relayer/src/modules/dkim.rs index b1d29c26..21ae7d30 100644 --- a/packages/relayer/src/modules/dkim.rs +++ b/packages/relayer/src/modules/dkim.rs @@ -30,6 +30,16 @@ pub struct SignedDkimPublicKey { } impl<'a> DkimOracleClient<'a> { + /// Generates an agent for the DKIM Oracle Client. + /// + /// # Arguments + /// + /// * `pem_path` - The path to the PEM file. + /// * `replica_url` - The URL of the replica. + /// + /// # Returns + /// + /// An `anyhow::Result`. pub fn gen_agent(pem_path: &str, replica_url: &str) -> anyhow::Result { let identity = Secp256k1Identity::from_pem_file(pem_path)?; let transport = ReqwestTransport::create(replica_url)?; @@ -40,6 +50,16 @@ impl<'a> DkimOracleClient<'a> { Ok(agent) } + /// Creates a new DkimOracleClient. + /// + /// # Arguments + /// + /// * `canister_id` - The ID of the canister. + /// * `agent` - The agent to use for communication. + /// + /// # Returns + /// + /// An `anyhow::Result`. pub fn new(canister_id: &str, agent: &'a Agent) -> anyhow::Result { let canister = CanisterBuilder::new() .with_canister_id(canister_id) @@ -48,6 +68,16 @@ impl<'a> DkimOracleClient<'a> { Ok(Self { canister }) } + /// Requests a signature for a DKIM public key. + /// + /// # Arguments + /// + /// * `selector` - The selector for the DKIM key. + /// * `domain` - The domain for the DKIM key. + /// + /// # Returns + /// + /// An `anyhow::Result`. pub async fn request_signature( &self, selector: &str, @@ -67,6 +97,19 @@ impl<'a> DkimOracleClient<'a> { } } +/// Checks and updates the DKIM for a given email. +/// +/// # Arguments +/// +/// * `email` - The email address. +/// * `parsed_email` - The parsed email data. +/// * `controller_eth_addr` - The Ethereum address of the controller. +/// * `wallet_addr` - The address of the wallet. +/// * `account_salt` - The salt for the account. +/// +/// # Returns +/// +/// A `Result<()>`. pub async fn check_and_update_dkim( email: &str, parsed_email: &ParsedEmail, diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs index ffc15d8e..c90b6d87 100644 --- a/packages/relayer/src/modules/mail.rs +++ b/packages/relayer/src/modules/mail.rs @@ -80,6 +80,15 @@ pub struct EmailAttachment { pub contents: Vec, } +/// Handles all possible email events and requests. +/// +/// # Arguments +/// +/// * `event` - The `EmailAuthEvent` to be handled. +/// +/// # Returns +/// +/// A `Result` indicating success or an `EmailError`. pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> { match event { EmailAuthEvent::AcceptanceRequest { @@ -378,6 +387,16 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> Ok(()) } +/// Renders an HTML template with the given data. +/// +/// # Arguments +/// +/// * `template_name` - The name of the template file. +/// * `render_data` - The data to be used in rendering the template. +/// +/// # Returns +/// +/// A `Result` containing the rendered HTML string or an `EmailError`. pub async fn render_html(template_name: &str, render_data: Value) -> Result { let email_template_filename = PathBuf::new() .join(EMAIL_TEMPLATES.get().unwrap()) @@ -397,6 +416,15 @@ pub async fn render_html(template_name: &str, render_data: Value) -> Result` with the parsed error message. pub fn parse_error(error: String) -> Result> { let mut error = error; if error.contains("Contract call reverted with data: ") { @@ -420,6 +448,15 @@ pub fn parse_error(error: String) -> Result> { } } +/// Sends an email using the configured SMTP server. +/// +/// # Arguments +/// +/// * `email` - The `EmailMessage` to be sent. +/// +/// # Returns +/// +/// A `Result` indicating success or an `EmailError`. pub async fn send_email(email: EmailMessage) -> Result<(), EmailError> { let smtp_server = SMTP_SERVER.get().unwrap(); diff --git a/packages/relayer/src/modules/web_server/mod.rs b/packages/relayer/src/modules/web_server/mod.rs index 35ed632a..3a48beb6 100644 --- a/packages/relayer/src/modules/web_server/mod.rs +++ b/packages/relayer/src/modules/web_server/mod.rs @@ -1,3 +1,5 @@ +//! This module contains the axum web server and its routes and custom errors. + pub mod relayer_errors; pub mod rest_api; pub mod server; diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 1f520ce7..df9bce37 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -7,7 +7,15 @@ use relayer_utils::{calculate_account_salt, extract_template_vals, TemplateValue use serde::{Deserialize, Serialize}; use std::str; -// Create request status API +/// Retrieves the status of a request. +/// +/// # Arguments +/// +/// * `payload` - A JSON payload containing the request ID. +/// +/// # Returns +/// +/// A `Result` containing a JSON `RequestStatusResponse` or an `ApiError`. pub async fn request_status_api( Json(payload): Json, ) -> Result, ApiError> { @@ -33,6 +41,15 @@ pub async fn request_status_api( })) } +/// Handles an acceptance request for a wallet. +/// +/// # Arguments +/// +/// * `payload` - A JSON payload containing the acceptance request details. +/// +/// # Returns +/// +/// A `Result` containing a JSON `AcceptanceResponse` or an `ApiError`. pub async fn handle_acceptance_request( Json(payload): Json, ) -> Result, ApiError> { @@ -193,6 +210,15 @@ pub async fn handle_acceptance_request( })) } +/// Handles a recovery request for a wallet. +/// +/// # Arguments +/// +/// * `payload` - A JSON payload containing the recovery request details. +/// +/// # Returns +/// +/// A `Result` containing a JSON `RecoveryResponse` or an `ApiError`. pub async fn handle_recovery_request( Json(payload): Json, ) -> Result, ApiError> { @@ -386,6 +412,15 @@ pub async fn handle_recovery_request( })) } +/// Handles the completion of a recovery request. +/// +/// # Arguments +/// +/// * `payload` - A JSON payload containing the complete recovery request details. +/// +/// # Returns +/// +/// A `Result` containing a `String` message or an `ApiError`. pub async fn handle_complete_recovery_request( Json(payload): Json, ) -> Result { @@ -425,6 +460,15 @@ pub async fn handle_complete_recovery_request( } } +/// Retrieves the account salt for a given email address and account code. +/// +/// # Arguments +/// +/// * `payload` - A JSON payload containing the email address and account code. +/// +/// # Returns +/// +/// A `Result` containing the account salt as a `String` or an `ApiError`. pub async fn get_account_salt( Json(payload): Json, ) -> Result { @@ -433,6 +477,15 @@ pub async fn get_account_salt( Ok(account_salt) } +/// Marks a guardian as inactive for a given wallet. +/// +/// # Arguments +/// +/// * `payload` - A JSON payload containing the account and controller Ethereum addresses. +/// +/// # Returns +/// +/// A `Result` containing a `String` message or an `ApiError`. pub async fn inactive_guardian( Json(payload): Json, ) -> Result { @@ -472,6 +525,15 @@ fn parse_error_message(error_data: String) -> String { format!("Failed to parse contract error: {}", error_data) } +/// Receives and processes an email. +/// +/// # Arguments +/// +/// * `email` - The raw email as a `String`. +/// +/// # Returns +/// +/// A `Result` containing `()` or an `ApiError`. pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { println!("receive_email_api_fn"); let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; diff --git a/packages/relayer/src/modules/web_server/server.rs b/packages/relayer/src/modules/web_server/server.rs index f96afb12..594ee4c5 100644 --- a/packages/relayer/src/modules/web_server/server.rs +++ b/packages/relayer/src/modules/web_server/server.rs @@ -3,6 +3,11 @@ use axum::{routing::post, Router}; use relayer_utils::LOG; use tower_http::cors::{AllowHeaders, AllowMethods, Any, CorsLayer}; +/// Runs the server and sets up the API routes. +/// +/// # Returns +/// +/// A `Result` indicating success or failure. pub async fn run_server() -> Result<()> { let addr = WEB_SERVER_ADDRESS.get().unwrap(); From 69d7b3cb8d70d4e54eb49b36b8aa4bf1a805194a Mon Sep 17 00:00:00 2001 From: Dimitri Date: Thu, 19 Sep 2024 12:44:44 +0700 Subject: [PATCH 089/121] Prevent duplicates by checking if it is a valid reply --- Cargo.lock | 2 +- packages/relayer/Cargo.toml | 3 +- packages/relayer/src/database.rs | 48 ++++++++++++ packages/relayer/src/modules/mail.rs | 74 ++++++++++++++++--- .../src/modules/web_server/rest_api.rs | 41 ++-------- 5 files changed, 120 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 212f8687..b060b89f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4141,7 +4141,6 @@ dependencies = [ [[package]] name = "relayer-utils" version = "0.3.7" -source = "git+https://github.com/zkemail/relayer-utils.git?rev=94d78d6#94d78d67862b6d6c15bebac66d184c7557f6aff5" dependencies = [ "anyhow", "base64 0.21.7", @@ -4153,6 +4152,7 @@ dependencies = [ "hmac-sha256", "itertools 0.10.5", "lazy_static", + "mailparse", "neon", "num-bigint", "num-traits", diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 2240108a..30d0bb2b 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -25,7 +25,8 @@ tiny_http = "0.12.0" lettre = { version = "0.10.4", features = ["tokio1", "tokio1-native-tls"] } ethers = { version = "2.0.10", features = ["abigen"] } # relayer-utils = { version = "0.3.7", git = "https://github.com/zkemail/relayer-utils.git" } -relayer-utils = { rev = "94d78d6", git = "https://github.com/zkemail/relayer-utils.git" } +# relayer-utils = { rev = "94d78d6", git = "https://github.com/zkemail/relayer-utils.git" } +relayer-utils = { path = "../../../relayer-utils" } futures = "0.3.28" sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } regex = "1.10.2" diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs index 59984139..93de8ee1 100644 --- a/packages/relayer/src/database.rs +++ b/packages/relayer/src/database.rs @@ -84,6 +84,17 @@ impl Database { ) .execute(&self.db) .await?; + + sqlx::query( + "CREATE TABLE IF NOT EXISTS expected_replies ( + message_id VARCHAR(255) PRIMARY KEY, + request_id VARCHAR(255), + has_reply BOOLEAN DEFAULT FALSE, + created_at TIMESTAMP DEFAULT (NOW() AT TIME ZONE 'UTC') + );", + ) + .execute(&self.db) + .await?; Ok(()) } @@ -392,4 +403,41 @@ impl Database { info!(LOG, "Request inserted with request_id: {}", request_id); Ok(()) } + + pub(crate) async fn add_expected_reply( + &self, + message_id: &str, + request_id: Option, + ) -> Result<(), DatabaseError> { + let query = " + INSERT INTO expected_replies (message_id, request_id) + VALUES ($1, $2); + "; + sqlx::query(query) + .bind(message_id) + .bind(request_id) + .execute(&self.db) + .await + .map_err(|e| DatabaseError::new("Failed to insert expected_reply", e))?; + Ok(()) + } + + // Checks if the given message_id corresponds to a valid reply. + // This function updates the `has_reply` field to true if the message_id exists and hasn't been replied to yet. + // Returns true if the update was successful (i.e., a valid reply was recorded), false otherwise, + // also if no record exists to be updated. + pub(crate) async fn is_valid_reply(&self, message_id: &str) -> Result { + let query = " + UPDATE expected_replies + SET has_reply = true + WHERE message_id = $1 AND has_reply = false + RETURNING *; + "; + let result = sqlx::query(query) + .bind(message_id) + .execute(&self.db) + .await + .map_err(|e| DatabaseError::new("Failed to validate reply", e))?; + Ok(result.rows_affected() > 0) + } } diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs index c90b6d87..d0fd85f7 100644 --- a/packages/relayer/src/modules/mail.rs +++ b/packages/relayer/src/modules/mail.rs @@ -129,7 +129,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> body_attachments: None, }; - send_email(email).await?; + send_email(email, Some(ExpectsReply::new(request_id))).await?; } EmailAuthEvent::Error { email_addr, @@ -161,7 +161,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> body_attachments: None, }; - send_email(email).await?; + send_email(email, None).await?; } EmailAuthEvent::GuardianAlreadyExists { account_eth_addr, @@ -190,7 +190,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> body_attachments: None, }; - send_email(email).await?; + send_email(email, None).await?; } EmailAuthEvent::RecoveryRequest { account_eth_addr, @@ -226,7 +226,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> body_attachments: None, }; - send_email(email).await?; + send_email(email, Some(ExpectsReply::new(request_id))).await?; } EmailAuthEvent::AcceptanceSuccess { account_eth_addr, @@ -259,7 +259,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> body_attachments: None, }; - send_email(email).await?; + send_email(email, None).await?; } EmailAuthEvent::RecoverySuccess { account_eth_addr, @@ -292,7 +292,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> body_attachments: None, }; - send_email(email).await?; + send_email(email, None).await?; } EmailAuthEvent::GuardianNotSet { account_eth_addr, @@ -317,7 +317,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> body_attachments: None, }; - send_email(email).await?; + send_email(email, None).await?; } EmailAuthEvent::GuardianNotRegistered { account_eth_addr, @@ -355,7 +355,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> body_attachments: None, }; - send_email(email).await?; + send_email(email, Some(ExpectsReply::new(request_id))).await?; } EmailAuthEvent::Ack { email_addr, @@ -379,7 +379,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> reply_to: original_message_id, body_attachments: None, }; - send_email(email).await?; + send_email(email, None).await?; } EmailAuthEvent::NoOp => {} } @@ -457,7 +457,10 @@ pub fn parse_error(error: String) -> Result> { /// # Returns /// /// A `Result` indicating success or an `EmailError`. -pub async fn send_email(email: EmailMessage) -> Result<(), EmailError> { +pub async fn send_email( + email: EmailMessage, + expects_reply: Option, +) -> Result<(), EmailError> { let smtp_server = SMTP_SERVER.get().unwrap(); // Send POST request to email server @@ -476,5 +479,56 @@ pub async fn send_email(email: EmailMessage) -> Result<(), EmailError> { ))); } + if let Some(expects_reply) = expects_reply { + let response_body: EmailResponse = response + .json() + .await + .map_err(|e| EmailError::Parse(format!("Failed to parse response JSON: {}", e)))?; + + let message_id = response_body.message_id; + DB.add_expected_reply(&message_id, expects_reply.request_id) + .await?; + } + Ok(()) } + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct EmailResponse { + status: String, + message_id: String, +} + +pub struct ExpectsReply { + request_id: Option, +} + +impl ExpectsReply { + fn new(request_id: u32) -> Self { + Self { + request_id: Some(request_id.to_string()), + } + } + + fn new_no_request_id() -> Self { + Self { request_id: None } + } +} + +/// Checks if the email is a reply to a command that expects a reply. +/// Will return false for duplicate replies. +/// Will return true if the email is not a reply. +pub async fn check_is_valid_request(email: &ParsedEmail) -> Result { + let reply_message_id = match email + .headers + .get_header("In-Reply-To") + .and_then(|v| v.first().cloned()) + { + Some(id) => id, + // Email is not a reply + None => return Ok(true), + }; + + let is_valid = DB.is_valid_reply(&reply_message_id).await?; + Ok(is_valid) +} diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index df9bce37..add61e88 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -19,7 +19,6 @@ use std::str; pub async fn request_status_api( Json(payload): Json, ) -> Result, ApiError> { - println!("requesting status"); let row = DB.get_request(payload.request_id).await?; let status = if let Some(ref row) = row { if row.is_processed { @@ -53,7 +52,6 @@ pub async fn request_status_api( pub async fn handle_acceptance_request( Json(payload): Json, ) -> Result, ApiError> { - println!("handle_acceptance_request"); let command_template = CLIENT .get_acceptance_command_templates(&payload.controller_eth_addr, payload.template_idx) .await?; @@ -222,15 +220,12 @@ pub async fn handle_acceptance_request( pub async fn handle_recovery_request( Json(payload): Json, ) -> Result, ApiError> { - println!("handle_recovery_request: {:?}", payload); let command_template = CLIENT .get_recovery_command_templates(&payload.controller_eth_addr, payload.template_idx) .await?; - println!("command_template: {:?}", command_template); let command_params = extract_template_vals(&payload.command, command_template) .map_err(|_| ApiError::Validation("Invalid command".to_string()))?; - println!("command_params"); let account_eth_addr = CLIENT .get_recovered_account_from_recovery_command( @@ -240,22 +235,15 @@ pub async fn handle_recovery_request( ) .await?; - println!("account_eth_addr"); - let account_eth_addr = format!("0x{:x}", account_eth_addr); - println!("account_eth_addr"); if !CLIENT.is_wallet_deployed(&account_eth_addr).await? { return Err(ApiError::Validation("Wallet not deployed".to_string())); } - println!("wallet is deployed"); - // Check if hash of bytecode of proxy contract is equal or not let bytecode = CLIENT.get_bytecode(&account_eth_addr).await?; - println!("bytecode"); let bytecode_hash = format!("0x{}", hex::encode(keccak256(bytecode.as_ref()))); - println!("bytecode_hash"); // let permitted_wallets: Vec = // serde_json::from_str(include_str!("../../permitted_wallets.json")).unwrap(); @@ -304,37 +292,24 @@ pub async fn handle_recovery_request( // } let mut request_id = rand::thread_rng().gen::(); - println!("got request_id"); while let Ok(Some(request)) = DB.get_request(request_id).await { request_id = rand::thread_rng().gen::(); } - println!("got request: {:?}", request_id); - println!("account_eth_addr: {:?}", account_eth_addr); - println!( - "payload.guardian_email_addr: {:?}", - payload.guardian_email_addr - ); - let account = DB .get_credentials_from_wallet_and_email(&account_eth_addr, &payload.guardian_email_addr) .await?; - println!("got account: {:?}", account); - let account_salt = if let Some(account_details) = account { calculate_account_salt(&payload.guardian_email_addr, &account_details.account_code) } else { return Err(ApiError::Validation("Wallet not deployed".to_string())); }; - println!("got account_salt"); - if !DB .is_wallet_and_email_registered(&account_eth_addr, &payload.guardian_email_addr) .await? { - println!("email and wallet are not registered"); DB.insert_request(&Request { request_id, account_eth_addr: account_eth_addr.clone(), @@ -377,13 +352,10 @@ pub async fn handle_recovery_request( }) .await?; - println!("inserted request"); - if DB .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) .await? { - println!("guardian is set"); handle_email_event(EmailAuthEvent::RecoveryRequest { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), @@ -394,7 +366,6 @@ pub async fn handle_recovery_request( // TODO: Add custom error for handle_email_event .expect("Failed to send Recovery event"); } else { - println!("guardian is not set"); handle_email_event(EmailAuthEvent::GuardianNotSet { account_eth_addr, guardian_email_addr: payload.guardian_email_addr.clone(), @@ -404,8 +375,6 @@ pub async fn handle_recovery_request( .expect("Failed to send Recovery event"); } - println!("all done"); - Ok(Json(RecoveryResponse { request_id, command_params, @@ -424,11 +393,9 @@ pub async fn handle_recovery_request( pub async fn handle_complete_recovery_request( Json(payload): Json, ) -> Result { - println!("handle_complete_recovery_request"); if !CLIENT.is_wallet_deployed(&payload.account_eth_addr).await? { return Err(ApiError::Validation("Wallet not deployed".to_string())); } - println!("wallet is deployed"); match CLIENT .complete_recovery( @@ -472,7 +439,6 @@ pub async fn handle_complete_recovery_request( pub async fn get_account_salt( Json(payload): Json, ) -> Result { - println!("get_account_salt"); let account_salt = calculate_account_salt(&payload.email_addr, &payload.account_code); Ok(account_salt) } @@ -489,7 +455,6 @@ pub async fn get_account_salt( pub async fn inactive_guardian( Json(payload): Json, ) -> Result { - println!("inactive_guardian"); let is_activated = CLIENT .get_is_activated(&payload.controller_eth_addr, &payload.account_eth_addr) .await?; @@ -535,11 +500,15 @@ fn parse_error_message(error_data: String) -> String { /// /// A `Result` containing `()` or an `ApiError`. pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { - println!("receive_email_api_fn"); let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; let from_addr = parsed_email.get_from_addr()?; let original_subject = parsed_email.get_subject_all()?; tokio::spawn(async move { + if !check_is_valid_request(&parsed_email).await.unwrap() { + trace!(LOG, "Got a non valid email request. Ignoring."); + return; + } + match handle_email_event(EmailAuthEvent::Ack { email_addr: from_addr.clone(), command: parsed_email.get_command(false).unwrap_or_default(), From 719dc4a56740d9eeee5c54c0548a7eefad2315ac Mon Sep 17 00:00:00 2001 From: Dimitri Date: Thu, 19 Sep 2024 13:26:48 +0700 Subject: [PATCH 090/121] Add AI generated comments --- Cargo.lock | 1 + packages/relayer/Cargo.toml | 3 +- packages/relayer/src/chain.rs | 110 +++++++++-- packages/relayer/src/config.rs | 21 ++ packages/relayer/src/core.rs | 95 +++++++++ packages/relayer/src/database.rs | 180 +++++++++++++++-- packages/relayer/src/lib.rs | 28 ++- packages/relayer/src/modules/dkim.rs | 38 ++++ packages/relayer/src/modules/mail.rs | 59 +++++- packages/relayer/src/modules/mod.rs | 2 + .../src/modules/web_server/relayer_errors.rs | 7 + .../src/modules/web_server/rest_api.rs | 186 ++++++++---------- .../relayer/src/modules/web_server/server.rs | 3 + 13 files changed, 590 insertions(+), 143 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b060b89f..8c4df7ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4141,6 +4141,7 @@ dependencies = [ [[package]] name = "relayer-utils" version = "0.3.7" +source = "git+https://github.com/zkemail/relayer-utils.git?rev=0c19631#0c196312b6ce7ce2c282d11e6c736e958b8df77a" dependencies = [ "anyhow", "base64 0.21.7", diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 30d0bb2b..4ccd237d 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -25,8 +25,7 @@ tiny_http = "0.12.0" lettre = { version = "0.10.4", features = ["tokio1", "tokio1-native-tls"] } ethers = { version = "2.0.10", features = ["abigen"] } # relayer-utils = { version = "0.3.7", git = "https://github.com/zkemail/relayer-utils.git" } -# relayer-utils = { rev = "94d78d6", git = "https://github.com/zkemail/relayer-utils.git" } -relayer-utils = { path = "../../../relayer-utils" } +relayer-utils = { rev = "0c19631", git = "https://github.com/zkemail/relayer-utils.git" } futures = "0.3.28" sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } regex = "1.10.2" diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index d3df1e62..30e362b4 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -10,6 +10,7 @@ const CONFIRMATIONS: usize = 1; type SignerM = SignerMiddleware, LocalWallet>; +/// Represents a client for interacting with the blockchain. #[derive(Debug, Clone)] pub struct ChainClient { pub client: Arc, @@ -25,6 +26,7 @@ impl ChainClient { let wallet: LocalWallet = PRIVATE_KEY.get().unwrap().parse()?; let provider = Provider::::try_from(CHAIN_RPC_PROVIDER.get().unwrap())?; + // Create a new SignerMiddleware with the provider and wallet let client = Arc::new(SignerMiddleware::new( provider, wallet.with_chain_id(*CHAIN_ID.get().unwrap()), @@ -58,13 +60,18 @@ impl ChainClient { let mut mutex = SHARED_MUTEX.lock().await; *mutex += 1; + // Call the contract method let call = dkim.set_dkim_public_key_hash(selector, domain_name, public_key_hash, signature); let tx = call.send().await?; + + // Wait for the transaction to be confirmed let receipt = tx .log() .confirmations(CONFIRMATIONS) .await? .ok_or(anyhow!("No receipt"))?; + + // Format the transaction hash let tx_hash = receipt.transaction_hash; let tx_hash = format!("0x{}", hex::encode(tx_hash.as_bytes())); Ok(tx_hash) @@ -87,6 +94,7 @@ impl ChainClient { public_key_hash: [u8; 32], dkim: ECDSAOwnedDKIMRegistry, ) -> Result { + // Call the contract method to check if the hash is valid let is_valid = dkim .is_dkim_public_key_hash_valid(domain_name, public_key_hash) .call() @@ -107,9 +115,16 @@ impl ChainClient { &self, controller_eth_addr: &str, ) -> Result, anyhow::Error> { + // Parse the controller Ethereum address let controller_eth_addr: H160 = controller_eth_addr.parse()?; + + // Create a new EmailAccountRecovery contract instance let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); + + // Call the dkim method to get the DKIM registry address let dkim = contract.dkim().call().await?; + + // Create and return a new ECDSAOwnedDKIMRegistry instance Ok(ECDSAOwnedDKIMRegistry::new(dkim, self.client.clone())) } @@ -126,10 +141,16 @@ impl ChainClient { &self, email_auth_addr: &str, ) -> Result, anyhow::Error> { + // Parse the email auth address let email_auth_address: H160 = email_auth_addr.parse()?; + + // Create a new EmailAuth contract instance let contract = EmailAuth::new(email_auth_address, self.client.clone()); + + // Call the dkim_registry_addr method to get the DKIM registry address let dkim = contract.dkim_registry_addr().call().await?; + // Create and return a new ECDSAOwnedDKIMRegistry instance Ok(ECDSAOwnedDKIMRegistry::new(dkim, self.client.clone())) } @@ -150,11 +171,18 @@ impl ChainClient { wallet_addr: &str, account_salt: &str, ) -> Result { + // Parse the controller and wallet Ethereum addresses let controller_eth_addr: H160 = controller_eth_addr.parse()?; let wallet_address: H160 = wallet_addr.parse()?; + + // Create a new EmailAccountRecovery contract instance let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); + + // Decode the account salt let account_salt_bytes = hex::decode(account_salt.trim_start_matches("0x")) .map_err(|e| anyhow!("Failed to decode account_salt: {}", e))?; + + // Compute the email auth address let email_auth_addr = contract .compute_email_auth_address( wallet_address, @@ -176,7 +204,10 @@ impl ChainClient { /// /// A `Result` containing a boolean indicating if the wallet is deployed. pub async fn is_wallet_deployed(&self, wallet_addr_str: &str) -> Result { + // Parse the wallet address let wallet_addr: H160 = wallet_addr_str.parse().map_err(ChainError::HexError)?; + + // Get the bytecode at the wallet address match self.client.get_code(wallet_addr, None).await { Ok(code) => Ok(!code.is_empty()), Err(e) => { @@ -204,9 +235,14 @@ impl ChainClient { controller_eth_addr: &str, template_idx: u64, ) -> Result, ChainError> { + // Parse the controller Ethereum address let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ChainError::HexError)?; + + // Create a new EmailAccountRecovery contract instance let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); + + // Get the acceptance command templates let templates = contract .acceptance_command_templates() .call() @@ -232,9 +268,14 @@ impl ChainClient { controller_eth_addr: &str, template_idx: u64, ) -> Result, ChainError> { + // Parse the controller Ethereum address let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ChainError::HexError)?; + + // Create a new EmailAccountRecovery contract instance let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); + + // Get the recovery command templates let templates = contract .recovery_command_templates() .call() @@ -262,30 +303,30 @@ impl ChainClient { account_eth_addr: &str, complete_calldata: &str, ) -> Result { - println!("doing complete recovery"); + // Parse the controller and account Ethereum addresses let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ChainError::HexError)?; - println!("controller_eth_addr: {:?}", controller_eth_addr); + // Create a new EmailAccountRecovery contract instance let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); + + // Decode the complete calldata let decoded_calldata = hex::decode(complete_calldata.trim_start_matches("0x")).expect("Decoding failed"); - println!("decoded_calldata : {:?}", decoded_calldata); let account_eth_addr = account_eth_addr .parse::() .map_err(ChainError::HexError)?; - println!("account_eth_addr : {:?}", account_eth_addr); + // Call the complete_recovery method let call = contract.complete_recovery(account_eth_addr, Bytes::from(decoded_calldata)); - println!("call: {:?}", call); let tx = call .send() .await .map_err(|e| ChainError::contract_error("Failed to call complete_recovery", e))?; - println!("tx: {:?}", tx); - // If the transaction is successful, the function will return true and false otherwise. + + // Wait for the transaction to be confirmed let receipt = tx .log() .confirmations(CONFIRMATIONS) @@ -297,8 +338,8 @@ impl ChainClient { ) })? .ok_or(anyhow!("No receipt"))?; - println!("receipt : {:?}", receipt); + // Check if the transaction was successful Ok(receipt .status .map(|status| status == U64::from(1)) @@ -322,14 +363,20 @@ impl ChainClient { email_auth_msg: EmailAuthMsg, template_idx: u64, ) -> std::result::Result { + // Parse the controller Ethereum address let controller_eth_addr: H160 = controller_eth_addr.parse()?; + + // Create a new EmailAccountRecovery contract instance let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); + + // Call the handle_acceptance method let call = contract.handle_acceptance(email_auth_msg, template_idx.into()); let tx = call .send() .await .map_err(|e| ChainError::contract_error("Failed to call handle_acceptance", e))?; - // If the transaction is successful, the function will return true and false otherwise. + + // Wait for the transaction to be confirmed let receipt = tx .log() .confirmations(CONFIRMATIONS) @@ -341,6 +388,8 @@ impl ChainClient { ) })? .ok_or(anyhow!("No receipt"))?; + + // Check if the transaction was successful Ok(receipt .status .map(|status| status == U64::from(1)) @@ -364,14 +413,20 @@ impl ChainClient { email_auth_msg: EmailAuthMsg, template_idx: u64, ) -> std::result::Result { + // Parse the controller Ethereum address let controller_eth_addr: H160 = controller_eth_addr.parse()?; + + // Create a new EmailAccountRecovery contract instance let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); + + // Call the handle_recovery method let call = contract.handle_recovery(email_auth_msg, template_idx.into()); let tx = call .send() .await .map_err(|e| ChainError::contract_error("Failed to call handle_recovery", e))?; - // If the transaction is successful, the function will return true and false otherwise. + + // Wait for the transaction to be confirmed let receipt = tx .log() .confirmations(CONFIRMATIONS) @@ -380,6 +435,8 @@ impl ChainClient { ChainError::provider_error("Failed to get receipt after calling handle_recovery", e) })? .ok_or(anyhow!("No receipt"))?; + + // Check if the transaction was successful Ok(receipt .status .map(|status| status == U64::from(1)) @@ -396,7 +453,10 @@ impl ChainClient { /// /// A `Result` containing the bytecode as Bytes. pub async fn get_bytecode(&self, wallet_addr: &str) -> std::result::Result { + // Parse the wallet address let wallet_address: H160 = wallet_addr.parse().map_err(ChainError::HexError)?; + + // Get the bytecode at the wallet address let client_code = self .client .get_code(wallet_address, None) @@ -420,7 +480,10 @@ impl ChainClient { wallet_addr: &str, slot: u64, ) -> Result { + // Parse the wallet address let wallet_address: H160 = wallet_addr.parse()?; + + // Get the storage at the specified slot Ok(self .client .get_storage_at(wallet_address, u64_to_u8_array_32(slot).into(), None) @@ -444,16 +507,23 @@ impl ChainClient { command_params: Vec, template_idx: u64, ) -> Result { + // Parse the controller Ethereum address let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ChainError::HexError)?; + + // Create a new EmailAccountRecovery contract instance let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); + + // Encode the command parameters let command_params_bytes = command_params - .iter() // Change here: use iter() instead of map() directly on Vec + .iter() .map(|s| { - s.abi_encode(None) // Assuming decimal_size is not needed or can be None + s.abi_encode(None) .unwrap_or_else(|_| Bytes::from("Error encoding".as_bytes().to_vec())) - }) // Error handling + }) .collect::>(); + + // Call the extract_recovered_account_from_acceptance_command method let recovered_account = contract .extract_recovered_account_from_acceptance_command( command_params_bytes, @@ -487,17 +557,24 @@ impl ChainClient { command_params: Vec, template_idx: u64, ) -> Result { + // Parse the controller Ethereum address let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ChainError::HexError)?; + + // Create a new EmailAccountRecovery contract instance let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); + + // Encode the command parameters let command_params_bytes = command_params - .iter() // Change here: use iter() instead of map() directly on Vec + .iter() .map(|s| { s.abi_encode(None).map_err(|_| { ChainError::Validation("Error encoding subject parameters".to_string()) }) }) .collect::, ChainError>>()?; + + // Call the extract_recovered_account_from_recovery_command method let recovered_account = contract .extract_recovered_account_from_recovery_command( command_params_bytes, @@ -529,10 +606,15 @@ impl ChainClient { controller_eth_addr: &str, account_eth_addr: &str, ) -> Result { + // Parse the controller and account Ethereum addresses let controller_eth_addr: H160 = controller_eth_addr.parse().map_err(ChainError::HexError)?; let account_eth_addr: H160 = account_eth_addr.parse().map_err(ChainError::HexError)?; + + // Create a new EmailAccountRecovery contract instance let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); + + // Call the is_activated method let is_activated = contract .is_activated(account_eth_addr) .call() diff --git a/packages/relayer/src/config.rs b/packages/relayer/src/config.rs index bed30ff4..2e5a9095 100644 --- a/packages/relayer/src/config.rs +++ b/packages/relayer/src/config.rs @@ -4,6 +4,10 @@ use std::{env, path::PathBuf}; use dotenv::dotenv; +/// Configuration struct for the Relayer service. +/// +/// This struct holds various configuration parameters needed for the Relayer service, +/// including SMTP settings, database path, web server address, and blockchain-related information. #[derive(Clone)] pub struct RelayerConfig { pub smtp_server: String, @@ -21,9 +25,19 @@ pub struct RelayerConfig { } impl RelayerConfig { + /// Creates a new instance of RelayerConfig. + /// + /// This function loads environment variables using dotenv and populates + /// the RelayerConfig struct with the values. + /// + /// # Returns + /// + /// A new instance of RelayerConfig. pub fn new() -> Self { + // Load environment variables from .env file dotenv().ok(); + // Construct and return the RelayerConfig instance Self { smtp_server: env::var(SMTP_SERVER_KEY).unwrap(), relayer_email_addr: env::var(RELAYER_EMAIL_ADDR_KEY).unwrap(), @@ -45,6 +59,13 @@ impl RelayerConfig { } impl Default for RelayerConfig { + /// Provides a default instance of RelayerConfig. + /// + /// This implementation simply calls the `new()` method to create a default instance. + /// + /// # Returns + /// + /// A default instance of RelayerConfig. fn default() -> Self { Self::new() } diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index 43986c63..f9c10165 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -104,6 +104,16 @@ pub async fn handle_email(email: String) -> Result { handle_email_request(params, invitation_code).await } +/// Handles the email request based on the presence of an invitation code and whether it's for recovery. +/// +/// # Arguments +/// +/// * `params` - The `EmailRequestContext` containing request details. +/// * `invitation_code` - An optional invitation code. +/// +/// # Returns +/// +/// A `Result` containing an `EmailAuthEvent` or an `EmailError`. async fn handle_email_request( params: EmailRequestContext, invitation_code: Option, @@ -141,6 +151,16 @@ async fn handle_email_request( } } +/// Handles the acceptance of an email authentication request. +/// +/// # Arguments +/// +/// * `params` - The `EmailRequestContext` containing request details. +/// * `invitation_code` - The invitation code from the email. +/// +/// # Returns +/// +/// A `Result` containing an `EmailAuthEvent` or an `EmailError`. async fn accept( params: EmailRequestContext, invitation_code: String, @@ -150,6 +170,7 @@ async fn accept( info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); info!(LOG, "Request: {:?}", params.request); + // Handle the acceptance with the client let is_accepted = CLIENT .handle_acceptance( ¶ms.request.controller_eth_addr, @@ -194,12 +215,22 @@ async fn accept( } } +/// Handles the recovery process for an email authentication request. +/// +/// # Arguments +/// +/// * `params` - The `EmailRequestContext` containing request details. +/// +/// # Returns +/// +/// A `Result` containing an `EmailAuthEvent` or an `EmailError`. async fn recover(params: EmailRequestContext) -> Result { let (email_auth_msg, email_proof, account_salt) = get_email_auth_msg(¶ms).await?; info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); info!(LOG, "Request: {:?}", params.request); + // Handle the recovery with the client let is_success = CLIENT .handle_recovery( ¶ms.request.controller_eth_addr, @@ -236,6 +267,16 @@ async fn recover(params: EmailRequestContext) -> Result, start_idx: usize) -> Result { // Gather signals from start_idx to start_idx + COMMAND_FIELDS let command_bytes: Vec = public_signals @@ -253,6 +294,18 @@ fn get_masked_command(public_signals: Vec, start_idx: usize) -> Result Result<(EmailProof, [u8; 32]), EmailError> { @@ -314,6 +376,15 @@ async fn generate_email_proof( Ok((email_proof, account_salt)) } +/// Generates the template ID for the email authentication request. +/// +/// # Arguments +/// +/// * `params` - The `EmailRequestContext` containing request details. +/// +/// # Returns +/// +/// A 32-byte array representing the template ID. fn get_template_id(params: &EmailRequestContext) -> [u8; 32] { let action = if params.request.is_for_recovery { "RECOVERY".to_string() @@ -331,6 +402,15 @@ fn get_template_id(params: &EmailRequestContext) -> [u8; 32] { keccak256(encode(&tokens)) } +/// Retrieves and encodes the command parameters for the email authentication request. +/// +/// # Arguments +/// +/// * `params` - The `EmailRequestContext` containing request details. +/// +/// # Returns +/// +/// A `Result` containing a vector of encoded command parameters or an `EmailError`. async fn get_encoded_command_params( params: &EmailRequestContext, ) -> Result, EmailError> { @@ -365,6 +445,15 @@ async fn get_encoded_command_params( Ok(command_params_encoded) } +/// Generates the email authentication message. +/// +/// # Arguments +/// +/// * `params` - The `EmailRequestContext` containing request details. +/// +/// # Returns +/// +/// A `Result` containing the `EmailAuthMsg`, `EmailProof`, and account salt, or an `EmailError`. async fn get_email_auth_msg( params: &EmailRequestContext, ) -> Result<(EmailAuthMsg, EmailProof, [u8; 32]), EmailError> { @@ -380,11 +469,17 @@ async fn get_email_auth_msg( Ok((email_auth_msg, email_proof, account_salt)) } +/// Represents the context for an email authentication request. #[derive(Debug, Clone)] struct EmailRequestContext { + /// The request details. request: Request, + /// The body of the email. email_body: String, + /// The account code as a string. account_code_str: String, + /// The full raw email. email: String, + /// The parsed email. parsed_email: ParsedEmail, } diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs index 93de8ee1..29729903 100644 --- a/packages/relayer/src/database.rs +++ b/packages/relayer/src/database.rs @@ -3,28 +3,45 @@ use crate::*; use relayer_utils::LOG; use sqlx::{postgres::PgPool, Row}; +/// Represents the credentials for a user account. #[derive(Debug, Clone)] pub struct Credentials { + /// The unique code associated with the account. pub account_code: String, + /// The Ethereum address of the account. pub account_eth_addr: String, + /// The email address of the guardian. pub guardian_email_addr: String, + /// Indicates whether the credentials are set. pub is_set: bool, } +/// Represents a request in the system. #[derive(Debug, Clone)] pub struct Request { + /// The unique identifier for the request. pub request_id: u32, + /// The Ethereum address of the account. pub account_eth_addr: String, + /// The Ethereum address of the controller. pub controller_eth_addr: String, + /// The email address of the guardian. pub guardian_email_addr: String, + /// Indicates whether the request is for recovery. pub is_for_recovery: bool, + /// The index of the template used for the request. pub template_idx: u64, + /// Indicates whether the request has been processed. pub is_processed: bool, + /// Indicates the success status of the request, if available. pub is_success: Option, + /// The nullifier for the email, if available. pub email_nullifier: Option, + /// The salt for the account, if available. pub account_salt: Option, } +/// Represents the database connection and operations. pub struct Database { db: PgPool, } @@ -57,6 +74,7 @@ impl Database { /// /// A `Result` indicating success or failure of the setup process. pub async fn setup_database(&self) -> Result<()> { + // Create credentials table sqlx::query( "CREATE TABLE IF NOT EXISTS credentials ( account_code TEXT PRIMARY KEY, @@ -68,6 +86,7 @@ impl Database { .execute(&self.db) .await?; + // Create requests table sqlx::query( "CREATE TABLE IF NOT EXISTS requests ( request_id BIGINT PRIMARY KEY, @@ -85,6 +104,7 @@ impl Database { .execute(&self.db) .await?; + // Create expected_replies table sqlx::query( "CREATE TABLE IF NOT EXISTS expected_replies ( message_id VARCHAR(255) PRIMARY KEY, @@ -98,6 +118,11 @@ impl Database { Ok(()) } + /// Tests the database connection by attempting to execute a simple query. + /// + /// # Returns + /// + /// A `Result` indicating success or failure of the connection test. pub(crate) async fn test_db_connection(&self) -> Result<()> { // Try up to 3 times for i in 1..4 { @@ -120,6 +145,15 @@ impl Database { )) } + /// Retrieves credentials for a given account code. + /// + /// # Arguments + /// + /// * `account_code` - The unique code associated with the account. + /// + /// # Returns + /// + /// A `Result` containing an `Option` if successful, or an error if the query fails. pub(crate) async fn get_credentials(&self, account_code: &str) -> Result> { let row = sqlx::query("SELECT * FROM credentials WHERE account_code = $1") .bind(account_code) @@ -128,6 +162,7 @@ impl Database { match row { Some(row) => { + // Extract values from the row let account_code: String = row.get("account_code"); let account_eth_addr: String = row.get("account_eth_addr"); let guardian_email_addr: String = row.get("guardian_email_addr"); @@ -145,6 +180,16 @@ impl Database { } } + /// Checks if a wallet and email combination is registered in the database. + /// + /// # Arguments + /// + /// * `account_eth_addr` - The Ethereum address of the account. + /// * `email_addr` - The email address to check. + /// + /// # Returns + /// + /// A `Result` containing a boolean indicating if the combination is registered. pub(crate) async fn is_wallet_and_email_registered( &self, account_eth_addr: &str, @@ -159,17 +204,23 @@ impl Database { .await .map_err(|e| DatabaseError::new("Failed to check if wallet and email are registered", e))?; - match row { - Some(_) => Ok(true), - None => Ok(false), - } + Ok(row.is_some()) } + /// Updates the credentials for a given account code. + /// + /// # Arguments + /// + /// * `row` - The `Credentials` struct containing the updated information. + /// + /// # Returns + /// + /// A `Result` indicating success or failure of the update operation. pub(crate) async fn update_credentials_of_account_code( &self, row: &Credentials, ) -> std::result::Result<(), DatabaseError> { - let res = sqlx::query("UPDATE credentials SET account_eth_addr = $1, guardian_email_addr = $2, is_set = $3 WHERE account_code = $4") + sqlx::query("UPDATE credentials SET account_eth_addr = $1, guardian_email_addr = $2, is_set = $3 WHERE account_code = $4") .bind(&row.account_eth_addr) .bind(&row.guardian_email_addr) .bind(row.is_set) @@ -182,11 +233,20 @@ impl Database { Ok(()) } + /// Updates the credentials for a given wallet and email combination. + /// + /// # Arguments + /// + /// * `row` - The `Credentials` struct containing the updated information. + /// + /// # Returns + /// + /// A `Result` indicating success or failure of the update operation. pub(crate) async fn update_credentials_of_wallet_and_email( &self, row: &Credentials, ) -> std::result::Result<(), DatabaseError> { - let res = sqlx::query("UPDATE credentials SET account_code = $1, is_set = $2 WHERE account_eth_addr = $3 AND guardian_email_addr = $4") + sqlx::query("UPDATE credentials SET account_code = $1, is_set = $2 WHERE account_eth_addr = $3 AND guardian_email_addr = $4") .bind(&row.account_code) .bind(row.is_set) .bind(&row.account_eth_addr) @@ -199,12 +259,22 @@ impl Database { Ok(()) } + /// Updates the credentials of an inactive guardian. + /// + /// # Arguments + /// + /// * `is_set` - The new value for the `is_set` field. + /// * `account_eth_addr` - The Ethereum address of the account. + /// + /// # Returns + /// + /// A `Result` indicating success or failure of the update operation. pub(crate) async fn update_credentials_of_inactive_guardian( &self, is_set: bool, account_eth_addr: &str, ) -> std::result::Result<(), DatabaseError> { - let res = sqlx::query( + sqlx::query( "UPDATE credentials SET is_set = $1 WHERE account_eth_addr = $2 AND is_set = true", ) .bind(is_set) @@ -215,11 +285,20 @@ impl Database { Ok(()) } + /// Inserts new credentials into the database. + /// + /// # Arguments + /// + /// * `row` - The `Credentials` struct containing the new information. + /// + /// # Returns + /// + /// A `Result` indicating success or failure of the insert operation. pub(crate) async fn insert_credentials( &self, row: &Credentials, ) -> std::result::Result<(), DatabaseError> { - let row = sqlx::query( + sqlx::query( "INSERT INTO credentials (account_code, account_eth_addr, guardian_email_addr, is_set) VALUES ($1, $2, $3, $4) RETURNING *", ) .bind(&row.account_code) @@ -229,7 +308,7 @@ impl Database { .fetch_one(&self.db) .await .map_err(|e| DatabaseError::new("Failed to insert credentials", e))?; - info!(LOG, "Credentials inserted",); + info!(LOG, "Credentials inserted"); Ok(()) } @@ -255,12 +334,18 @@ impl Database { .await .map_err(|e| DatabaseError::new("Failed to check if guardian is set", e))?; - match row { - Some(_) => Ok(true), - None => Ok(false), - } + Ok(row.is_some()) } + /// Retrieves a request from the database based on the request ID. + /// + /// # Arguments + /// + /// * `request_id` - The unique identifier of the request. + /// + /// # Returns + /// + /// A `Result` containing an `Option` if successful, or an error if the query fails. pub(crate) async fn get_request( &self, request_id: u32, @@ -273,6 +358,7 @@ impl Database { match row { Some(row) => { + // Extract values from the row let request_id: i64 = row.get("request_id"); let account_eth_addr: String = row.get("account_eth_addr"); let controller_eth_addr: String = row.get("controller_eth_addr"); @@ -302,11 +388,20 @@ impl Database { } } + /// Updates an existing request in the database. + /// + /// # Arguments + /// + /// * `row` - The `Request` struct containing the updated information. + /// + /// # Returns + /// + /// A `Result` indicating success or failure of the update operation. pub(crate) async fn update_request( &self, row: &Request, ) -> std::result::Result<(), DatabaseError> { - let res = sqlx::query("UPDATE requests SET account_eth_addr = $1, controller_eth_addr = $2, guardian_email_addr = $3, is_for_recovery = $4, template_idx = $5, is_processed = $6, is_success = $7, email_nullifier = $8, account_salt = $9 WHERE request_id = $10") + sqlx::query("UPDATE requests SET account_eth_addr = $1, controller_eth_addr = $2, guardian_email_addr = $3, is_for_recovery = $4, template_idx = $5, is_processed = $6, is_success = $7, email_nullifier = $8, account_salt = $9 WHERE request_id = $10") .bind(&row.account_eth_addr) .bind(&row.controller_eth_addr) .bind(&row.guardian_email_addr) @@ -323,6 +418,16 @@ impl Database { Ok(()) } + /// Retrieves the account code for a given wallet and email combination. + /// + /// # Arguments + /// + /// * `account_eth_addr` - The Ethereum address of the account. + /// * `email_addr` - The email address associated with the account. + /// + /// # Returns + /// + /// A `Result` containing an `Option` with the account code if found, or an error if the query fails. pub(crate) async fn get_account_code_from_wallet_and_email( &self, account_eth_addr: &str, @@ -346,6 +451,16 @@ impl Database { } } + /// Retrieves the credentials for a given wallet and email combination. + /// + /// # Arguments + /// + /// * `account_eth_addr` - The Ethereum address of the account. + /// * `email_addr` - The email address associated with the account. + /// + /// # Returns + /// + /// A `Result` containing an `Option` if found, or an error if the query fails. pub(crate) async fn get_credentials_from_wallet_and_email( &self, account_eth_addr: &str, @@ -362,6 +477,7 @@ impl Database { match row { Some(row) => { + // Extract values from the row let account_code: String = row.get("account_code"); let account_eth_addr: String = row.get("account_eth_addr"); let guardian_email_addr: String = row.get("guardian_email_addr"); @@ -379,12 +495,21 @@ impl Database { } } + /// Inserts a new request into the database. + /// + /// # Arguments + /// + /// * `row` - The `Request` struct containing the new request information. + /// + /// # Returns + /// + /// A `Result` indicating success or failure of the insert operation. pub(crate) async fn insert_request( &self, row: &Request, ) -> std::result::Result<(), DatabaseError> { let request_id = row.request_id; - let row = sqlx::query( + sqlx::query( "INSERT INTO requests (request_id, account_eth_addr, controller_eth_addr, guardian_email_addr, is_for_recovery, template_idx, is_processed, is_success, email_nullifier, account_salt) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *", ) .bind(row.request_id as i64) @@ -404,6 +529,16 @@ impl Database { Ok(()) } + /// Adds an expected reply to the database. + /// + /// # Arguments + /// + /// * `message_id` - The unique identifier of the message. + /// * `request_id` - An optional request ID associated with the reply. + /// + /// # Returns + /// + /// A `Result` indicating success or failure of the insert operation. pub(crate) async fn add_expected_reply( &self, message_id: &str, @@ -422,10 +557,17 @@ impl Database { Ok(()) } - // Checks if the given message_id corresponds to a valid reply. - // This function updates the `has_reply` field to true if the message_id exists and hasn't been replied to yet. - // Returns true if the update was successful (i.e., a valid reply was recorded), false otherwise, - // also if no record exists to be updated. + /// Checks if the given message_id corresponds to a valid reply. + /// + /// This function updates the `has_reply` field to true if the message_id exists and hasn't been replied to yet. + /// + /// # Arguments + /// + /// * `message_id` - The unique identifier of the message. + /// + /// # Returns + /// + /// A `Result` containing a boolean indicating if the reply is valid (true if the update was successful). pub(crate) async fn is_valid_reply(&self, message_id: &str) -> Result { let query = " UPDATE expected_replies diff --git a/packages/relayer/src/lib.rs b/packages/relayer/src/lib.rs index 42348138..c4d1adb6 100644 --- a/packages/relayer/src/lib.rs +++ b/packages/relayer/src/lib.rs @@ -46,9 +46,19 @@ pub static SMTP_SERVER: OnceLock = OnceLock::new(); static DB_CELL: OnceCell> = OnceCell::const_new(); +/// Wrapper struct for database access struct DBWrapper; impl DBWrapper { + /// Retrieves the database instance. + /// + /// # Returns + /// + /// A reference to the `Arc`. + /// + /// # Panics + /// + /// Panics if the database is not initialized. fn get() -> &'static Arc { DB_CELL.get().expect("Database not initialized") } @@ -58,13 +68,14 @@ impl std::ops::Deref for DBWrapper { type Target = Database; fn deref(&self) -> &Self::Target { - &**Self::get() + Self::get() } } static DB: DBWrapper = DBWrapper; lazy_static! { + /// Shared instance of the `ChainClient`. pub static ref CLIENT: Arc = { dotenv().ok(); let client = tokio::task::block_in_place(|| { @@ -75,12 +86,23 @@ lazy_static! { .unwrap(); Arc::new(client) }; + /// Shared mutex for synchronization. pub static ref SHARED_MUTEX: Arc> = Arc::new(Mutex::new(0)); } +/// Runs the relayer with the given configuration. +/// +/// # Arguments +/// +/// * `config` - The configuration for the relayer. +/// +/// # Returns +/// +/// A `Result` indicating success or failure. pub async fn run(config: RelayerConfig) -> Result<()> { info!(LOG, "Starting relayer"); + // Initialize global configuration CIRCUITS_DIR_PATH.set(config.circuits_dir_path).unwrap(); WEB_SERVER_ADDRESS.set(config.web_server_address).unwrap(); PROVER_ADDRESS.set(config.prover_address).unwrap(); @@ -97,6 +119,7 @@ pub async fn run(config: RelayerConfig) -> Result<()> { .unwrap(); SMTP_SERVER.set(config.smtp_server).unwrap(); + // Spawn the API server task let api_server_task = tokio::task::spawn(async move { loop { match run_server().await { @@ -106,13 +129,14 @@ pub async fn run(config: RelayerConfig) -> Result<()> { } Err(err) => { error!(LOG, "Error api server: {}", err); - // Optionally, add a delay before restarting + // Add a delay before restarting to prevent rapid restart loops tokio::time::sleep(Duration::from_secs(5)).await; } } } }); + // Wait for the API server task to complete let _ = tokio::join!(api_server_task); Ok(()) diff --git a/packages/relayer/src/modules/dkim.rs b/packages/relayer/src/modules/dkim.rs index 21ae7d30..fe91ee7c 100644 --- a/packages/relayer/src/modules/dkim.rs +++ b/packages/relayer/src/modules/dkim.rs @@ -15,17 +15,25 @@ use ic_utils::canister::*; use serde::Deserialize; +/// Represents a client for interacting with the DKIM Oracle. #[derive(Debug, Clone)] pub struct DkimOracleClient<'a> { + /// The canister used for communication pub canister: Canister<'a>, } +/// Represents a signed DKIM public key. #[derive(Default, CandidType, Deserialize, Debug, Clone)] pub struct SignedDkimPublicKey { + /// The selector for the DKIM key pub selector: String, + /// The domain for the DKIM key pub domain: String, + /// The signature of the DKIM key pub signature: String, + /// The public key pub public_key: String, + /// The hash of the public key pub public_key_hash: String, } @@ -41,8 +49,13 @@ impl<'a> DkimOracleClient<'a> { /// /// An `anyhow::Result`. pub fn gen_agent(pem_path: &str, replica_url: &str) -> anyhow::Result { + // Create identity from PEM file let identity = Secp256k1Identity::from_pem_file(pem_path)?; + + // Create transport using the replica URL let transport = ReqwestTransport::create(replica_url)?; + + // Build and return the agent let agent = AgentBuilder::default() .with_identity(identity) .with_transport(transport) @@ -61,6 +74,7 @@ impl<'a> DkimOracleClient<'a> { /// /// An `anyhow::Result`. pub fn new(canister_id: &str, agent: &'a Agent) -> anyhow::Result { + // Build the canister using the provided ID and agent let canister = CanisterBuilder::new() .with_canister_id(canister_id) .with_agent(agent) @@ -83,11 +97,14 @@ impl<'a> DkimOracleClient<'a> { selector: &str, domain: &str, ) -> anyhow::Result { + // Build the request to sign the DKIM public key let request = self .canister .update("sign_dkim_public_key") .with_args((selector, domain)) .build::<(Result,)>(); + + // Call the canister and wait for the response let response = request .call_and_wait_one::>() .await? @@ -117,25 +134,36 @@ pub async fn check_and_update_dkim( wallet_addr: &str, account_salt: &str, ) -> Result<()> { + // Generate public key hash let mut public_key_n = parsed_email.public_key.clone(); public_key_n.reverse(); let public_key_hash = public_key_hash(&public_key_n)?; info!(LOG, "public_key_hash {:?}", public_key_hash); + + // Get email domain let domain = parsed_email.get_email_domain()?; info!(LOG, "domain {:?}", domain); + + // Check if wallet is deployed if CLIENT.get_bytecode(wallet_addr).await? == Bytes::from_static(&[0u8; 20]) { info!(LOG, "wallet not deployed"); return Ok(()); } + + // Get email auth address let email_auth_addr = CLIENT .get_email_auth_addr_from_wallet(controller_eth_addr, wallet_addr, account_salt) .await?; let email_auth_addr = format!("0x{:x}", email_auth_addr); + + // Get DKIM from wallet or email auth let mut dkim = CLIENT.get_dkim_from_wallet(controller_eth_addr).await?; if CLIENT.get_bytecode(&email_auth_addr).await? != Bytes::new() { dkim = CLIENT.get_dkim_from_email_auth(&email_auth_addr).await?; } info!(LOG, "dkim {:?}", dkim); + + // Check if DKIM public key hash is valid if CLIENT .check_if_dkim_public_key_hash_valid( domain.clone(), @@ -147,6 +175,8 @@ pub async fn check_and_update_dkim( info!(LOG, "public key registered"); return Ok(()); } + + // Get selector let selector_def_path = env::var(SELECTOR_DEF_PATH_KEY) .map_err(|_| anyhow!("ENV var {} not set", SELECTOR_DEF_PATH_KEY))?; let selector_def_contents = fs::read_to_string(&selector_def_path) @@ -158,17 +188,25 @@ pub async fn check_and_update_dkim( parsed_email.canonicalized_header[idxes.0..idxes.1].to_string() }; info!(LOG, "selector {}", selector); + + // Generate IC agent and create oracle client let ic_agent = DkimOracleClient::gen_agent( &env::var(PEM_PATH_KEY).unwrap(), &env::var(IC_REPLICA_URL_KEY).unwrap(), )?; let oracle_client = DkimOracleClient::new(&env::var(CANISTER_ID_KEY).unwrap(), &ic_agent)?; + + // Request signature from oracle let oracle_result = oracle_client.request_signature(&selector, &domain).await?; info!(LOG, "DKIM oracle result {:?}", oracle_result); + + // Process oracle response let public_key_hash = hex::decode(&oracle_result.public_key_hash[2..])?; info!(LOG, "public_key_hash from oracle {:?}", public_key_hash); let signature = Bytes::from_hex(&oracle_result.signature[2..])?; info!(LOG, "signature {:?}", signature); + + // Set DKIM public key hash let tx_hash = CLIENT .set_dkim_public_key_hash( selector, diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs index d0fd85f7..5fbc5d9a 100644 --- a/packages/relayer/src/modules/mail.rs +++ b/packages/relayer/src/modules/mail.rs @@ -4,6 +4,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use tokio::fs::read_to_string; +/// Represents different types of email authentication events. #[derive(Debug, Clone)] pub enum EmailAuthEvent { AcceptanceRequest { @@ -62,6 +63,7 @@ pub enum EmailAuthEvent { NoOp, } +/// Represents an email message to be sent. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct EmailMessage { pub to: String, @@ -73,6 +75,7 @@ pub struct EmailMessage { pub body_attachments: Option>, } +/// Represents an attachment in an email message. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct EmailAttachment { pub inline_id: String, @@ -98,8 +101,10 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> command, account_code, } => { + // Prepare the command with the account code let command = format!("{} Code {}", command, account_code); + // Create the plain text body let body_plain = format!( "You have received an guardian request from the wallet address {}. \ {} Code {}. \ @@ -111,6 +116,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> let subject = "Email Recovery: Acceptance Request".to_string(); + // Prepare data for HTML rendering let render_data = serde_json::json!({ "userEmailAddr": guardian_email_addr, "walletAddress": account_eth_addr, @@ -119,6 +125,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> }); let body_html = render_html("acceptance_request.html", render_data).await?; + // Create and send the email let email = EmailMessage { to: guardian_email_addr, subject, @@ -145,12 +152,14 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> error ); + // Prepare data for HTML rendering let render_data = serde_json::json!({ "error": error, "userEmailAddr": email_addr, }); let body_html = render_html("error.html", render_data).await?; + // Create and send the email let email = EmailMessage { to: email_addr, subject, @@ -174,12 +183,14 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> guardian_email_addr, account_eth_addr ); + // Prepare data for HTML rendering let render_data = serde_json::json!({ "walletAddress": account_eth_addr, "userEmailAddr": guardian_email_addr, }); let body_html = render_html("guardian_already_exists.html", render_data).await?; + // Create and send the email let email = EmailMessage { to: guardian_email_addr, subject: subject.to_string(), @@ -208,6 +219,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> let subject = "Email Recovery: Recovery Request".to_string(); + // Prepare data for HTML rendering let render_data = serde_json::json!({ "userEmailAddr": guardian_email_addr, "walletAddress": account_eth_addr, @@ -216,6 +228,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> }); let body_html = render_html("recovery_request.html", render_data).await?; + // Create and send the email let email = EmailMessage { to: guardian_email_addr, subject, @@ -242,6 +255,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> account_eth_addr, request_id ); + // Prepare data for HTML rendering let render_data = serde_json::json!({ "walletAddress": account_eth_addr, "userEmailAddr": guardian_email_addr, @@ -249,6 +263,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> }); let body_html = render_html("acceptance_success.html", render_data).await?; + // Create and send the email let email = EmailMessage { to: guardian_email_addr, subject: subject.to_string(), @@ -275,6 +290,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> account_eth_addr, request_id ); + // Prepare data for HTML rendering let render_data = serde_json::json!({ "walletAddress": account_eth_addr, "userEmailAddr": guardian_email_addr, @@ -282,6 +298,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> }); let body_html = render_html("recovery_success.html", render_data).await?; + // Create and send the email let email = EmailMessage { to: guardian_email_addr, subject: subject.to_string(), @@ -301,12 +318,14 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> let subject = "Guardian Not Set"; let body_plain = format!("Guardian not set for wallet address {}", account_eth_addr); + // Prepare data for HTML rendering let render_data = serde_json::json!({ "walletAddress": account_eth_addr, "userEmailAddr": guardian_email_addr, }); let body_html = render_html("guardian_not_set.html", render_data).await?; + // Create and send the email let email = EmailMessage { to: guardian_email_addr, subject: subject.to_string(), @@ -335,6 +354,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> account_eth_addr, request_id ); + // Prepare data for HTML rendering let render_data = serde_json::json!({ "userEmailAddr": guardian_email_addr, "walletAddress": account_eth_addr, @@ -345,6 +365,7 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> let subject = "Guardian Not Registered".to_string(); let body_html = render_html("credential_not_present.html", render_data).await?; + // Create and send the email let email = EmailMessage { to: guardian_email_addr, subject, @@ -367,9 +388,11 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> "Hi {}!\nYour email with the command {} is received.", email_addr, command ); + // Prepare data for HTML rendering let render_data = serde_json::json!({"userEmailAddr": email_addr, "request": command}); let body_html = render_html("acknowledgement.html", render_data).await?; let subject = format!("Re: {}", original_subject); + // Create and send the email let email = EmailMessage { to: email_addr, subject, @@ -397,10 +420,13 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> /// # Returns /// /// A `Result` containing the rendered HTML string or an `EmailError`. -pub async fn render_html(template_name: &str, render_data: Value) -> Result { +async fn render_html(template_name: &str, render_data: Value) -> Result { + // Construct the full path to the email template let email_template_filename = PathBuf::new() .join(EMAIL_TEMPLATES.get().unwrap()) .join(template_name); + + // Read the email template file let email_template = read_to_string(&email_template_filename) .await .map_err(|e| { @@ -410,8 +436,10 @@ pub async fn render_html(template_name: &str, render_data: Value) -> Result Result` with the parsed error message. -pub fn parse_error(error: String) -> Result> { +fn parse_error(error: String) -> Result> { let mut error = error; if error.contains("Contract call reverted with data: ") { + // Extract and decode the revert data let revert_data = error .replace("Contract call reverted with data: ", "") .split_at(10) @@ -441,6 +470,7 @@ pub fn parse_error(error: String) -> Result> { error = String::from_utf8(revert_bytes).unwrap().trim().to_string(); } + // Match known error messages and provide user-friendly responses match error.as_str() { "Account is already created" => Ok(Some(error)), "insufficient balance" => Ok(Some("You don't have sufficient balance".to_string())), @@ -453,11 +483,12 @@ pub fn parse_error(error: String) -> Result> { /// # Arguments /// /// * `email` - The `EmailMessage` to be sent. +/// * `expects_reply` - An optional `ExpectsReply` struct indicating if a reply is expected. /// /// # Returns /// /// A `Result` indicating success or an `EmailError`. -pub async fn send_email( +async fn send_email( email: EmailMessage, expects_reply: Option, ) -> Result<(), EmailError> { @@ -472,6 +503,7 @@ pub async fn send_email( .await .map_err(|e| EmailError::Send(format!("Failed to send email: {}", e)))?; + // Check if the email was sent successfully if !response.status().is_success() { return Err(EmailError::Send(format!( "Failed to send email: {}", @@ -479,6 +511,7 @@ pub async fn send_email( ))); } + // Handle expected reply if necessary if let Some(expects_reply) = expects_reply { let response_body: EmailResponse = response .json() @@ -493,23 +526,31 @@ pub async fn send_email( Ok(()) } +/// Represents the response from the email server after sending an email. #[derive(Debug, Clone, Serialize, Deserialize)] struct EmailResponse { status: String, message_id: String, } +/// Represents an expectation of a reply to an email. pub struct ExpectsReply { request_id: Option, } impl ExpectsReply { + /// Creates a new `ExpectsReply` instance with a request ID. + /// + /// # Arguments + /// + /// * `request_id` - The ID of the request expecting a reply. fn new(request_id: u32) -> Self { Self { request_id: Some(request_id.to_string()), } } + /// Creates a new `ExpectsReply` instance without a request ID. fn new_no_request_id() -> Self { Self { request_id: None } } @@ -518,17 +559,27 @@ impl ExpectsReply { /// Checks if the email is a reply to a command that expects a reply. /// Will return false for duplicate replies. /// Will return true if the email is not a reply. +/// +/// # Arguments +/// +/// * `email` - The `ParsedEmail` to be checked. +/// +/// # Returns +/// +/// A `Result` containing a boolean indicating if the request is valid. pub async fn check_is_valid_request(email: &ParsedEmail) -> Result { + // Check if the email is a reply by looking for the "In-Reply-To" header let reply_message_id = match email .headers .get_header("In-Reply-To") .and_then(|v| v.first().cloned()) { Some(id) => id, - // Email is not a reply + // Email is not a reply, so it's valid None => return Ok(true), }; + // Check if the reply is valid (not a duplicate) using the database let is_valid = DB.is_valid_reply(&reply_message_id).await?; Ok(is_valid) } diff --git a/packages/relayer/src/modules/mod.rs b/packages/relayer/src/modules/mod.rs index 5ace1b92..eaf1adc5 100644 --- a/packages/relayer/src/modules/mod.rs +++ b/packages/relayer/src/modules/mod.rs @@ -1,3 +1,5 @@ +//! This module contains the dkim, mail and web_server modules. + pub mod dkim; pub mod mail; pub mod web_server; diff --git a/packages/relayer/src/modules/web_server/relayer_errors.rs b/packages/relayer/src/modules/web_server/relayer_errors.rs index 10959c21..8b49462a 100644 --- a/packages/relayer/src/modules/web_server/relayer_errors.rs +++ b/packages/relayer/src/modules/web_server/relayer_errors.rs @@ -10,6 +10,7 @@ use rustc_hex::FromHexError; use serde_json::json; use thiserror::Error; +/// Custom error type for API-related errors #[derive(Error, Debug)] pub enum ApiError { #[error("Database error: {0}")] @@ -30,6 +31,7 @@ pub enum ApiError { Email(#[from] EmailError), } +/// Custom error type for email-related errors #[derive(Error, Debug)] pub enum EmailError { #[error("Email body error: {0}")] @@ -65,6 +67,7 @@ pub enum EmailError { Anyhow(#[from] anyhow::Error), } +/// Custom error type for blockchain-related errors #[derive(Error, Debug)] pub enum ChainError { #[error("Contract error: {0}")] @@ -98,6 +101,7 @@ impl ChainError { } } +/// Custom error type for database-related errors #[derive(Debug, thiserror::Error)] #[error("{msg}: {source}")] pub struct DatabaseError { @@ -115,6 +119,7 @@ impl DatabaseError { } } +/// Wrapper for contract-related errors #[derive(Debug)] pub struct ContractErrorWrapper { msg: String, @@ -136,6 +141,7 @@ impl ContractErrorWrapper { } } +/// Wrapper for signer middleware-related errors #[derive(Debug)] pub struct SignerMiddlewareErrorWrapper { msg: String, @@ -160,6 +166,7 @@ impl SignerMiddlewareErrorWrapper { } } +/// Wrapper for provider-related errors #[derive(Debug)] pub struct ProviderErrorWrapper { msg: String, diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index add61e88..8b0093d0 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -20,6 +20,8 @@ pub async fn request_status_api( Json(payload): Json, ) -> Result, ApiError> { let row = DB.get_request(payload.request_id).await?; + + // Determine the status based on the retrieved row let status = if let Some(ref row) = row { if row.is_processed { RequestStatus::Processed @@ -29,6 +31,7 @@ pub async fn request_status_api( } else { RequestStatus::NotExist }; + Ok(Json(RequestStatusResponse { request_id: payload.request_id, status, @@ -56,9 +59,11 @@ pub async fn handle_acceptance_request( .get_acceptance_command_templates(&payload.controller_eth_addr, payload.template_idx) .await?; + // Extract and validate command parameters let command_params = extract_template_vals(&payload.command, command_template) .map_err(|_| ApiError::Validation("Invalid command".to_string()))?; + // Recover the account address let account_eth_addr = CLIENT .get_recovered_account_from_acceptance_command( &payload.controller_eth_addr, @@ -69,66 +74,19 @@ pub async fn handle_acceptance_request( let account_eth_addr = format!("0x{:x}", account_eth_addr); + // Check if the wallet is deployed if !CLIENT.is_wallet_deployed(&account_eth_addr).await? { return Err(ApiError::Validation("Wallet not deployed".to_string())); } - // Check if hash of bytecode of proxy contract is equal or not - let bytecode = CLIENT.get_bytecode(&account_eth_addr).await?; - let bytecode_hash = format!("0x{}", hex::encode(keccak256(bytecode.as_ref()))); - - // let permitted_wallets: Vec = - // serde_json::from_str(include_str!("../../permitted_wallets.json")).unwrap(); - // let permitted_wallet = permitted_wallets - // .iter() - // .find(|w| w.hash_of_bytecode_of_proxy == bytecode_hash); - - // if let Some(permitted_wallet) = permitted_wallet { - // let slot_location = permitted_wallet.slot_location.parse::().unwrap(); - // let impl_contract_from_proxy = { - // let raw_hex = hex::encode( - // CLIENT - // .get_storage_at(&account_eth_addr, slot_location) - // .await - // .unwrap(), - // ); - // format!("0x{}", &raw_hex[24..]) - // }; - - // if !permitted_wallet - // .impl_contract_address - // .eq_ignore_ascii_case(&impl_contract_from_proxy) - // { - // return Response::builder() - // .status(StatusCode::BAD_REQUEST) - // .body(Body::from( - // "Invalid bytecode, impl contract address mismatch", - // )) - // .unwrap(); - // } - - // if !permitted_wallet - // .controller_eth_addr - // .eq_ignore_ascii_case(&payload.controller_eth_addr) - // { - // return Response::builder() - // .status(StatusCode::BAD_REQUEST) - // .body(Body::from("Invalid controller eth addr")) - // .unwrap(); - // } - // } else { - // return Response::builder() - // .status(StatusCode::BAD_REQUEST) - // .body(Body::from("Wallet not permitted")) - // .unwrap(); - // } - + // Check if the account code is already used if let Ok(Some(creds)) = DB.get_credentials(&payload.account_code).await { return Err(ApiError::Validation( "Account code already used".to_string(), )); } + // Generate a unique request ID let mut request_id = rand::thread_rng().gen::(); while let Ok(Some(request)) = DB.get_request(request_id).await { request_id = rand::thread_rng().gen::(); @@ -150,6 +108,7 @@ pub async fn handle_acceptance_request( }) .await?; + // Handle different scenarios based on guardian status if DB .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) .await? @@ -165,8 +124,7 @@ pub async fn handle_acceptance_request( .is_wallet_and_email_registered(&account_eth_addr, &payload.guardian_email_addr) .await? { - // In this case, the relayer sent a request email to the same guardian before, but it has not been replied yet. - // Therefore, the relayer will send an email to the guardian again with a fresh account code. + // Update credentials and send acceptance request email DB.update_credentials_of_wallet_and_email(&Credentials { account_code: payload.account_code.clone(), account_eth_addr: account_eth_addr.clone(), @@ -184,6 +142,7 @@ pub async fn handle_acceptance_request( }) .await?; } else { + // Insert new credentials and send acceptance request email DB.insert_credentials(&Credentials { account_code: payload.account_code.clone(), account_eth_addr: account_eth_addr.clone(), @@ -220,13 +179,16 @@ pub async fn handle_acceptance_request( pub async fn handle_recovery_request( Json(payload): Json, ) -> Result, ApiError> { + // Fetch the command template let command_template = CLIENT .get_recovery_command_templates(&payload.controller_eth_addr, payload.template_idx) .await?; + // Extract and validate command parameters let command_params = extract_template_vals(&payload.command, command_template) .map_err(|_| ApiError::Validation("Invalid command".to_string()))?; + // Recover the account address let account_eth_addr = CLIENT .get_recovered_account_from_recovery_command( &payload.controller_eth_addr, @@ -237,65 +199,18 @@ pub async fn handle_recovery_request( let account_eth_addr = format!("0x{:x}", account_eth_addr); + // Check if the wallet is deployed if !CLIENT.is_wallet_deployed(&account_eth_addr).await? { return Err(ApiError::Validation("Wallet not deployed".to_string())); } - // Check if hash of bytecode of proxy contract is equal or not - let bytecode = CLIENT.get_bytecode(&account_eth_addr).await?; - let bytecode_hash = format!("0x{}", hex::encode(keccak256(bytecode.as_ref()))); - - // let permitted_wallets: Vec = - // serde_json::from_str(include_str!("../../permitted_wallets.json")).unwrap(); - // let permitted_wallet = permitted_wallets - // .iter() - // .find(|w| w.hash_of_bytecode_of_proxy == bytecode_hash); - - // if let Some(permitted_wallet) = permitted_wallet { - // let slot_location = permitted_wallet.slot_location.parse::().unwrap(); - // let impl_contract_from_proxy = { - // let raw_hex = hex::encode( - // CLIENT - // .get_storage_at(&account_eth_addr, slot_location) - // .await - // .unwrap(), - // ); - // format!("0x{}", &raw_hex[24..]) - // }; - - // if !permitted_wallet - // .impl_contract_address - // .eq_ignore_ascii_case(&impl_contract_from_proxy) - // { - // return Response::builder() - // .status(StatusCode::BAD_REQUEST) - // .body(Body::from( - // "Invalid bytecode, impl contract address mismatch", - // )) - // .unwrap(); - // } - - // if !permitted_wallet - // .controller_eth_addr - // .eq_ignore_ascii_case(&payload.controller_eth_addr) - // { - // return Response::builder() - // .status(StatusCode::BAD_REQUEST) - // .body(Body::from("Invalid controller eth addr")) - // .unwrap(); - // } - // } else { - // return Response::builder() - // .status(StatusCode::BAD_REQUEST) - // .body(Body::from("Wallet not permitted")) - // .unwrap(); - // } - + // Generate a unique request ID let mut request_id = rand::thread_rng().gen::(); while let Ok(Some(request)) = DB.get_request(request_id).await { request_id = rand::thread_rng().gen::(); } + // Fetch account details and calculate account salt let account = DB .get_credentials_from_wallet_and_email(&account_eth_addr, &payload.guardian_email_addr) .await?; @@ -306,6 +221,7 @@ pub async fn handle_recovery_request( return Err(ApiError::Validation("Wallet not deployed".to_string())); }; + // Handle the case when wallet and email are not registered if !DB .is_wallet_and_email_registered(&account_eth_addr, &payload.guardian_email_addr) .await? @@ -338,6 +254,7 @@ pub async fn handle_recovery_request( })); } + // Insert the recovery request DB.insert_request(&Request { request_id, account_eth_addr: account_eth_addr.clone(), @@ -352,6 +269,7 @@ pub async fn handle_recovery_request( }) .await?; + // Handle different scenarios based on guardian status if DB .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) .await? @@ -393,10 +311,12 @@ pub async fn handle_recovery_request( pub async fn handle_complete_recovery_request( Json(payload): Json, ) -> Result { + // Check if the wallet is deployed if !CLIENT.is_wallet_deployed(&payload.account_eth_addr).await? { return Err(ApiError::Validation("Wallet not deployed".to_string())); } + // Attempt to complete the recovery match CLIENT .complete_recovery( &payload.controller_eth_addr, @@ -455,6 +375,7 @@ pub async fn get_account_salt( pub async fn inactive_guardian( Json(payload): Json, ) -> Result { + // Check if the wallet is activated let is_activated = CLIENT .get_is_activated(&payload.controller_eth_addr, &payload.account_eth_addr) .await?; @@ -464,18 +385,31 @@ pub async fn inactive_guardian( } trace!(LOG, "Inactive guardian"; "is_activated" => is_activated); + + // Parse and format the account Ethereum address let account_eth_addr: Address = payload .account_eth_addr .parse() .map_err(|e| ApiError::Validation(format!("Failed to parse account_eth_addr: {}", e)))?; let account_eth_addr = format!("0x{:x}", &account_eth_addr); trace!(LOG, "Inactive guardian"; "account_eth_addr" => &account_eth_addr); + + // Update the credentials of the inactive guardian DB.update_credentials_of_inactive_guardian(false, &account_eth_addr) .await?; Ok("Guardian inactivated".to_string()) } +/// Parses an error message from contract call data. +/// +/// # Arguments +/// +/// * `error_data` - The error data as a `String`. +/// +/// # Returns +/// +/// A `String` containing the parsed error message or a default error message. fn parse_error_message(error_data: String) -> String { // Attempt to extract and decode the error message if let Some(hex_error) = error_data.split(" ").last() { @@ -509,6 +443,7 @@ pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { return; } + // Send acknowledgment email match handle_email_event(EmailAuthEvent::Ack { email_addr: from_addr.clone(), command: parsed_email.get_command(false).unwrap_or_default(), @@ -524,6 +459,8 @@ pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { error!(LOG, "Error handling email event: {:?}", e); } } + + // Process the email match handle_email(email.clone()).await { Ok(event) => match handle_email_event(event).await { Ok(_) => {} @@ -555,80 +492,125 @@ pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { Ok(()) } +/// Request status request structure. #[derive(Serialize, Deserialize)] pub struct RequestStatusRequest { + /// The unique identifier for the request. pub request_id: u32, } +/// Enum representing the possible statuses of a request. #[derive(Serialize, Deserialize)] pub enum RequestStatus { + /// The request does not exist. NotExist = 0, + /// The request is pending processing. Pending = 1, + /// The request has been processed. Processed = 2, } +/// Response structure for a request status query. #[derive(Serialize, Deserialize)] pub struct RequestStatusResponse { + /// The unique identifier for the request. pub request_id: u32, + /// The current status of the request. pub status: RequestStatus, + /// Indicates whether the request was successful. pub is_success: bool, + /// The email nullifier, if available. pub email_nullifier: Option, + /// The account salt, if available. pub account_salt: Option, } +/// Request structure for an acceptance request. #[derive(Serialize, Deserialize)] pub struct AcceptanceRequest { + /// The Ethereum address of the controller. pub controller_eth_addr: String, + /// The email address of the guardian. pub guardian_email_addr: String, + /// The unique account code. pub account_code: String, + /// The index of the template to use. pub template_idx: u64, + /// The command to execute. pub command: String, } +/// Response structure for an acceptance request. #[derive(Serialize, Deserialize)] pub struct AcceptanceResponse { + /// The unique identifier for the request. pub request_id: u32, + /// The parameters extracted from the command. pub command_params: Vec, } +/// Request structure for a recovery request. #[derive(Serialize, Deserialize, Debug)] pub struct RecoveryRequest { + /// The Ethereum address of the controller. pub controller_eth_addr: String, + /// The email address of the guardian. pub guardian_email_addr: String, + /// The index of the template to use. pub template_idx: u64, + /// The command to execute. pub command: String, } +/// Response structure for a recovery request. #[derive(Serialize, Deserialize)] pub struct RecoveryResponse { + /// The unique identifier for the request. pub request_id: u32, + /// The parameters extracted from the command. pub command_params: Vec, } +/// Request structure for completing a recovery. #[derive(Serialize, Deserialize)] pub struct CompleteRecoveryRequest { + /// The Ethereum address of the account to recover. pub account_eth_addr: String, + /// The Ethereum address of the controller. pub controller_eth_addr: String, + /// The calldata to complete the recovery. pub complete_calldata: String, } +/// Request structure for retrieving an account salt. #[derive(Serialize, Deserialize)] pub struct GetAccountSaltRequest { + /// The unique account code. pub account_code: String, + /// The email address associated with the account. pub email_addr: String, } +/// Structure representing a permitted wallet. #[derive(Deserialize)] struct PermittedWallet { + /// The name of the wallet. wallet_name: String, + /// The Ethereum address of the controller. controller_eth_addr: String, + /// The hash of the bytecode of the proxy contract. hash_of_bytecode_of_proxy: String, + /// The address of the implementation contract. impl_contract_address: String, + /// The slot location in storage. slot_location: String, } +/// Request structure for marking a guardian as inactive. #[derive(Serialize, Deserialize)] pub struct InactiveGuardianRequest { + /// The Ethereum address of the account. pub account_eth_addr: String, + /// The Ethereum address of the controller. pub controller_eth_addr: String, } diff --git a/packages/relayer/src/modules/web_server/server.rs b/packages/relayer/src/modules/web_server/server.rs index 594ee4c5..b8f371c3 100644 --- a/packages/relayer/src/modules/web_server/server.rs +++ b/packages/relayer/src/modules/web_server/server.rs @@ -11,6 +11,7 @@ use tower_http::cors::{AllowHeaders, AllowMethods, Any, CorsLayer}; pub async fn run_server() -> Result<()> { let addr = WEB_SERVER_ADDRESS.get().unwrap(); + // Initialize the global DB ref before starting the server DB_CELL .get_or_init(|| async { dotenv::dotenv().ok(); @@ -28,6 +29,7 @@ pub async fn run_server() -> Result<()> { }; info!(LOG, "Testing connection to database successfull"); + // Initialize the API routes let mut app = Router::new() .route( "/api/echo", @@ -51,6 +53,7 @@ pub async fn run_server() -> Result<()> { .allow_origin(Any), ); + // Start the server trace!(LOG, "Listening API at {}", addr); axum::Server::bind(&addr.parse()?) .serve(app.into_make_service()) From 4c179e5c56552b315da99c59460ac89e9b0f8e2d Mon Sep 17 00:00:00 2001 From: Dimitri Date: Thu, 19 Sep 2024 14:14:03 +0700 Subject: [PATCH 091/121] Rename func to extract_template_vals_from_command --- packages/relayer/src/modules/web_server/rest_api.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs index 8b0093d0..e17988fe 100644 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ b/packages/relayer/src/modules/web_server/rest_api.rs @@ -3,7 +3,9 @@ use anyhow::Result; use axum::Json; use hex::decode; use rand::Rng; -use relayer_utils::{calculate_account_salt, extract_template_vals, TemplateValue, LOG}; +use relayer_utils::{ + calculate_account_salt, extract_template_vals_from_command, TemplateValue, LOG, +}; use serde::{Deserialize, Serialize}; use std::str; @@ -60,7 +62,7 @@ pub async fn handle_acceptance_request( .await?; // Extract and validate command parameters - let command_params = extract_template_vals(&payload.command, command_template) + let command_params = extract_template_vals_from_command(&payload.command, command_template) .map_err(|_| ApiError::Validation("Invalid command".to_string()))?; // Recover the account address @@ -185,7 +187,7 @@ pub async fn handle_recovery_request( .await?; // Extract and validate command parameters - let command_params = extract_template_vals(&payload.command, command_template) + let command_params = extract_template_vals_from_command(&payload.command, command_template) .map_err(|_| ApiError::Validation("Invalid command".to_string()))?; // Recover the account address From 9cf423cf6f15ba656eea51891243dd708d195003 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Thu, 19 Sep 2024 14:31:21 +0700 Subject: [PATCH 092/121] Exclude abi folder as workspace member --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 9fd16a34..fc094365 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,4 @@ [workspace] members = ["packages/relayer"] -exclude = ["node_modules/*"] +exclude = ["node_modules/*", "packages/relayer/src/abis"] resolver = "2" From cf12f6d4482163dc7c20c5217336ff9e86f55c38 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Thu, 19 Sep 2024 17:10:30 +0700 Subject: [PATCH 093/121] Ignore abis for fmt --- Cargo.lock | 2 +- packages/relayer/Cargo.toml | 3 ++- packages/relayer/src/abis/mod.rs | 7 +++++++ rust-toolchain | 2 +- rustfmt.toml | 4 ---- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8c4df7ba..18223391 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4141,7 +4141,7 @@ dependencies = [ [[package]] name = "relayer-utils" version = "0.3.7" -source = "git+https://github.com/zkemail/relayer-utils.git?rev=0c19631#0c196312b6ce7ce2c282d11e6c736e958b8df77a" +source = "git+https://github.com/zkemail/relayer-utils.git?rev=6fb85e6#6fb85e6b867165a5deb2fe877bc81827b6bf001e" dependencies = [ "anyhow", "base64 0.21.7", diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 4ccd237d..ef4a199d 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -25,7 +25,8 @@ tiny_http = "0.12.0" lettre = { version = "0.10.4", features = ["tokio1", "tokio1-native-tls"] } ethers = { version = "2.0.10", features = ["abigen"] } # relayer-utils = { version = "0.3.7", git = "https://github.com/zkemail/relayer-utils.git" } -relayer-utils = { rev = "0c19631", git = "https://github.com/zkemail/relayer-utils.git" } +relayer-utils = { rev = "6fb85e6", git = "https://github.com/zkemail/relayer-utils.git" } +# relayer-utils = { path="../../../relayer-utils" } futures = "0.3.28" sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } regex = "1.10.2" diff --git a/packages/relayer/src/abis/mod.rs b/packages/relayer/src/abis/mod.rs index 6a38feb0..27a4c209 100644 --- a/packages/relayer/src/abis/mod.rs +++ b/packages/relayer/src/abis/mod.rs @@ -1,6 +1,13 @@ #![allow(clippy::all)] + + +#[cfg_attr(rustfmt, rustfmt::skip)] pub mod ecdsa_owned_dkim_registry; + +#[cfg_attr(rustfmt, rustfmt::skip)] pub mod email_account_recovery; + +#[cfg_attr(rustfmt, rustfmt::skip)] pub mod email_auth; pub use ecdsa_owned_dkim_registry::ECDSAOwnedDKIMRegistry; diff --git a/rust-toolchain b/rust-toolchain index 4fa580ba..97e98527 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.80.1 \ No newline at end of file +1.80.1 diff --git a/rustfmt.toml b/rustfmt.toml index a8f43d10..b8116019 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,8 +1,4 @@ max_width = 100 -indent_style = "Block" use_small_heuristics = "Default" -imports_layout = "Mixed" -imports_granularity = "Crate" -group_imports = "StdExternalCrate" reorder_imports = true reorder_modules = true From d5771ded6c2debc53326cbdb4f98c6d7871c5038 Mon Sep 17 00:00:00 2001 From: Dimitri Date: Fri, 20 Sep 2024 14:03:17 +0700 Subject: [PATCH 094/121] Add github actions to build docker image --- .github/workflows/build-img.yml | 51 +++++++++++++++++++++++++ Full.Dockerfile | 66 +++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 .github/workflows/build-img.yml create mode 100644 Full.Dockerfile diff --git a/.github/workflows/build-img.yml b/.github/workflows/build-img.yml new file mode 100644 index 00000000..2e578f91 --- /dev/null +++ b/.github/workflows/build-img.yml @@ -0,0 +1,51 @@ +name: Build and Push Docker Image + +on: + push: + branches: + - refactor + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to the Container registry + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v4 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=sha,prefix= + type=raw,value=latest + + - name: Build and push Docker image + uses: docker/build-push-action@v4 + with: + context: . + file: ./Full.Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/Full.Dockerfile b/Full.Dockerfile new file mode 100644 index 00000000..bb07d4e7 --- /dev/null +++ b/Full.Dockerfile @@ -0,0 +1,66 @@ +# Use the latest official Rust image as the base +FROM rust:latest + +# Use bash as the shell +SHELL ["/bin/bash", "-c"] + +# Install NVM, Node.js, and Yarn +RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash \ + && . $HOME/.nvm/nvm.sh \ + && nvm install 18 \ + && nvm alias default 18 \ + && nvm use default \ + && npm install -g yarn + +# Set the working directory +WORKDIR /relayer + +# Pre-configure Git to avoid common issues and increase clone verbosity +RUN git config --global advice.detachedHead false \ + && git config --global core.compression 0 \ + && git config --global protocol.version 2 \ + && git config --global http.postBuffer 1048576000 \ + && git config --global fetch.verbose true + +# Copy project files +COPY . . + +# Remove the packages/relayer directory +RUN rm -rf packages/relayer + +# Install Yarn dependencies with retry mechanism +RUN . $HOME/.nvm/nvm.sh && nvm use default && yarn || \ + (sleep 5 && yarn) || \ + (sleep 10 && yarn) + +# Install Foundry +RUN curl -L https://foundry.paradigm.xyz | bash \ + && source $HOME/.bashrc \ + && foundryup + +# Verify Foundry installation +RUN source $HOME/.bashrc && forge --version + +# Set the working directory for contracts +WORKDIR /relayer/packages/contracts + +# Install Yarn dependencies for contracts +RUN source $HOME/.nvm/nvm.sh && nvm use default && yarn + +# Build the contracts using Foundry +RUN source $HOME/.bashrc && forge build + +# Copy the project files +COPY packages/relayer /relayer/packages/relayer + +# Set the working directory for the Rust project +WORKDIR /relayer/packages/relayer + +# Build the Rust project with caching +RUN cargo build + +# Expose port +EXPOSE 4500 + +# Set the default command +CMD ["cargo", "run"] From 58ed8fb9a1aa3e4631a257d73fd05ddf9323bc51 Mon Sep 17 00:00:00 2001 From: Shubham Gupta Date: Sat, 28 Sep 2024 06:25:26 +0530 Subject: [PATCH 095/121] ui: Update email template UI - powered by zk email is odd that theyre different sizes - the social icons at the bottom look squished - Update the email template from The Zk team Aayush to The ZK Email Team - Check vertical padding in the mail --- .../relayer/eml_templates/acceptance_request.html | 11 ++++++----- .../relayer/eml_templates/acceptance_success.html | 11 ++++++----- packages/relayer/eml_templates/acknowledgement.html | 11 ++++++----- .../relayer/eml_templates/credential_not_present.html | 11 ++++++----- .../eml_templates/guardian_already_exists.html | 11 ++++++----- packages/relayer/eml_templates/guardian_not_set.html | 11 ++++++----- packages/relayer/eml_templates/recovery_request.html | 11 ++++++----- packages/relayer/eml_templates/recovery_success.html | 11 ++++++----- 8 files changed, 48 insertions(+), 40 deletions(-) diff --git a/packages/relayer/eml_templates/acceptance_request.html b/packages/relayer/eml_templates/acceptance_request.html index 6950b8c8..5b536f0d 100644 --- a/packages/relayer/eml_templates/acceptance_request.html +++ b/packages/relayer/eml_templates/acceptance_request.html @@ -79,7 +79,6 @@ margin: 0; padding: 0; font-size: 16px; - height: 100vh; font-family: 'Space Grotesk', sans-serif; " > @@ -150,9 +149,7 @@

- Cheers,
The Zk team
Aayush + Cheers,
The ZK Email Team

@@ -174,7 +171,7 @@ Powered by ZK Email

@@ -190,6 +187,7 @@ height: 24px; width: 24px; text-align: center; + line-height: 24px; display: block" > @@ -145,9 +144,7 @@

- Cheers,
The Zk team
Aayush + Cheers,
The ZK Email Team

@@ -169,7 +166,7 @@ Powered by ZK Email

@@ -185,6 +182,7 @@ height: 24px; width: 24px; text-align: center; + line-height: 24px; display: block" > @@ -144,9 +143,7 @@

- Cheers,
The Zk team
Aayush + Cheers,
The ZK Email Team

@@ -168,7 +165,7 @@ Powered by ZK Email

@@ -184,6 +181,7 @@ height: 24px; width: 24px; text-align: center; + line-height: 24px; display: block" > @@ -149,9 +148,7 @@

- Cheers,
The Zk team
Aayush + Cheers,
The ZK Email Team

@@ -173,7 +170,7 @@ Powered by ZK Email

@@ -189,6 +186,7 @@ height: 24px; width: 24px; text-align: center; + line-height: 24px; display: block" > @@ -146,9 +145,7 @@

- Cheers,
The Zk team
Aayush + Cheers,
The ZK Email Team

@@ -170,7 +167,7 @@ Powered by ZK Email

@@ -186,6 +183,7 @@ height: 24px; width: 24px; text-align: center; + line-height: 24px; display: block" > @@ -144,9 +143,7 @@

- Cheers,
The Zk team
Aayush + Cheers,
The ZK Email Team

@@ -168,7 +165,7 @@ Powered by ZK Email

@@ -184,6 +181,7 @@ height: 24px; width: 24px; text-align: center; + line-height: 24px; display: block" > @@ -149,9 +148,7 @@

- Cheers,
The Zk team
Aayush + Cheers,
The ZK Email Team

@@ -173,7 +170,7 @@ Powered by ZK Email

@@ -189,6 +186,7 @@ height: 24px; width: 24px; text-align: center; + line-height: 24px; display: block" > @@ -145,9 +144,7 @@

- Cheers,
The Zk team
Aayush + Cheers,
The ZK Email Team

@@ -169,7 +166,7 @@ Powered by ZK Email

@@ -185,6 +182,7 @@ height: 24px; width: 24px; text-align: center; + line-height: 24px; display: block" > Date: Sat, 28 Sep 2024 22:51:22 +0530 Subject: [PATCH 096/121] feat: GPU prover (#66) * feat: use GPU for proving * chore: update Dockerfile * chore: cleanup * chore: update params.zip * chore: update circom_proofgen.sh * chore: update --- Relayer.Dockerfile | 2 +- libs/rapidsnark.Dockerfile | 22 ----------- packages/prover/Dockerfile | 61 +++++++++++++++++++----------- packages/prover/circom_proofgen.sh | 26 ++++--------- packages/prover/core.py | 28 +++++++++----- packages/prover/local_setup.sh | 7 +--- packages/prover/modal_server.py | 13 ++++--- 7 files changed, 74 insertions(+), 85 deletions(-) delete mode 100644 libs/rapidsnark.Dockerfile diff --git a/Relayer.Dockerfile b/Relayer.Dockerfile index cd99b0ff..1dafb15e 100644 --- a/Relayer.Dockerfile +++ b/Relayer.Dockerfile @@ -1,5 +1,5 @@ # Use the base image -FROM us-central1-docker.pkg.dev/zkairdrop/ether-email-auth/relayer-base:v1 +FROM bisht13/relayer-base # Copy the project files COPY packages/relayer /relayer/packages/relayer diff --git a/libs/rapidsnark.Dockerfile b/libs/rapidsnark.Dockerfile deleted file mode 100644 index b1c3f656..00000000 --- a/libs/rapidsnark.Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ - -FROM ubuntu:20.04 - -ARG DEBIAN_FRONTEND=noninteractive - -# Install Node.js, Yarn and required dependencies -RUN apt-get update \ - && apt-get install -y curl git gnupg build-essential cmake libgmp-dev libsodium-dev nasm \ - && curl --silent --location https://deb.nodesource.com/setup_12.x | bash - \ - && apt-get install -y nodejs - -RUN git clone https://github.com/iden3/rapidsnark.git /rapidsnark -WORKDIR /rapidsnark -RUN npm install -RUN git submodule init -RUN git submodule update -RUN npx task createFieldSources -RUN npx task buildPistache -RUN apt-get install -y -RUN npx task buildProver - -ENTRYPOINT ["/rapidsnark/build/prover"] diff --git a/packages/prover/Dockerfile b/packages/prover/Dockerfile index bec65c85..d7fe17bc 100644 --- a/packages/prover/Dockerfile +++ b/packages/prover/Dockerfile @@ -1,49 +1,66 @@ -FROM python:3.10 +FROM nvidia/cuda:12.4.0-devel-ubuntu22.04 RUN apt-get update && apt-get upgrade -y # Update the package list and install necessary dependencies RUN apt-get update && \ - apt install -y cmake build-essential pkg-config libssl-dev libgmp-dev libsodium-dev nasm git awscli gcc nodejs npm + DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \ + cmake \ + build-essential \ + pkg-config \ + libssl-dev \ + libgmp-dev \ + libffi-dev \ + libsodium-dev \ + nasm \ + git \ + awscli \ + gcc \ + nodejs \ + npm \ + curl \ + m4 \ + python3 \ + python3-pip \ + python3-dev \ + wget \ + software-properties-common \ + unzip \ + && rm -rf /var/lib/apt/lists/* + +# Set Python 3 as the default python version +RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 1 \ + && update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1 # Node install RUN npm install -g n -RUN n 18 +RUN n 22 RUN npm install -g yarn snarkjs -RUN git clone -b feat/body-parsing-circuit https://github.com/zkemail/ether-email-auth.git + +RUN git clone -b feat/gpu https://github.com/zkemail/ether-email-auth.git WORKDIR /ether-email-auth/packages/prover RUN pip install -r requirements.txt RUN cp ./circom_proofgen.sh /root WORKDIR /root RUN ls /root -# RUN mkdir params -# RUN cp /email-wallet/packages/prover/params/account_creation.wasm /root/params -# RUN cp /email-wallet/packages/prover/params/account_init.wasm /root/params -# RUN cp /email-wallet/packages/prover/params/account_transport.wasm /root/params -# RUN cp /email-wallet/packages/prover/params/claim.wasm /root/params -# RUN cp /email-wallet/packages/prover/params/email_sender.wasm /root/params RUN mkdir params WORKDIR /root/params -RUN gdown "https://drive.google.com/uc?id=1XDPFIL5YK8JzLGoTjmHLXO9zMDjSQcJH" +RUN gdown "https://drive.google.com/uc?id=1l3mNqFYv-YZc2efFlphFUkoaCnGCxFtE" RUN unzip params.zip RUN mv params/* /root/params WORKDIR /root RUN ls params -# RUN mv build params -# RUN curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-account-creation/contributions/emailwallet-account-creation_00019.zkey --output ./params/account_creation.zkey -# RUN curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-account-init/contributions/emailwallet-account-init_00007.zkey --output ./params/account_init.zkey -# RUN curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-account-transport/contributions/emailwallet-account-transport_00005.zkey --output ./params/account_transport.zkey -# RUN curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-claim/contributions/emailwallet-claim_00006.zkey --output ./params/claim.zkey -# RUN curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-email-sender/contributions/emailwallet-email-sender_00006.zkey --output ./params/email_sender.zkey RUN chmod +x circom_proofgen.sh RUN mkdir build -RUN git clone https://github.com/iden3/rapidsnark-old.git rapidsnark +RUN git clone https://github.com/Orbiter-Finance/rapidsnark.git rapidsnark WORKDIR /root/rapidsnark RUN yarn RUN git submodule init RUN git submodule update -RUN npx task createFieldSources -RUN npx task buildPistache -RUN npx task buildProver -RUN chmod +x build/prover +RUN ./build_gmp.sh host +RUN mkdir build_prover +WORKDIR /root/rapidsnark/build_prover +RUN cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package -DNVML_LIBRARY=/usr/local/cuda-12.4/targets/x86_64-linux/lib/stubs/libnvidia-ml.so +RUN make -j$(nproc) && make install +RUN chmod +x ../package/bin/prover_cuda WORKDIR /root \ No newline at end of file diff --git a/packages/prover/circom_proofgen.sh b/packages/prover/circom_proofgen.sh index 738f2e2c..18ac8162 100755 --- a/packages/prover/circom_proofgen.sh +++ b/packages/prover/circom_proofgen.sh @@ -21,21 +21,9 @@ public_path="${buildDir}/rapidsnark_public_${circuitName}_${nonce}.json" cd "${SCRIPT_DIR}" echo "entered zk email path: ${SCRIPT_DIR}" -echo "NODE_OPTIONS='--max-old-space-size=644000' snarkjs wc "${paramsDir}/${circuitName}.wasm" "${input_path}" "${witness_path}"" -NODE_OPTIONS='--max-old-space-size=644000' snarkjs wc "${paramsDir}/${circuitName}.wasm" "${input_path}" "${witness_path}" | tee /dev/stderr +${paramsDir}/${circuitName}_cpp/${circuitName} "${input_path}" "${witness_path}" | tee /dev/stderr status_jswitgen=$? -echo "✓ Finished witness generation with js! ${status_jswitgen}" - -# TODO: Get C-based witness gen to work -# echo "/${build_dir}/${CIRCUIT_NAME}_cpp/${CIRCUIT_NAME} ${input_wallet_path} ${witness_path}" -# "/${build_dir}/${CIRCUIT_NAME}_cpp/${CIRCUIT_NAME}" "${input_wallet_path}" "${witness_path}" -# status_c_wit=$? - -# echo "Finished C witness gen! Status: ${status_c_wit}" -# if [ $status_c_wit -ne 0 ]; then -# echo "C based witness gen failed with status (might be on machine specs diff than compilation): ${status_c_wit}" -# exit 1 -# fi +echo "✓ Finished witness generation with cpp! ${status_jswitgen}" if [ $isLocal = 1 ]; then # DEFAULT SNARKJS PROVER (SLOW) @@ -43,14 +31,14 @@ if [ $isLocal = 1 ]; then status_prover=$? echo "✓ Finished slow proofgen! Status: ${status_prover}" else - # RAPIDSNARK PROVER (10x FASTER) - echo "ldd ${SCRIPT_DIR}/rapidsnark/build/prover" - ldd "${SCRIPT_DIR}/rapidsnark/build/prover" + # RAPIDSNARK PROVER GPU + echo "ldd ${SCRIPT_DIR}/rapidsnark/package/bin/prover_cuda" + ldd "${SCRIPT_DIR}/rapidsnark/package/bin/prover_cuda" status_lld=$? echo "✓ lld prover dependencies present! ${status_lld}" - echo "${SCRIPT_DIR}/rapidsnark/build/prover ${paramsDir}/${circuitName}.zkey ${witness_path} ${proof_path} ${public_path}" - "${SCRIPT_DIR}/rapidsnark/build/prover" "${paramsDir}/${circuitName}.zkey" "${witness_path}" "${proof_path}" "${public_path}" | tee /dev/stderr + echo "${SCRIPT_DIR}/rapidsnark/package/bin/prover_cuda ${paramsDir}/${circuitName}.zkey ${witness_path} ${proof_path} ${public_path}" + "${SCRIPT_DIR}/rapidsnark/package/bin/prover_cuda" "${paramsDir}/${circuitName}.zkey" "${witness_path}" "${proof_path}" "${public_path}" | tee /dev/stderr status_prover=$? echo "✓ Finished rapid proofgen! Status: ${status_prover}" fi diff --git a/packages/prover/core.py b/packages/prover/core.py index 194fd9f0..eb4c1f74 100644 --- a/packages/prover/core.py +++ b/packages/prover/core.py @@ -3,7 +3,7 @@ import json import logging -logger = logging.getLogger(__name__) +# logger = logging.getLogger(__name__) def gen_email_auth_proof(nonce: str, is_local: bool, input: dict) -> dict: @@ -19,18 +19,28 @@ def gen_email_auth_proof(nonce: str, is_local: bool, input: dict) -> dict: def store_input(circuit_name: str, nonce: str, json_data: dict): + print("Storing input") cur_dir = get_cur_dir() + print(f"Current dir: {cur_dir}") build_dir = os.path.join(cur_dir, "build") # check if build_dir exists if not os.path.exists(build_dir): os.makedirs(build_dir) + print(f"Build dir: {build_dir}") json_file_path = os.path.join( build_dir, "input_" + circuit_name + "_" + nonce + ".json" ) - logger.info(f"Store user input to {json_file_path}") + print(f"Json file path: {json_file_path}") + print(f"Json data: {json_data}") + print(f"Json data type: {type(json_data)}") + # logger.info(f"Store user input to {json_file_path}") with open(json_file_path, "w") as json_file: json_file.write(json_data) + # Read the file back + with open(json_file_path, "r") as json_file: + print(json_file.read()) + print("Stored input") def load_proof(circuit_name: str, nonce: str) -> dict: @@ -39,7 +49,7 @@ def load_proof(circuit_name: str, nonce: str) -> dict: json_file_path = os.path.join( build_dir, "rapidsnark_proof_" + circuit_name + "_" + nonce + ".json" ) - logger.info(f"Loading proof from {json_file_path}") + # logger.info(f"Loading proof from {json_file_path}") with open(json_file_path, "r") as json_file: return json.loads(json_file.read()) @@ -50,7 +60,7 @@ def load_pub_signals(circuit_name: str, nonce: str) -> dict: json_file_path = os.path.join( build_dir, "rapidsnark_public_" + circuit_name + "_" + nonce + ".json" ) - logger.info(f"Loading public signals from {json_file_path}") + # logger.info(f"Loading public signals from {json_file_path}") with open(json_file_path, "r") as json_file: return json.loads(json_file.read()) @@ -59,9 +69,9 @@ def gen_proof(circuit_name: str, nonce: str, is_local: bool): is_local_int: int = 1 if is_local else 0 cur_dir = get_cur_dir() params_dir = os.path.join(cur_dir, "params") - logger.info(f"Params dir: {params_dir}") + # logger.info(f"Params dir: {params_dir}") build_dir = os.path.join(cur_dir, "build") - logger.info(f"Build dir: {build_dir}") + # logger.info(f"Build dir: {build_dir}") result = subprocess.run( [ os.path.join(cur_dir, "circom_proofgen.sh"), @@ -72,9 +82,9 @@ def gen_proof(circuit_name: str, nonce: str, is_local: bool): str(is_local_int), ] ) - logger.info(f"Proof generation result: {result.returncode}") - if result.stderr is not None: - logger.error(result.stderr) + # logger.info(f"Proof generation result: {result.returncode}") + # if result.stderr is not None: + # logger.error(result.stderr) print(result.stdout) print(result.stderr) diff --git a/packages/prover/local_setup.sh b/packages/prover/local_setup.sh index 77bd4eb6..026f0cfb 100755 --- a/packages/prover/local_setup.sh +++ b/packages/prover/local_setup.sh @@ -6,11 +6,6 @@ mkdir -p build npm install -g snarkjs@latest pip install -r requirements.txt mkdir build && cd build -gdown "https://drive.google.com/uc?id=1XDPFIL5YK8JzLGoTjmHLXO9zMDjSQcJH" +gdown "https://drive.google.com/uc?id=1l3mNqFYv-YZc2efFlphFUkoaCnGCxFtE" unzip params.zip -# curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-account-creation/contributions/emailwallet-account-creation_00019.zkey --output /root/params/account_creation.zkey -# curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-account-init/contributions/emailwallet-account-init_00007.zkey --output /root/params/account_init.zkey -# curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-account-transport/contributions/emailwallet-account-transport_00005.zkey --output /root/params/account_transport.zkey -# curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-claim/contributions/emailwallet-claim_00006.zkey --output /root/params/claim.zkey -# curl https://email-wallet-trusted-setup-ceremony-pse-p0tion-production.s3.eu-central-1.amazonaws.com/circuits/emailwallet-email-sender/contributions/emailwallet-email-sender_00006.zkey --output /root/params/email_sender.zkey chmod +x circom_proofgen.sh diff --git a/packages/prover/modal_server.py b/packages/prover/modal_server.py index e59c239f..567ae3b3 100644 --- a/packages/prover/modal_server.py +++ b/packages/prover/modal_server.py @@ -5,7 +5,7 @@ from google.cloud.logging_v2.handlers import setup_logging from google.oauth2 import service_account -app = modal.App("email-auth-prover-v1.3.0") +app = modal.App("email-auth-prover-v1.4.0") image = modal.Image.from_dockerfile("Dockerfile") @@ -15,7 +15,8 @@ mounts=[ modal.Mount.from_local_python_packages("core"), ], - cpu=14, + cpu=16, + gpu="any", secrets=[modal.Secret.from_name("gc-ether-email-auth-prover")], ) @modal.wsgi_app() @@ -45,17 +46,17 @@ def prove_email_auth(): print("prove_email_auth") req = request.get_json() input = req["input"] - logger = logging.getLogger(__name__) - logger.info(req) + # logger = logging.getLogger(__name__) + # logger.info(req) print(req) nonce = random.randint( 0, sys.maxsize, ) - logger.info(nonce) + # logger.info(nonce) print(nonce) proof = gen_email_auth_proof(str(nonce), False, input) - logger.info(proof) + # logger.info(proof) print(proof) return jsonify(proof) From d81c86e7bf3ff335cfd414e584093bcf36351421 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sun, 29 Sep 2024 17:16:19 -0700 Subject: [PATCH 097/121] fix: regex json path --- packages/relayer/.env.example | 4 +--- packages/relayer/README.md | 1 - packages/relayer/src/config.rs | 4 ++-- packages/relayer/src/core.rs | 13 +++++++++---- packages/relayer/src/lib.rs | 4 ++-- packages/relayer/src/modules/dkim.rs | 17 +++++++++++++---- packages/relayer/src/strings.rs | 4 +--- 7 files changed, 28 insertions(+), 19 deletions(-) diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example index 34721015..5a0c88a9 100644 --- a/packages/relayer/.env.example +++ b/packages/relayer/.env.example @@ -11,10 +11,8 @@ PROVER_ADDRESS="https://zkemail--email-auth-prover-v1-3-0-flask-app.modal.run" DATABASE_URL= "postgres://test@localhost/emailauth_test" RELAYER_EMAIL_ADDR= WEB_SERVER_ADDRESS="127.0.0.1:4500" -CIRCUITS_DIR_PATH= #Path to email-wallet/packages/circuits EMAIL_TEMPLATES_PATH= #Path to email templates, e.g. ./packages/relayer/eml_templates/ -SELECTOR_DEF_PATH="./src/regex_json/selector_def.json" -REQUEST_DEF_PATH="./src/regex_json/request_def.json" +REGEX_JSON_DIR_PATH= CANISTER_ID="q7eci-dyaaa-aaaak-qdbia-cai" PEM_PATH="./.ic.pem" diff --git a/packages/relayer/README.md b/packages/relayer/README.md index d4f8a333..4689b36b 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -51,7 +51,6 @@ You can run the relayer either on your local environments or cloud instances (we DATABASE_URL= "postgres://new_user:my_secure_password@localhost/my_new_database" WEB_SERVER_ADDRESS="127.0.0.1:4500" - CIRCUITS_DIR_PATH= # Absolute path to packages/circuits EMAIL_TEMPLATES_PATH= # Absolute path to packages/relayer/eml_templates CANISTER_ID="q7eci-dyaaa-aaaak-qdbia-cai" diff --git a/packages/relayer/src/config.rs b/packages/relayer/src/config.rs index 2e5a9095..6615cca5 100644 --- a/packages/relayer/src/config.rs +++ b/packages/relayer/src/config.rs @@ -14,7 +14,7 @@ pub struct RelayerConfig { pub relayer_email_addr: String, pub db_path: String, pub web_server_address: String, - pub circuits_dir_path: PathBuf, + pub regex_json_dir_path: PathBuf, pub prover_address: String, pub chain_rpc_provider: String, pub chain_rpc_explorer: String, @@ -43,7 +43,7 @@ impl RelayerConfig { relayer_email_addr: env::var(RELAYER_EMAIL_ADDR_KEY).unwrap(), db_path: env::var(DATABASE_PATH_KEY).unwrap(), web_server_address: env::var(WEB_SERVER_ADDRESS_KEY).unwrap(), - circuits_dir_path: env::var(CIRCUITS_DIR_PATH_KEY).unwrap().into(), + regex_json_dir_path: env::var(REGEX_JSON_DIR_PATH_KEY).unwrap().into(), prover_address: env::var(PROVER_ADDRESS_KEY).unwrap(), chain_rpc_provider: env::var(CHAIN_RPC_PROVIDER_KEY).unwrap(), chain_rpc_explorer: env::var(CHAIN_RPC_EXPLORER_KEY).unwrap(), diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs index f9c10165..a06a6324 100644 --- a/packages/relayer/src/core.rs +++ b/packages/relayer/src/core.rs @@ -36,10 +36,15 @@ pub async fn handle_email(email: String) -> Result { trace!(LOG, "From address: {}", guardian_email_addr); let email_body = parsed_email.get_cleaned_body()?; - let request_def_path = env::var(REQUEST_DEF_PATH_KEY) - .map_err(|_| anyhow!("ENV var {} not set", REQUEST_DEF_PATH_KEY))?; - let request_def_contents = fs::read_to_string(&request_def_path) - .map_err(|e| anyhow!("Failed to read file {}: {}", request_def_path, e))?; + let request_def_path = + PathBuf::from(REGEX_JSON_DIR_PATH.get().unwrap()).join("request_def.json"); + let request_def_contents = fs::read_to_string(&request_def_path).map_err(|e| { + anyhow!( + "Failed to read file {:?}: {}", + request_def_path.display(), + e + ) + })?; let request_decomposed_def = serde_json::from_str(&request_def_contents) .map_err(|e| EmailError::Parse(format!("Failed to parse request_def.json: {}", e)))?; let request_idxes = extract_substr_idxes(&email, &request_decomposed_def)?; diff --git a/packages/relayer/src/lib.rs b/packages/relayer/src/lib.rs index c4d1adb6..d0b83379 100644 --- a/packages/relayer/src/lib.rs +++ b/packages/relayer/src/lib.rs @@ -32,7 +32,7 @@ use std::path::PathBuf; use std::sync::{Arc, OnceLock}; use tokio::time::Duration; -pub static CIRCUITS_DIR_PATH: OnceLock = OnceLock::new(); +pub static REGEX_JSON_DIR_PATH: OnceLock = OnceLock::new(); pub static WEB_SERVER_ADDRESS: OnceLock = OnceLock::new(); pub static PROVER_ADDRESS: OnceLock = OnceLock::new(); pub static PRIVATE_KEY: OnceLock = OnceLock::new(); @@ -103,7 +103,7 @@ pub async fn run(config: RelayerConfig) -> Result<()> { info!(LOG, "Starting relayer"); // Initialize global configuration - CIRCUITS_DIR_PATH.set(config.circuits_dir_path).unwrap(); + REGEX_JSON_DIR_PATH.set(config.regex_json_dir_path).unwrap(); WEB_SERVER_ADDRESS.set(config.web_server_address).unwrap(); PROVER_ADDRESS.set(config.prover_address).unwrap(); PRIVATE_KEY.set(config.private_key).unwrap(); diff --git a/packages/relayer/src/modules/dkim.rs b/packages/relayer/src/modules/dkim.rs index fe91ee7c..369f063b 100644 --- a/packages/relayer/src/modules/dkim.rs +++ b/packages/relayer/src/modules/dkim.rs @@ -2,6 +2,7 @@ use std::fs; use anyhow::anyhow; use relayer_utils::extract_substr_idxes; +use relayer_utils::DecomposedRegexConfig; use relayer_utils::LOG; use crate::*; @@ -177,16 +178,24 @@ pub async fn check_and_update_dkim( } // Get selector - let selector_def_path = env::var(SELECTOR_DEF_PATH_KEY) - .map_err(|_| anyhow!("ENV var {} not set", SELECTOR_DEF_PATH_KEY))?; + let selector_def_path = + PathBuf::from(env::var(REGEX_JSON_DIR_PATH_KEY).unwrap()).join("selector_def.json"); let selector_def_contents = fs::read_to_string(&selector_def_path) - .map_err(|e| anyhow!("Failed to read file {}: {}", selector_def_path, e))?; - let selector_decomposed_def = serde_json::from_str(&selector_def_path).unwrap(); + .map_err(|e| anyhow!("Failed to read file {}: {}", selector_def_path.display(), e))?; + let selector_decomposed_def: DecomposedRegexConfig = + serde_json::from_str(&selector_def_contents).map_err(|e| { + anyhow!( + "Failed to parse JSON from file {}: {}", + selector_def_path.display(), + e + ) + })?; let selector = { let idxes = extract_substr_idxes(&parsed_email.canonicalized_header, &selector_decomposed_def)?[0]; parsed_email.canonicalized_header[idxes.0..idxes.1].to_string() }; + info!(LOG, "selector {}", selector); // Generate IC agent and create oracle client diff --git a/packages/relayer/src/strings.rs b/packages/relayer/src/strings.rs index 51b610ac..b9db6720 100644 --- a/packages/relayer/src/strings.rs +++ b/packages/relayer/src/strings.rs @@ -3,7 +3,6 @@ pub const SMTP_SERVER_KEY: &str = "SMTP_SERVER"; pub const RELAYER_EMAIL_ADDR_KEY: &str = "RELAYER_EMAIL_ADDR"; pub const DATABASE_PATH_KEY: &str = "DATABASE_URL"; pub const WEB_SERVER_ADDRESS_KEY: &str = "WEB_SERVER_ADDRESS"; -pub const CIRCUITS_DIR_PATH_KEY: &str = "CIRCUITS_DIR_PATH"; pub const PROVER_ADDRESS_KEY: &str = "PROVER_ADDRESS"; pub const CHAIN_RPC_PROVIDER_KEY: &str = "CHAIN_RPC_PROVIDER"; pub const CHAIN_RPC_EXPLORER_KEY: &str = "CHAIN_RPC_EXPLORER"; @@ -11,8 +10,7 @@ pub const PRIVATE_KEY_KEY: &str = "PRIVATE_KEY"; pub const CHAIN_ID_KEY: &str = "CHAIN_ID"; pub const EMAIL_ACCOUNT_RECOVERY_VERSION_ID_KEY: &str = "EMAIL_ACCOUNT_RECOVERY_VERSION_ID"; pub const EMAIL_TEMPLATES_PATH_KEY: &str = "EMAIL_TEMPLATES_PATH"; -pub const SELECTOR_DEF_PATH_KEY: &str = "SELECTOR_DEF_PATH"; -pub const REQUEST_DEF_PATH_KEY: &str = "REQUEST_DEF_PATH"; +pub const REGEX_JSON_DIR_PATH_KEY: &str = "REGEX_JSON_DIR_PATH"; // Log strings pub const JSON_LOGGER_KEY: &str = "JSON_LOGGER"; From 6b8bf54e8582526a25f9ec6007ffb9e583734414 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sun, 29 Sep 2024 17:17:30 -0700 Subject: [PATCH 098/121] chore: update k8s manifest --- kubernetes/relayer.staging.yml | 30 +++++++++++++++--------------- kubernetes/relayer.yml | 30 +++++++++++++++--------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/kubernetes/relayer.staging.yml b/kubernetes/relayer.staging.yml index 2c9855bd..cf985be4 100644 --- a/kubernetes/relayer.staging.yml +++ b/kubernetes/relayer.staging.yml @@ -6,18 +6,18 @@ metadata: labels: app: relayer data: - EMAIL_ACCOUNT_RECOVERY_VERSION_ID: '' - CHAIN_RPC_PROVIDER: '' - CHAIN_RPC_EXPLORER: '' - CHAIN_ID: '' - WEB_SERVER_ADDRESS: '' - CIRCUITS_DIR_PATH: '' - EMAIL_TEMPLATES_PATH: '' - CANISTER_ID: '' - IC_REPLICA_URL: '' - JSON_LOGGER: '' - PEM_PATH: '' - SMTP_SERVER: '' + EMAIL_ACCOUNT_RECOVERY_VERSION_ID: "" + CHAIN_RPC_PROVIDER: "" + CHAIN_RPC_EXPLORER: "" + CHAIN_ID: "" + WEB_SERVER_ADDRESS: "" + REGEX_JSON_DIR_PATH: "" + EMAIL_TEMPLATES_PATH: "" + CANISTER_ID: "" + IC_REPLICA_URL: "" + JSON_LOGGER: "" + PEM_PATH: "" + SMTP_SERVER: "" --- apiVersion: v1 @@ -111,8 +111,8 @@ spec: periodSeconds: 30 volumeMounts: - name: pem-volume - mountPath: '/relayer/packages/relayer/.ic.pem' - subPath: '.ic.pem' + mountPath: "/relayer/packages/relayer/.ic.pem" + subPath: ".ic.pem" - name: smtp-container image: bisht13/relayer-smtp-new:latest ports: @@ -131,7 +131,7 @@ spec: secretName: relayer-secret-email-auth items: - key: ICPEM - path: '.ic.pem' + path: ".ic.pem" --- apiVersion: v1 kind: Service diff --git a/kubernetes/relayer.yml b/kubernetes/relayer.yml index 83c3da5f..08854dca 100644 --- a/kubernetes/relayer.yml +++ b/kubernetes/relayer.yml @@ -6,18 +6,18 @@ metadata: labels: app: relayer data: - EMAIL_ACCOUNT_RECOVERY_VERSION_ID: '' - CHAIN_RPC_PROVIDER: '' - CHAIN_RPC_EXPLORER: '' - CHAIN_ID: '' - WEB_SERVER_ADDRESS: '' - CIRCUITS_DIR_PATH: '' - EMAIL_TEMPLATES_PATH: '' - CANISTER_ID: '' - IC_REPLICA_URL: '' - JSON_LOGGER: '' - PEM_PATH: '' - SMTP_SERVER: '' + EMAIL_ACCOUNT_RECOVERY_VERSION_ID: "" + CHAIN_RPC_PROVIDER: "" + CHAIN_RPC_EXPLORER: "" + CHAIN_ID: "" + WEB_SERVER_ADDRESS: "" + REGEX_JSON_DIR_PATH: "" + EMAIL_TEMPLATES_PATH: "" + CANISTER_ID: "" + IC_REPLICA_URL: "" + JSON_LOGGER: "" + PEM_PATH: "" + SMTP_SERVER: "" --- apiVersion: v1 @@ -111,8 +111,8 @@ spec: periodSeconds: 30 volumeMounts: - name: pem-volume - mountPath: '/relayer/packages/relayer/.ic.pem' - subPath: '.ic.pem' + mountPath: "/relayer/packages/relayer/.ic.pem" + subPath: ".ic.pem" - name: smtp-container image: bisht13/relayer-smtp-new:latest ports: @@ -131,7 +131,7 @@ spec: secretName: relayer-secret-email-auth items: - key: ICPEM - path: '.ic.pem' + path: ".ic.pem" --- apiVersion: v1 From 14659787868927db1087ce500fa77f41290d6d99 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Tue, 24 Sep 2024 22:13:15 +0000 Subject: [PATCH 099/121] feat: use GPU for proving --- libs/rapidsnark.Dockerfile | 20 ++++++++++++++++++++ packages/prover/Dockerfile | 3 ++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 libs/rapidsnark.Dockerfile diff --git a/libs/rapidsnark.Dockerfile b/libs/rapidsnark.Dockerfile new file mode 100644 index 00000000..1a8cf1f7 --- /dev/null +++ b/libs/rapidsnark.Dockerfile @@ -0,0 +1,20 @@ +FROM ubuntu:22.04 + +ARG DEBIAN_FRONTEND=noninteractive + +# Install Node.js, Yarn and required dependencies +RUN apt-get update \ + && apt-get install -y curl git gnupg build-essential cmake libgmp-dev libsodium-dev nasm curl m4 \ + && curl --silent --location https://deb.nodesource.com/setup_12.x | bash - \ + && apt-get install -y nodejs + +RUN git clone https://github.com/Orbiter-Finance/rapidsnark.git /rapidsnark +WORKDIR /rapidsnark +RUN git submodule init +RUN git submodule update +./build_gmp.sh host +mkdir build_prover && cd build_prover +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package +make -j$(nproc) && make install + +ENTRYPOINT ["/rapidsnark/package/build/prover_cuda"] diff --git a/packages/prover/Dockerfile b/packages/prover/Dockerfile index d7fe17bc..2007b8b8 100644 --- a/packages/prover/Dockerfile +++ b/packages/prover/Dockerfile @@ -36,10 +36,11 @@ RUN npm install -g n RUN n 22 RUN npm install -g yarn snarkjs -RUN git clone -b feat/gpu https://github.com/zkemail/ether-email-auth.git +RUN git clone -b refactor https://github.com/zkemail/ether-email-auth.git WORKDIR /ether-email-auth/packages/prover RUN pip install -r requirements.txt RUN cp ./circom_proofgen.sh /root +RUN cp ./email_auth_with_body_parsing_with_qp_encoding /root WORKDIR /root RUN ls /root RUN mkdir params From e1080aaf7eb2845976879d6b993434399d4e1f60 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sun, 29 Sep 2024 19:36:32 -0700 Subject: [PATCH 100/121] chore: add comment in example env --- packages/contracts/{.env.sample => .env.example} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename packages/contracts/{.env.sample => .env.example} (90%) diff --git a/packages/contracts/.env.sample b/packages/contracts/.env.example similarity index 90% rename from packages/contracts/.env.sample rename to packages/contracts/.env.example index 132381ec..8e28ffb5 100644 --- a/packages/contracts/.env.sample +++ b/packages/contracts/.env.example @@ -10,6 +10,6 @@ PRIVATE_KEY= CHAIN_ID=84532 RPC_URL="https://sepolia.base.org" -SIGNER=0x69bec2dd161d6bbcc91ec32aa44d9333ebc864c0 # Signer for the dkim oracle on IC +SIGNER=0x69bec2dd161d6bbcc91ec32aa44d9333ebc864c0 # Signer for the dkim oracle on IC (Don't change this) ETHERSCAN_API_KEY= # CHAIN_NAME="base_sepolia" From 987575fd9a6407292a22c4940c60f87b38174ed5 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Mon, 30 Sep 2024 02:42:26 -0700 Subject: [PATCH 101/121] feat: keep modal warm --- packages/prover/modal_server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/prover/modal_server.py b/packages/prover/modal_server.py index 567ae3b3..44d95f58 100644 --- a/packages/prover/modal_server.py +++ b/packages/prover/modal_server.py @@ -18,6 +18,7 @@ cpu=16, gpu="any", secrets=[modal.Secret.from_name("gc-ether-email-auth-prover")], + keep_warm=True ) @modal.wsgi_app() def flask_app(): From 7bd653409620ad6cd2acd3afe6036afa4439775d Mon Sep 17 00:00:00 2001 From: Shubham Gupta Date: Mon, 30 Sep 2024 18:16:27 +0530 Subject: [PATCH 102/121] ui: update email template design --- .../eml_templates/acceptance_request.html | 85 +++--- .../eml_templates/acceptance_success.html | 85 +++--- .../eml_templates/acknowledgement.html | 85 +++--- .../eml_templates/credential_not_present.html | 85 +++--- packages/relayer/eml_templates/error.html | 252 +++++++++++++++++- .../guardian_already_exists.html | 85 +++--- .../eml_templates/guardian_not_set.html | 73 +++-- .../eml_templates/recovery_request.html | 85 +++--- .../eml_templates/recovery_success.html | 85 +++--- 9 files changed, 573 insertions(+), 347 deletions(-) diff --git a/packages/relayer/eml_templates/acceptance_request.html b/packages/relayer/eml_templates/acceptance_request.html index 5b536f0d..853efc6f 100644 --- a/packages/relayer/eml_templates/acceptance_request.html +++ b/packages/relayer/eml_templates/acceptance_request.html @@ -2,23 +2,23 @@ + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +
+ Hi, {{userEmailAddr}}! +
+ An error occurred while processing your request.
+ Error: {{error}} +
+

+ Cheers,
The ZK Email Team +

+
+ + + + + + +
+

+ Powered by + ZK Email +

+ + + + + + + +
+ + + + + + + +
+
+
+ + diff --git a/packages/relayer/eml_templates/guardian_already_exists.html b/packages/relayer/eml_templates/guardian_already_exists.html index 469c5d01..00a0192b 100644 --- a/packages/relayer/eml_templates/guardian_already_exists.html +++ b/packages/relayer/eml_templates/guardian_already_exists.html @@ -2,23 +2,23 @@ - - - - - - - - - - -
- - -
- - - - - - - - - - - - -
- Hi, {{userEmailAddr}}! -
- You have received an guardian request from the wallet address {{walletAddress}}. Reply "Confirm" to this email to accept the request. - Your request ID is #{{requestId}}. - -

- If you did not initiate this request, please contact us immediately. - - -
-

- Cheers,
The ZK Email Team -

-
- - - - - - -
-

- Powered by - ZK Email -

- - - - - - - -
- - - - - - - -
-
-
-
{{command}}
- - diff --git a/packages/relayer/eml_templates/acceptance_success.html b/packages/relayer/eml_templates/acceptance_success.html deleted file mode 100644 index 45908fee..00000000 --- a/packages/relayer/eml_templates/acceptance_success.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -
- Hi, {{userEmailAddr}}! -
- Your guardian request for the wallet address {{walletAddress}}. - Your request ID is #{{requestId}} is now complete. -
-

- Cheers,
The ZK Email Team -

-
- - - - - - -
-

- Powered by - ZK Email -

- - - - - - - -
- - - - - - - -
-
-
- - diff --git a/packages/relayer/eml_templates/acknowledgement.html b/packages/relayer/eml_templates/acknowledgement.html deleted file mode 100644 index 6c720aa7..00000000 --- a/packages/relayer/eml_templates/acknowledgement.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -
- Hi, {{userEmailAddr}}! -
- We have received your following request: {{request}} -
-

- Cheers,
The ZK Email Team -

-
- - - - - - -
-

- Powered by - ZK Email -

- - - - - - - -
- - - - - - - -
-
-
- - diff --git a/packages/relayer/eml_templates/assets/css/main.css b/packages/relayer/eml_templates/assets/css/main.css deleted file mode 100644 index 83f7b115..00000000 --- a/packages/relayer/eml_templates/assets/css/main.css +++ /dev/null @@ -1,491 +0,0 @@ - /* ------------------------------------- - GLOBAL RESETS - ------------------------------------- */ - - /*All the styling goes here*/ - /* :root {color-scheme: light dark;} */ - - @font-face { - font-family: "Regola"; - src: url("https://storage.googleapis.com/eml-templates-assets/Regola_Pro/Regola%20Pro%20Regular.otf") format("opentype"); - } - - @font-face { - font-family: "Regola"; - src: url("https://storage.googleapis.com/eml-templates-assets/Regola_Pro/Regola%20Pro%20Bold.otf") format("opentype"); - font-weight: bold; - } - - @font-face { - font-family: "Regola"; - src: url("https://storage.googleapis.com/eml-templates-assets/Regola_Pro/Regola%20Pro%20Medium.otf") format("opentype"); - font-weight: 500; - } - - @font-face { - font-family: "Regola"; - src: url("https://storage.googleapis.com/eml-templates-assets/Regola_Pro/Regola%20Pro%20Book.otf") format("opentype"); - font-weight: 300; - } - - img { - border: none; - -ms-interpolation-mode: bicubic; - max-width: 100%; - } - - body { - background-color: #f6f6f6; - -webkit-font-smoothing: antialiased; - font-size: 14px; - line-height: 1.4; - margin: 0; - padding: 0; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - } - - table { - border-collapse: separate; - mso-table-lspace: 0pt; - mso-table-rspace: 0pt; - width: 100%; - } - - table td { - font-family: "Regola", sans-serif; - font-size: 14px; - vertical-align: top; - } - - /* ------------------------------------- - BODY & CONTAINER - ------------------------------------- */ - - .body { - background-color: #f6f6f6; - width: 100%; - } - - /* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */ - .container { - display: block; - margin: 0 auto !important; - /* makes it centered */ - max-width: 580px; - padding: 10px; - width: 580px; - } - - /* This should also be a block element, so that it will fill 100% of the .container */ - .content { - box-sizing: border-box; - display: block; - margin: 0 auto; - max-width: 580px; - padding: 10px; - } - - /* Bold text */ - .bold { - font-weight: bold; - } - - /* ------------------------------------- - HEADER, FOOTER, MAIN - ------------------------------------- */ - .main { - background: #ffffff; - border-radius: 3px; - width: 100%; - } - - .banner { - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - background-image: linear-gradient(45deg, #844aff, #5e2bff); - margin-bottom: 1rem; - border-radius: 0.4rem; - padding: 10px; - } - - .wrapper { - box-sizing: border-box; - padding: 20px; - } - - .content-block { - padding-bottom: 10px; - padding-top: 10px; - } - - .footer { - clear: both; - margin-top: 1rem; - text-align: center; - width: 100%; - } - - .logo { - margin-top: -0.5rem; - } - - .footer td, - .footer p, - .footer span, - .footer a { - color: #999999; - font-size: 1rem; - text-align: center; - } - - .social-icons { - margin-top: 1rem; - width: 100%; - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; - } - - .social-icons a { - width: auto; - } - - .social-icons img { - height: 2rem; - width: auto; - } - - .powered-by { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - } - - .powered-by img { - width: 100%; - height: auto; - } - - /* ------------------------------------- - TYPOGRAPHY - ------------------------------------- */ - h1, - h2, - h3, - h4 { - color: #000000; - font-family: "Regola", sans-serif; - font-weight: 400; - line-height: 1.4; - margin: 0; - margin-bottom: 30px; - } - - h1 { - font-size: 35px; - font-weight: 300; - text-align: center; - text-transform: capitalize; - } - - p, - ul, - ol { - font-family: "Regola", sans-serif; - font-size: 14px; - font-weight: normal; - margin: 0; - margin-bottom: 15px; - } - - p li, - ul li, - ol li { - list-style-position: inside; - margin-left: 5px; - } - - a { - color: #3498db; - text-decoration: underline; - } - - .info-link { - color: #0000ff; - opacity: 0.7; - text-decoration: underline; - } - - /* ------------------------------------- - BUTTONS - ------------------------------------- */ - .btn { - box-sizing: border-box; - width: 100%; - } - - .btn > tbody > tr > td { - padding-bottom: 15px; - } - - .btn table { - width: auto; - } - - .btn table td { - background-color: #ffffff; - border-radius: 5px; - text-align: center; - } - - .btn a { - background-color: #ffffff; - border: solid 1px #3498db; - border-radius: 5px; - box-sizing: border-box; - color: #3498db; - cursor: pointer; - display: inline-block; - font-size: 14px; - font-weight: bold; - margin: 0; - padding: 12px 25px; - text-decoration: none; - text-transform: capitalize; - } - - .btn-primary table td { - background-color: #3498db; - } - - .btn-primary a { - background-color: #3498db; - border-color: #3498db; - color: #ffffff; - } - - /* ------------------------------------- - OTHER STYLES THAT MIGHT BE USEFUL - ------------------------------------- */ - .last { - margin-bottom: 0; - } - - .first { - margin-top: 0; - } - - .align-center { - text-align: center; - } - - .align-right { - text-align: right; - } - - .align-left { - text-align: left; - } - - .clear { - clear: both; - } - - .mt0 { - margin-top: 0; - } - - .mb0 { - margin-bottom: 0; - } - - .preheader { - color: transparent; - display: none; - height: 0; - max-height: 0; - max-width: 0; - opacity: 0; - overflow: hidden; - mso-hide: all; - visibility: hidden; - width: 0; - } - - .powered-by span { - text-decoration: none; - margin-top: -1rem; - font-size: medium; - } - - hr { - border: 0; - border-bottom: 1px solid #f6f6f6; - margin: 20px 0; - } - - /* ------------------------------------- - RESPONSIVE AND MOBILE FRIENDLY STYLES - ------------------------------------- */ - @media only screen and (max-width: 620px) { - table.body h1 { - font-size: 28px !important; - margin-bottom: 10px !important; - } - - table.body p, - table.body ul, - table.body ol, - table.body td, - table.body span, - table.body a { - font-size: 16px !important; - } - - table.body .wrapper, - table.body .article { - padding: 10px !important; - } - - table.body .content { - padding: 0 !important; - } - - table.body .container { - padding: 0 !important; - width: 100% !important; - } - - table.body .main { - border-left-width: 0 !important; - border-radius: 0 !important; - border-right-width: 0 !important; - } - - table.body .btn table { - width: 100% !important; - } - - table.body .btn a { - width: 100% !important; - } - - table.body .img-responsive { - height: auto !important; - max-width: 100% !important; - width: auto !important; - } - } - - /* ------------------------------------- - PRESERVE THESE STYLES IN THE HEAD - ------------------------------------- */ - @media all { - .ExternalClass { - width: 100%; - } - - .ExternalClass, - .ExternalClass p, - .ExternalClass span, - .ExternalClass font, - .ExternalClass td, - .ExternalClass div { - line-height: 100%; - } - - .apple-link a { - color: inherit !important; - font-family: inherit !important; - font-size: inherit !important; - font-weight: inherit !important; - line-height: inherit !important; - text-decoration: none !important; - } - - #MessageViewBody a { - color: inherit; - text-decoration: none; - font-size: inherit; - font-family: inherit; - font-weight: inherit; - line-height: inherit; - } - - .btn-primary table td:hover { - background-color: #34495e !important; - } - - .btn-primary a:hover { - background-color: #34495e !important; - border-color: #34495e !important; - } - } - - /* ------------------------------------- - Dark Mode - ------------------------------------- */ - /* @media (prefers-color-scheme: dark) { - body { - background-color: #1e1e1e; - color: #ffffff; - } - - .container { - background-color: #1e1e1e; - } - - .main { - background-color: #2a2a2a; - border-radius: 8px; - } - - .banner { - background-image: linear-gradient(45deg, #844aff, #5e2bff); - border-radius: 0.4rem; - border: 1px solid #ffffff; - padding: 10px; - } - - .wrapper { - padding: 20px; - } - - p, - li { - color: #ffffff; - } - - .info-link { - color: #ffffff; - opacity: 0.7; - } - - .footer { - background-color: #1e1e1e; - } - - .powered-by, - .footer td, - .footer p, - .footer span, - .footer a { - color: #999999; - } - - hr { - border-color: #666666; - } - - .social-icons img { - background-color: #ffffff; - border-radius: 50%; - padding: 0.1rem; - } - - } */ \ No newline at end of file diff --git a/packages/relayer/eml_templates/assets/font/Regola Pro Bold Oblique.otf b/packages/relayer/eml_templates/assets/font/Regola Pro Bold Oblique.otf deleted file mode 100644 index 23f0663f920b227b2a97f195c8476e1963d93d18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137764 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�>Am18uo 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 z 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�bjdKUCN+w(@x54}{qn)mA1Yf!Ja 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 Iq`vU~05*0J-2eap diff --git a/packages/relayer/eml_templates/assets/font/Regola Pro Book Oblique.otf b/packages/relayer/eml_templates/assets/font/Regola Pro Book Oblique.otf deleted file mode 100644 index 73516f54ce50658db1812f090d6108ac576d3816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137368 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

E{+ifnYMNx&L0gPF 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 diff --git a/packages/relayer/eml_templates/assets/font/Regola Pro Book.otf b/packages/relayer/eml_templates/assets/font/Regola Pro Book.otf deleted file mode 100644 index 0c4f2d1a497136e8d48862656513ad95263d7e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133800 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 E4_`=h>;M1& diff --git a/packages/relayer/eml_templates/assets/font/Regola Pro Medium.otf b/packages/relayer/eml_templates/assets/font/Regola Pro Medium.otf deleted file mode 100644 index ebd82315e0b42f87f62869056d36cdeeec4b153c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134780 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 C57>zS diff --git a/packages/relayer/eml_templates/assets/font/Regola Pro Regular.otf b/packages/relayer/eml_templates/assets/font/Regola Pro Regular.otf deleted file mode 100644 index 72bbbc878d730e8a023430f29450eb9ba5334f2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134172 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

2V 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 - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -
- Hi, {{userEmailAddr}}! -
- You have received an guardian request from the wallet address {{walletAddress}}. Reply to this email. - Your request ID is #{{requestId}}. -

- If you did not initiate this request, please contact us immediately. - - -
-

- Cheers,
The ZK Email Team -

-
- - - - - - -
-

- Powered by - ZK Email -

- - - - - - - -
- - - - - - - -
-
-
- - diff --git a/packages/relayer/eml_templates/error.html b/packages/relayer/eml_templates/error.html deleted file mode 100644 index 52893dda..00000000 --- a/packages/relayer/eml_templates/error.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -
- Hi, {{userEmailAddr}}! -
- An error occurred while processing your request.
- Error: {{error}} -
-

- Cheers,
The ZK Email Team -

-
- - - - - - -
-

- Powered by - ZK Email -

- - - - - - - -
- - - - - - - -
-
-
- - diff --git a/packages/relayer/eml_templates/guardian_already_exists.html b/packages/relayer/eml_templates/guardian_already_exists.html deleted file mode 100644 index 00a0192b..00000000 --- a/packages/relayer/eml_templates/guardian_already_exists.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -
- Hi, {{userEmailAddr}}! -
- The guardian email address {{userEmailAddr}} is already associated with the wallet address {{walletAddress}}. -

- If you did not initiate this request, please contact us immediately. -
-

- Cheers,
The ZK Email Team -

-
- - - - - - -
-

- Powered by - ZK Email -

- - - - - - - -
- - - - - - - -
-
-
- - diff --git a/packages/relayer/eml_templates/guardian_not_set.html b/packages/relayer/eml_templates/guardian_not_set.html deleted file mode 100644 index 4ad15982..00000000 --- a/packages/relayer/eml_templates/guardian_not_set.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -
- Hi, {{userEmailAddr}}! -
- Guardian not set for wallet address {{walletAddress}}. -
-

- Cheers,
The ZK Email Team -

-
- - - - - - -
-

- Powered by - ZK Email -

- - - - - - - -
- - - - - - - -
-
-
- - diff --git a/packages/relayer/eml_templates/recovery_request.html b/packages/relayer/eml_templates/recovery_request.html deleted file mode 100644 index d09987f4..00000000 --- a/packages/relayer/eml_templates/recovery_request.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -
- Hi, {{userEmailAddr}}! -
- You have received a recovery request from the wallet address {{walletAddress}}. Reply "Confirm" to this email to accept the request. - Your request ID is #{{requestId}}. -

- If you did not initiate this request, please contact us immediately. - - -
-

- Cheers,
The ZK Email Team -

-
- - - - - - -
-

- Powered by - ZK Email -

- - - - - - - -
- - - - - - - -
-
-
-

{{command}}
- - diff --git a/packages/relayer/eml_templates/recovery_success.html b/packages/relayer/eml_templates/recovery_success.html deleted file mode 100644 index a9416ca4..00000000 --- a/packages/relayer/eml_templates/recovery_success.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -
- Hi, {{userEmailAddr}}! -
- Your recovery request for the wallet address {{walletAddress}} is successful. - Your request ID is #{{requestId}} is now complete. -
-

- Cheers,
The ZK Email Team -

-
- - - - - - -
-

- Powered by - ZK Email -

- - - - - - - -
- - - - - - - -
-
-
- - diff --git a/packages/relayer/input_files/.gitkeep b/packages/relayer/input_files/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/relayer/scripts/startup.sh b/packages/relayer/scripts/startup.sh deleted file mode 100755 index 4fcda970..00000000 --- a/packages/relayer/scripts/startup.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -cd ../ - -if cd prover; then - nohup modal serve modal_server.py & - - if [ $? -ne 0 ]; then - echo "Error: Failed to start the modal_server" - exit 1 - fi -else - echo "Error: Directory ../prover/ does not exist" - exit 1 -fi - -cd ../ - -if cd relayer; then - if [ "$SETUP" = "true" ]; then - cargo run --release -- setup - - if [ $? -ne 0 ]; then - echo "Error: Failed to run cargo run --release -- setup" - exit 1 - fi - fi - - cargo run --release >> output.log - - if [ $? -ne 0 ]; then - echo "Error: Failed to run cargo run --release >> output.log" - exit 1 - fi -else - echo "Error: Directory ../relayer/ does not exist" - exit 1 -fi diff --git a/packages/relayer/src/abis/mod.rs b/packages/relayer/src/abis/mod.rs deleted file mode 100644 index 27a4c209..00000000 --- a/packages/relayer/src/abis/mod.rs +++ /dev/null @@ -1,15 +0,0 @@ -#![allow(clippy::all)] - - -#[cfg_attr(rustfmt, rustfmt::skip)] -pub mod ecdsa_owned_dkim_registry; - -#[cfg_attr(rustfmt, rustfmt::skip)] -pub mod email_account_recovery; - -#[cfg_attr(rustfmt, rustfmt::skip)] -pub mod email_auth; - -pub use ecdsa_owned_dkim_registry::ECDSAOwnedDKIMRegistry; -pub use email_account_recovery::EmailAccountRecovery; -pub use email_auth::*; diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs deleted file mode 100644 index 30e362b4..00000000 --- a/packages/relayer/src/chain.rs +++ /dev/null @@ -1,625 +0,0 @@ -use crate::*; -use abis::email_account_recovery::EmailAuthMsg; -use ethers::middleware::Middleware; -use ethers::prelude::*; -use ethers::signers::Signer; -use relayer_utils::converters::u64_to_u8_array_32; -use relayer_utils::TemplateValue; - -const CONFIRMATIONS: usize = 1; - -type SignerM = SignerMiddleware, LocalWallet>; - -/// Represents a client for interacting with the blockchain. -#[derive(Debug, Clone)] -pub struct ChainClient { - pub client: Arc, -} - -impl ChainClient { - /// Sets up a new ChainClient. - /// - /// # Returns - /// - /// A `Result` containing the new `ChainClient` if successful, or an error if not. - pub async fn setup() -> Result { - let wallet: LocalWallet = PRIVATE_KEY.get().unwrap().parse()?; - let provider = Provider::::try_from(CHAIN_RPC_PROVIDER.get().unwrap())?; - - // Create a new SignerMiddleware with the provider and wallet - let client = Arc::new(SignerMiddleware::new( - provider, - wallet.with_chain_id(*CHAIN_ID.get().unwrap()), - )); - - Ok(Self { client }) - } - - /// Sets the DKIM public key hash. - /// - /// # Arguments - /// - /// * `selector` - The selector string. - /// * `domain_name` - The domain name. - /// * `public_key_hash` - The public key hash as a 32-byte array. - /// * `signature` - The signature as Bytes. - /// * `dkim` - The ECDSA Owned DKIM Registry. - /// - /// # Returns - /// - /// A `Result` containing the transaction hash as a String if successful, or an error if not. - pub async fn set_dkim_public_key_hash( - &self, - selector: String, - domain_name: String, - public_key_hash: [u8; 32], - signature: Bytes, - dkim: ECDSAOwnedDKIMRegistry, - ) -> Result { - // Mutex is used to prevent nonce conflicts. - let mut mutex = SHARED_MUTEX.lock().await; - *mutex += 1; - - // Call the contract method - let call = dkim.set_dkim_public_key_hash(selector, domain_name, public_key_hash, signature); - let tx = call.send().await?; - - // Wait for the transaction to be confirmed - let receipt = tx - .log() - .confirmations(CONFIRMATIONS) - .await? - .ok_or(anyhow!("No receipt"))?; - - // Format the transaction hash - let tx_hash = receipt.transaction_hash; - let tx_hash = format!("0x{}", hex::encode(tx_hash.as_bytes())); - Ok(tx_hash) - } - - /// Checks if a DKIM public key hash is valid. - /// - /// # Arguments - /// - /// * `domain_name` - The domain name. - /// * `public_key_hash` - The public key hash as a 32-byte array. - /// * `dkim` - The ECDSA Owned DKIM Registry. - /// - /// # Returns - /// - /// A `Result` containing a boolean indicating if the hash is valid. - pub async fn check_if_dkim_public_key_hash_valid( - &self, - domain_name: ::std::string::String, - public_key_hash: [u8; 32], - dkim: ECDSAOwnedDKIMRegistry, - ) -> Result { - // Call the contract method to check if the hash is valid - let is_valid = dkim - .is_dkim_public_key_hash_valid(domain_name, public_key_hash) - .call() - .await?; - Ok(is_valid) - } - - /// Gets the DKIM from a wallet. - /// - /// # Arguments - /// - /// * `controller_eth_addr` - The controller Ethereum address as a string. - /// - /// # Returns - /// - /// A `Result` containing the ECDSA Owned DKIM Registry if successful, or an error if not. - pub async fn get_dkim_from_wallet( - &self, - controller_eth_addr: &str, - ) -> Result, anyhow::Error> { - // Parse the controller Ethereum address - let controller_eth_addr: H160 = controller_eth_addr.parse()?; - - // Create a new EmailAccountRecovery contract instance - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - - // Call the dkim method to get the DKIM registry address - let dkim = contract.dkim().call().await?; - - // Create and return a new ECDSAOwnedDKIMRegistry instance - Ok(ECDSAOwnedDKIMRegistry::new(dkim, self.client.clone())) - } - - /// Gets the DKIM from an email auth address. - /// - /// # Arguments - /// - /// * `email_auth_addr` - The email auth address as a string. - /// - /// # Returns - /// - /// A `Result` containing the ECDSA Owned DKIM Registry if successful, or an error if not. - pub async fn get_dkim_from_email_auth( - &self, - email_auth_addr: &str, - ) -> Result, anyhow::Error> { - // Parse the email auth address - let email_auth_address: H160 = email_auth_addr.parse()?; - - // Create a new EmailAuth contract instance - let contract = EmailAuth::new(email_auth_address, self.client.clone()); - - // Call the dkim_registry_addr method to get the DKIM registry address - let dkim = contract.dkim_registry_addr().call().await?; - - // Create and return a new ECDSAOwnedDKIMRegistry instance - Ok(ECDSAOwnedDKIMRegistry::new(dkim, self.client.clone())) - } - - /// Gets the email auth address from a wallet. - /// - /// # Arguments - /// - /// * `controller_eth_addr` - The controller Ethereum address as a string. - /// * `wallet_addr` - The wallet address as a string. - /// * `account_salt` - The account salt as a string. - /// - /// # Returns - /// - /// A `Result` containing the email auth address as H160 if successful, or an error if not. - pub async fn get_email_auth_addr_from_wallet( - &self, - controller_eth_addr: &str, - wallet_addr: &str, - account_salt: &str, - ) -> Result { - // Parse the controller and wallet Ethereum addresses - let controller_eth_addr: H160 = controller_eth_addr.parse()?; - let wallet_address: H160 = wallet_addr.parse()?; - - // Create a new EmailAccountRecovery contract instance - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - - // Decode the account salt - let account_salt_bytes = hex::decode(account_salt.trim_start_matches("0x")) - .map_err(|e| anyhow!("Failed to decode account_salt: {}", e))?; - - // Compute the email auth address - let email_auth_addr = contract - .compute_email_auth_address( - wallet_address, - account_salt_bytes - .try_into() - .map_err(|_| anyhow!("account_salt must be 32 bytes"))?, - ) - .await?; - Ok(email_auth_addr) - } - - /// Checks if a wallet is deployed. - /// - /// # Arguments - /// - /// * `wallet_addr_str` - The wallet address as a string. - /// - /// # Returns - /// - /// A `Result` containing a boolean indicating if the wallet is deployed. - pub async fn is_wallet_deployed(&self, wallet_addr_str: &str) -> Result { - // Parse the wallet address - let wallet_addr: H160 = wallet_addr_str.parse().map_err(ChainError::HexError)?; - - // Get the bytecode at the wallet address - match self.client.get_code(wallet_addr, None).await { - Ok(code) => Ok(!code.is_empty()), - Err(e) => { - // Log the error or handle it as needed - Err(ChainError::signer_middleware_error( - "Failed to check if wallet is deployed", - e, - )) - } - } - } - - /// Gets the acceptance command templates. - /// - /// # Arguments - /// - /// * `controller_eth_addr` - The controller Ethereum address as a string. - /// * `template_idx` - The template index. - /// - /// # Returns - /// - /// A `Result` containing a vector of acceptance command templates. - pub async fn get_acceptance_command_templates( - &self, - controller_eth_addr: &str, - template_idx: u64, - ) -> Result, ChainError> { - // Parse the controller Ethereum address - let controller_eth_addr: H160 = - controller_eth_addr.parse().map_err(ChainError::HexError)?; - - // Create a new EmailAccountRecovery contract instance - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - - // Get the acceptance command templates - let templates = contract - .acceptance_command_templates() - .call() - .await - .map_err(|e| { - ChainError::contract_error("Failed to get acceptance subject templates", e) - })?; - Ok(templates[template_idx as usize].clone()) - } - - /// Gets the recovery command templates. - /// - /// # Arguments - /// - /// * `controller_eth_addr` - The controller Ethereum address as a string. - /// * `template_idx` - The template index. - /// - /// # Returns - /// - /// A `Result` containing a vector of recovery command templates. - pub async fn get_recovery_command_templates( - &self, - controller_eth_addr: &str, - template_idx: u64, - ) -> Result, ChainError> { - // Parse the controller Ethereum address - let controller_eth_addr: H160 = - controller_eth_addr.parse().map_err(ChainError::HexError)?; - - // Create a new EmailAccountRecovery contract instance - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - - // Get the recovery command templates - let templates = contract - .recovery_command_templates() - .call() - .await - .map_err(|e| { - ChainError::contract_error("Failed to get recovery command templates", e) - })?; - Ok(templates[template_idx as usize].clone()) - } - - /// Completes the recovery process. - /// - /// # Arguments - /// - /// * `controller_eth_addr` - The controller Ethereum address as a string. - /// * `account_eth_addr` - The account Ethereum address as a string. - /// * `complete_calldata` - The complete calldata as a string. - /// - /// # Returns - /// - /// A `Result` containing a boolean indicating if the recovery was successful. - pub async fn complete_recovery( - &self, - controller_eth_addr: &str, - account_eth_addr: &str, - complete_calldata: &str, - ) -> Result { - // Parse the controller and account Ethereum addresses - let controller_eth_addr: H160 = - controller_eth_addr.parse().map_err(ChainError::HexError)?; - - // Create a new EmailAccountRecovery contract instance - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - - // Decode the complete calldata - let decoded_calldata = - hex::decode(complete_calldata.trim_start_matches("0x")).expect("Decoding failed"); - - let account_eth_addr = account_eth_addr - .parse::() - .map_err(ChainError::HexError)?; - - // Call the complete_recovery method - let call = contract.complete_recovery(account_eth_addr, Bytes::from(decoded_calldata)); - - let tx = call - .send() - .await - .map_err(|e| ChainError::contract_error("Failed to call complete_recovery", e))?; - - // Wait for the transaction to be confirmed - let receipt = tx - .log() - .confirmations(CONFIRMATIONS) - .await - .map_err(|e| { - ChainError::provider_error( - "Failed to get receipt after calling complete_recovery", - e, - ) - })? - .ok_or(anyhow!("No receipt"))?; - - // Check if the transaction was successful - Ok(receipt - .status - .map(|status| status == U64::from(1)) - .unwrap_or(false)) - } - - /// Handles the acceptance process. - /// - /// # Arguments - /// - /// * `controller_eth_addr` - The controller Ethereum address as a string. - /// * `email_auth_msg` - The email authentication message. - /// * `template_idx` - The template index. - /// - /// # Returns - /// - /// A `Result` containing a boolean indicating if the acceptance was successful. - pub async fn handle_acceptance( - &self, - controller_eth_addr: &str, - email_auth_msg: EmailAuthMsg, - template_idx: u64, - ) -> std::result::Result { - // Parse the controller Ethereum address - let controller_eth_addr: H160 = controller_eth_addr.parse()?; - - // Create a new EmailAccountRecovery contract instance - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - - // Call the handle_acceptance method - let call = contract.handle_acceptance(email_auth_msg, template_idx.into()); - let tx = call - .send() - .await - .map_err(|e| ChainError::contract_error("Failed to call handle_acceptance", e))?; - - // Wait for the transaction to be confirmed - let receipt = tx - .log() - .confirmations(CONFIRMATIONS) - .await - .map_err(|e| { - ChainError::provider_error( - "Failed to get receipt after calling handle_acceptance", - e, - ) - })? - .ok_or(anyhow!("No receipt"))?; - - // Check if the transaction was successful - Ok(receipt - .status - .map(|status| status == U64::from(1)) - .unwrap_or(false)) - } - - /// Handles the recovery process. - /// - /// # Arguments - /// - /// * `controller_eth_addr` - The controller Ethereum address as a string. - /// * `email_auth_msg` - The email authentication message. - /// * `template_idx` - The template index. - /// - /// # Returns - /// - /// A `Result` containing a boolean indicating if the recovery was successful. - pub async fn handle_recovery( - &self, - controller_eth_addr: &str, - email_auth_msg: EmailAuthMsg, - template_idx: u64, - ) -> std::result::Result { - // Parse the controller Ethereum address - let controller_eth_addr: H160 = controller_eth_addr.parse()?; - - // Create a new EmailAccountRecovery contract instance - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - - // Call the handle_recovery method - let call = contract.handle_recovery(email_auth_msg, template_idx.into()); - let tx = call - .send() - .await - .map_err(|e| ChainError::contract_error("Failed to call handle_recovery", e))?; - - // Wait for the transaction to be confirmed - let receipt = tx - .log() - .confirmations(CONFIRMATIONS) - .await - .map_err(|e| { - ChainError::provider_error("Failed to get receipt after calling handle_recovery", e) - })? - .ok_or(anyhow!("No receipt"))?; - - // Check if the transaction was successful - Ok(receipt - .status - .map(|status| status == U64::from(1)) - .unwrap_or(false)) - } - - /// Gets the bytecode of a wallet. - /// - /// # Arguments - /// - /// * `wallet_addr` - The wallet address as a string. - /// - /// # Returns - /// - /// A `Result` containing the bytecode as Bytes. - pub async fn get_bytecode(&self, wallet_addr: &str) -> std::result::Result { - // Parse the wallet address - let wallet_address: H160 = wallet_addr.parse().map_err(ChainError::HexError)?; - - // Get the bytecode at the wallet address - let client_code = self - .client - .get_code(wallet_address, None) - .await - .map_err(|e| ChainError::signer_middleware_error("Failed to get bytecode", e))?; - Ok(client_code) - } - - /// Gets the storage at a specific slot for a wallet. - /// - /// # Arguments - /// - /// * `wallet_addr` - The wallet address as a string. - /// * `slot` - The storage slot. - /// - /// # Returns - /// - /// A `Result` containing the storage value as H256. - pub async fn get_storage_at( - &self, - wallet_addr: &str, - slot: u64, - ) -> Result { - // Parse the wallet address - let wallet_address: H160 = wallet_addr.parse()?; - - // Get the storage at the specified slot - Ok(self - .client - .get_storage_at(wallet_address, u64_to_u8_array_32(slot).into(), None) - .await?) - } - - /// Gets the recovered account from an acceptance command. - /// - /// # Arguments - /// - /// * `controller_eth_addr` - The controller Ethereum address as a string. - /// * `command_params` - The command parameters. - /// * `template_idx` - The template index. - /// - /// # Returns - /// - /// A `Result` containing the recovered account address as H160. - pub async fn get_recovered_account_from_acceptance_command( - &self, - controller_eth_addr: &str, - command_params: Vec, - template_idx: u64, - ) -> Result { - // Parse the controller Ethereum address - let controller_eth_addr: H160 = - controller_eth_addr.parse().map_err(ChainError::HexError)?; - - // Create a new EmailAccountRecovery contract instance - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - - // Encode the command parameters - let command_params_bytes = command_params - .iter() - .map(|s| { - s.abi_encode(None) - .unwrap_or_else(|_| Bytes::from("Error encoding".as_bytes().to_vec())) - }) - .collect::>(); - - // Call the extract_recovered_account_from_acceptance_command method - let recovered_account = contract - .extract_recovered_account_from_acceptance_command( - command_params_bytes, - template_idx.into(), - ) - .call() - .await - .map_err(|e| { - ChainError::contract_error( - "Failed to get recovered account from acceptance subject", - e, - ) - })?; - Ok(recovered_account) - } - - /// Gets the recovered account from a recovery command. - /// - /// # Arguments - /// - /// * `controller_eth_addr` - The controller Ethereum address as a string. - /// * `command_params` - The command parameters. - /// * `template_idx` - The template index. - /// - /// # Returns - /// - /// A `Result` containing the recovered account address as H160. - pub async fn get_recovered_account_from_recovery_command( - &self, - controller_eth_addr: &str, - command_params: Vec, - template_idx: u64, - ) -> Result { - // Parse the controller Ethereum address - let controller_eth_addr: H160 = - controller_eth_addr.parse().map_err(ChainError::HexError)?; - - // Create a new EmailAccountRecovery contract instance - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - - // Encode the command parameters - let command_params_bytes = command_params - .iter() - .map(|s| { - s.abi_encode(None).map_err(|_| { - ChainError::Validation("Error encoding subject parameters".to_string()) - }) - }) - .collect::, ChainError>>()?; - - // Call the extract_recovered_account_from_recovery_command method - let recovered_account = contract - .extract_recovered_account_from_recovery_command( - command_params_bytes, - template_idx.into(), - ) - .call() - .await - .map_err(|e| { - ChainError::contract_error( - "Failed to get recovered account from recovery subject", - e, - ) - })?; - Ok(recovered_account) - } - - /// Checks if an account is activated. - /// - /// # Arguments - /// - /// * `controller_eth_addr` - The controller Ethereum address as a string. - /// * `account_eth_addr` - The account Ethereum address as a string. - /// - /// # Returns - /// - /// A `Result` containing a boolean indicating if the account is activated. - pub async fn get_is_activated( - &self, - controller_eth_addr: &str, - account_eth_addr: &str, - ) -> Result { - // Parse the controller and account Ethereum addresses - let controller_eth_addr: H160 = - controller_eth_addr.parse().map_err(ChainError::HexError)?; - let account_eth_addr: H160 = account_eth_addr.parse().map_err(ChainError::HexError)?; - - // Create a new EmailAccountRecovery contract instance - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - - // Call the is_activated method - let is_activated = contract - .is_activated(account_eth_addr) - .call() - .await - .map_err(|e| ChainError::contract_error("Failed to check if is activated", e))?; - Ok(is_activated) - } -} diff --git a/packages/relayer/src/config.rs b/packages/relayer/src/config.rs index 6615cca5..a1c191c9 100644 --- a/packages/relayer/src/config.rs +++ b/packages/relayer/src/config.rs @@ -1,72 +1,57 @@ -use crate::*; +use anyhow::Error; +use serde::Deserialize; +use std::collections::HashMap; +use std::env; +use std::fs::File; +use std::io::Read; -use std::{env, path::PathBuf}; +#[derive(Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct Config { + pub port: usize, + pub database_url: String, + pub prover_url: String, + pub icp: IcpConfig, + pub chains: HashMap, + pub json_logger: bool, +} -use dotenv::dotenv; +#[derive(Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct IcpConfig { + pub canister_id: String, + pub pem_path: String, + pub ic_replica_url: String, +} -/// Configuration struct for the Relayer service. -/// -/// This struct holds various configuration parameters needed for the Relayer service, -/// including SMTP settings, database path, web server address, and blockchain-related information. -#[derive(Clone)] -pub struct RelayerConfig { - pub smtp_server: String, - pub relayer_email_addr: String, - pub db_path: String, - pub web_server_address: String, - pub regex_json_dir_path: PathBuf, - pub prover_address: String, - pub chain_rpc_provider: String, - pub chain_rpc_explorer: String, - pub chain_id: u32, +#[derive(Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct ChainConfig { pub private_key: String, - pub email_account_recovery_version_id: u8, - pub email_templates: String, + pub rpc_url: String, + pub explorer_url: String, + pub chain_id: u32, } -impl RelayerConfig { - /// Creates a new instance of RelayerConfig. - /// - /// This function loads environment variables using dotenv and populates - /// the RelayerConfig struct with the values. - /// - /// # Returns - /// - /// A new instance of RelayerConfig. - pub fn new() -> Self { - // Load environment variables from .env file - dotenv().ok(); +// Function to load the configuration from a JSON file +pub fn load_config() -> Result { + // Open the configuration file + let mut file = File::open("config.json") + .map_err(|e| anyhow::anyhow!("Failed to open config file: {}", e))?; - // Construct and return the RelayerConfig instance - Self { - smtp_server: env::var(SMTP_SERVER_KEY).unwrap(), - relayer_email_addr: env::var(RELAYER_EMAIL_ADDR_KEY).unwrap(), - db_path: env::var(DATABASE_PATH_KEY).unwrap(), - web_server_address: env::var(WEB_SERVER_ADDRESS_KEY).unwrap(), - regex_json_dir_path: env::var(REGEX_JSON_DIR_PATH_KEY).unwrap().into(), - prover_address: env::var(PROVER_ADDRESS_KEY).unwrap(), - chain_rpc_provider: env::var(CHAIN_RPC_PROVIDER_KEY).unwrap(), - chain_rpc_explorer: env::var(CHAIN_RPC_EXPLORER_KEY).unwrap(), - chain_id: env::var(CHAIN_ID_KEY).unwrap().parse().unwrap(), - private_key: env::var(PRIVATE_KEY_KEY).unwrap(), - email_account_recovery_version_id: env::var(EMAIL_ACCOUNT_RECOVERY_VERSION_ID_KEY) - .unwrap() - .parse() - .unwrap(), - email_templates: env::var(EMAIL_TEMPLATES_PATH_KEY).unwrap(), - } - } -} + // Read the file's content into a string + let mut data = String::new(); + file.read_to_string(&mut data) + .map_err(|e| anyhow::anyhow!("Failed to read config file: {}", e))?; -impl Default for RelayerConfig { - /// Provides a default instance of RelayerConfig. - /// - /// This implementation simply calls the `new()` method to create a default instance. - /// - /// # Returns - /// - /// A default instance of RelayerConfig. - fn default() -> Self { - Self::new() + // Deserialize the JSON content into a Config struct + let config: Config = serde_json::from_str(&data) + .map_err(|e| anyhow::anyhow!("Failed to parse config file: {}", e))?; + + // Setting Logger ENV + if config.json_logger { + env::set_var("JSON_LOGGER", "true"); } + + Ok(config) } diff --git a/packages/relayer/src/core.rs b/packages/relayer/src/core.rs deleted file mode 100644 index a06a6324..00000000 --- a/packages/relayer/src/core.rs +++ /dev/null @@ -1,490 +0,0 @@ -#![allow(clippy::upper_case_acronyms)] -#![allow(clippy::identity_op)] - -use std::fs; - -use crate::abis::email_account_recovery::{EmailAuthMsg, EmailProof}; -use crate::*; - -use ethers::{ - abi::{encode, Token}, - utils::keccak256, -}; -use relayer_utils::{ - extract_substr_idxes, extract_template_vals_from_command, generate_email_circuit_input, - generate_proof, EmailCircuitParams, LOG, -}; - -const DOMAIN_FIELDS: usize = 9; -const COMMAND_FIELDS: usize = 20; -const EMAIL_ADDR_FIELDS: usize = 9; - -/// Handles an incoming email for authentication or recovery. -/// -/// # Arguments -/// -/// * `email` - The raw email string to be processed. -/// -/// # Returns -/// -/// A `Result` containing an `EmailAuthEvent` on success, or an `EmailError` on failure. -pub async fn handle_email(email: String) -> Result { - let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; - trace!(LOG, "email: {}", email); - let guardian_email_addr = parsed_email.get_from_addr()?; - let padded_from_addr = PaddedEmailAddr::from_email_addr(&guardian_email_addr); - trace!(LOG, "From address: {}", guardian_email_addr); - let email_body = parsed_email.get_cleaned_body()?; - - let request_def_path = - PathBuf::from(REGEX_JSON_DIR_PATH.get().unwrap()).join("request_def.json"); - let request_def_contents = fs::read_to_string(&request_def_path).map_err(|e| { - anyhow!( - "Failed to read file {:?}: {}", - request_def_path.display(), - e - ) - })?; - let request_decomposed_def = serde_json::from_str(&request_def_contents) - .map_err(|e| EmailError::Parse(format!("Failed to parse request_def.json: {}", e)))?; - let request_idxes = extract_substr_idxes(&email, &request_decomposed_def)?; - if request_idxes.is_empty() { - return Err(EmailError::Body(WRONG_COMMAND_FORMAT.to_string())); - } - info!(LOG, "Request idxes: {:?}", request_idxes); - let request_id = &email[request_idxes[0].0..request_idxes[0].1]; - let request_id_u32 = request_id - .parse::() - .map_err(|e| EmailError::Parse(format!("Failed to parse request_id to u64: {}", e)))?; - let request = match DB.get_request(request_id_u32).await? { - Some(req) => req, - None => { - let original_subject = parsed_email.get_subject_all()?; - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: format!("Request {} not found", request_id), - original_subject, - original_message_id: parsed_email.get_message_id().ok(), - }); - } - }; - if request.guardian_email_addr != guardian_email_addr { - return Err(EmailError::EmailAddress(format!( - "Guardian email address in the request {} is not equal to the one in the email {}", - request.guardian_email_addr, guardian_email_addr - ))); - } - - let account_code_str = DB - .get_account_code_from_wallet_and_email(&request.account_eth_addr, &guardian_email_addr) - .await? - .ok_or(EmailError::NotFound(format!( - "The user of the wallet address {} and the email address {} is not registered.", - request.account_eth_addr, guardian_email_addr - )))?; - - check_and_update_dkim( - &email, - &parsed_email, - &request.controller_eth_addr, - &request.account_eth_addr, - request.account_salt.as_deref().unwrap_or_default(), - ) - .await - .map_err(|e| EmailError::Dkim(e.to_string()))?; - - let invitation_code = match parsed_email.get_invitation_code(false) { - Ok(code) => Some(code), - Err(_) => None, - }; - - let params = EmailRequestContext { - request, - email_body, - account_code_str, - email, - parsed_email, - }; - - handle_email_request(params, invitation_code).await -} - -/// Handles the email request based on the presence of an invitation code and whether it's for recovery. -/// -/// # Arguments -/// -/// * `params` - The `EmailRequestContext` containing request details. -/// * `invitation_code` - An optional invitation code. -/// -/// # Returns -/// -/// A `Result` containing an `EmailAuthEvent` or an `EmailError`. -async fn handle_email_request( - params: EmailRequestContext, - invitation_code: Option, -) -> Result { - match (invitation_code, params.request.is_for_recovery) { - (Some(invitation_code), is_for_recovery) if !is_for_recovery => { - if params.account_code_str != invitation_code { - return Err(EmailError::Body(format!( - "Stored account code is not equal to one in the email. Stored: {}, Email: {}", - params.account_code_str, invitation_code - ))); - }; - trace!(LOG, "Email with account code"); - accept(params, invitation_code).await - } - (None, is_for_recovery) if is_for_recovery => recover(params).await, - (Some(_), _) => { - let original_subject = params.parsed_email.get_subject_all()?; - Ok(EmailAuthEvent::Error { - email_addr: params.request.guardian_email_addr, - error: "Account code found and for recovery".to_string(), - original_subject, - original_message_id: params.parsed_email.get_message_id().ok(), - }) - } - (None, _) => { - let original_subject = params.parsed_email.get_subject_all()?; - Ok(EmailAuthEvent::Error { - email_addr: params.request.guardian_email_addr, - error: "No account code found and not for recovery".to_string(), - original_subject, - original_message_id: params.parsed_email.get_message_id().ok(), - }) - } - } -} - -/// Handles the acceptance of an email authentication request. -/// -/// # Arguments -/// -/// * `params` - The `EmailRequestContext` containing request details. -/// * `invitation_code` - The invitation code from the email. -/// -/// # Returns -/// -/// A `Result` containing an `EmailAuthEvent` or an `EmailError`. -async fn accept( - params: EmailRequestContext, - invitation_code: String, -) -> Result { - let (email_auth_msg, email_proof, account_salt) = get_email_auth_msg(¶ms).await?; - - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); - info!(LOG, "Request: {:?}", params.request); - - // Handle the acceptance with the client - let is_accepted = CLIENT - .handle_acceptance( - ¶ms.request.controller_eth_addr, - email_auth_msg, - params.request.template_idx, - ) - .await?; - - update_request( - ¶ms, - is_accepted, - email_proof.email_nullifier, - account_salt, - ) - .await?; - - let original_subject = params.parsed_email.get_subject_all()?; - if is_accepted { - let creds = Credentials { - account_code: invitation_code, - account_eth_addr: params.request.account_eth_addr.clone(), - guardian_email_addr: params.request.guardian_email_addr.clone(), - is_set: true, - }; - DB.update_credentials_of_account_code(&creds).await?; - - Ok(EmailAuthEvent::AcceptanceSuccess { - account_eth_addr: params.request.account_eth_addr, - guardian_email_addr: params.request.guardian_email_addr, - request_id: params.request.request_id, - original_subject, - original_message_id: params.parsed_email.get_message_id().ok(), - }) - } else { - let original_subject = params.parsed_email.get_subject_all()?; - Ok(EmailAuthEvent::Error { - email_addr: params.request.guardian_email_addr, - error: "Failed to handle acceptance".to_string(), - original_subject, - original_message_id: params.parsed_email.get_message_id().ok(), - }) - } -} - -/// Handles the recovery process for an email authentication request. -/// -/// # Arguments -/// -/// * `params` - The `EmailRequestContext` containing request details. -/// -/// # Returns -/// -/// A `Result` containing an `EmailAuthEvent` or an `EmailError`. -async fn recover(params: EmailRequestContext) -> Result { - let (email_auth_msg, email_proof, account_salt) = get_email_auth_msg(¶ms).await?; - - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg); - info!(LOG, "Request: {:?}", params.request); - - // Handle the recovery with the client - let is_success = CLIENT - .handle_recovery( - ¶ms.request.controller_eth_addr, - email_auth_msg, - params.request.template_idx, - ) - .await?; - - update_request( - ¶ms, - is_success, - email_proof.email_nullifier, - account_salt, - ) - .await?; - - let original_subject = params.parsed_email.get_subject_all()?; - if is_success { - Ok(EmailAuthEvent::RecoverySuccess { - account_eth_addr: params.request.account_eth_addr, - guardian_email_addr: params.request.guardian_email_addr, - request_id: params.request.request_id, - original_subject, - original_message_id: params.parsed_email.get_message_id().ok(), - }) - } else { - let original_subject = params.parsed_email.get_subject_all()?; - Ok(EmailAuthEvent::Error { - email_addr: params.request.guardian_email_addr, - error: "Failed to handle recovery".to_string(), - original_subject, - original_message_id: params.parsed_email.get_message_id().ok(), - }) - } -} - -/// Extracts the masked command from public signals. -/// -/// # Arguments -/// -/// * `public_signals` - The vector of public signals. -/// * `start_idx` - The starting index for command extraction. -/// -/// # Returns -/// -/// A `Result` containing the masked command as a `String` or an error. -fn get_masked_command(public_signals: Vec, start_idx: usize) -> Result { - // Gather signals from start_idx to start_idx + COMMAND_FIELDS - let command_bytes: Vec = public_signals - .iter() - .skip(start_idx) - .take(COMMAND_FIELDS) - .take_while(|&signal| *signal != U256::zero()) - .flat_map(u256_to_bytes32_little) - .collect(); - - // Bytes to string, removing null bytes - let command = String::from_utf8(command_bytes.into_iter().filter(|&b| b != 0u8).collect()) - .map_err(|e| anyhow!("Failed to convert bytes to string: {}", e))?; - - Ok(command) -} - -/// Updates the request status in the database. -/// -/// # Arguments -/// -/// * `params` - The `EmailRequestContext` containing request details. -/// * `is_success` - A boolean indicating whether the request was successful. -/// * `email_nullifier` - The email nullifier as a byte array. -/// * `account_salt` - The account salt as a byte array. -/// -/// # Returns -/// -/// A `Result` indicating success or an `EmailError`. -async fn update_request( - params: &EmailRequestContext, - is_success: bool, - email_nullifier: [u8; 32], - account_salt: [u8; 32], -) -> Result<(), EmailError> { - let updated_request = Request { - account_eth_addr: params.request.account_eth_addr.clone(), - controller_eth_addr: params.request.controller_eth_addr.clone(), - guardian_email_addr: params.request.guardian_email_addr.clone(), - template_idx: params.request.template_idx, - is_for_recovery: params.request.is_for_recovery, - is_processed: true, - request_id: params.request.request_id, - is_success: Some(is_success), - email_nullifier: Some(field_to_hex(&bytes32_to_fr(&email_nullifier)?)), - account_salt: Some(bytes32_to_hex(&account_salt)), - }; - - DB.update_request(&updated_request).await?; - Ok(()) -} - -/// Generates the email proof for authentication. -/// -/// # Arguments -/// -/// * `params` - The `EmailRequestContext` containing request details. -/// -/// # Returns -/// -/// A `Result` containing the `EmailProof` and account salt, or an `EmailError`. -async fn generate_email_proof( - params: &EmailRequestContext, -) -> Result<(EmailProof, [u8; 32]), EmailError> { - let circuit_input = generate_email_circuit_input( - ¶ms.email, - &AccountCode::from(hex_to_field(&format!("0x{}", ¶ms.account_code_str))?), - Some(EmailCircuitParams { - max_header_length: Some(1024), - max_body_length: Some(1024), - sha_precompute_selector: Some(SHA_PRECOMPUTE_SELECTOR.to_string()), - ignore_body_hash_check: Some(false), - }), - ) - .await?; - - let (proof, public_signals) = - generate_proof(&circuit_input, "email_auth", PROVER_ADDRESS.get().unwrap()).await?; - - info!(LOG, "Public signals: {:?}", public_signals); - - let account_salt = u256_to_bytes32(&public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 3]); - let is_code_exist = public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); - let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; - - let email_proof = EmailProof { - proof, - domain_name: params.parsed_email.get_email_domain()?, - public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), - timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), - masked_command, - email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), - account_salt, - is_code_exist, - }; - - Ok((email_proof, account_salt)) -} - -/// Generates the template ID for the email authentication request. -/// -/// # Arguments -/// -/// * `params` - The `EmailRequestContext` containing request details. -/// -/// # Returns -/// -/// A 32-byte array representing the template ID. -fn get_template_id(params: &EmailRequestContext) -> [u8; 32] { - let action = if params.request.is_for_recovery { - "RECOVERY".to_string() - } else { - "ACCEPTANCE".to_string() - }; - - let tokens = vec![ - Token::Uint((*EMAIL_ACCOUNT_RECOVERY_VERSION_ID.get().unwrap()).into()), - // TODO: Continue here - Token::String(action), - Token::Uint(params.request.template_idx.into()), - ]; - - keccak256(encode(&tokens)) -} - -/// Retrieves and encodes the command parameters for the email authentication request. -/// -/// # Arguments -/// -/// * `params` - The `EmailRequestContext` containing request details. -/// -/// # Returns -/// -/// A `Result` containing a vector of encoded command parameters or an `EmailError`. -async fn get_encoded_command_params( - params: &EmailRequestContext, -) -> Result, EmailError> { - let command_template = if params.request.is_for_recovery { - CLIENT - .get_recovery_command_templates( - ¶ms.request.controller_eth_addr, - params.request.template_idx, - ) - .await - } else { - CLIENT - .get_acceptance_command_templates( - ¶ms.request.controller_eth_addr, - params.request.template_idx, - ) - .await - }?; - - let command_params = extract_template_vals_from_command(¶ms.email_body, command_template) - .map_err(|e| EmailError::Body(format!("Invalid commad: {}", e)))?; - - let command_params_encoded = command_params - .iter() - .map(|param| { - param - .abi_encode(None) - .map_err(|e| EmailError::AbiError(e.to_string())) - }) - .collect::, EmailError>>()?; - - Ok(command_params_encoded) -} - -/// Generates the email authentication message. -/// -/// # Arguments -/// -/// * `params` - The `EmailRequestContext` containing request details. -/// -/// # Returns -/// -/// A `Result` containing the `EmailAuthMsg`, `EmailProof`, and account salt, or an `EmailError`. -async fn get_email_auth_msg( - params: &EmailRequestContext, -) -> Result<(EmailAuthMsg, EmailProof, [u8; 32]), EmailError> { - let command_params_encoded = get_encoded_command_params(params).await?; - let template_id = get_template_id(params); - let (email_proof, account_salt) = generate_email_proof(params).await?; - let email_auth_msg = EmailAuthMsg { - template_id: template_id.into(), - command_params: command_params_encoded, - skipped_command_prefix: U256::zero(), - proof: email_proof.clone(), - }; - Ok((email_auth_msg, email_proof, account_salt)) -} - -/// Represents the context for an email authentication request. -#[derive(Debug, Clone)] -struct EmailRequestContext { - /// The request details. - request: Request, - /// The body of the email. - email_body: String, - /// The account code as a string. - account_code_str: String, - /// The full raw email. - email: String, - /// The parsed email. - parsed_email: ParsedEmail, -} diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs deleted file mode 100644 index 29729903..00000000 --- a/packages/relayer/src/database.rs +++ /dev/null @@ -1,585 +0,0 @@ -use crate::*; - -use relayer_utils::LOG; -use sqlx::{postgres::PgPool, Row}; - -/// Represents the credentials for a user account. -#[derive(Debug, Clone)] -pub struct Credentials { - /// The unique code associated with the account. - pub account_code: String, - /// The Ethereum address of the account. - pub account_eth_addr: String, - /// The email address of the guardian. - pub guardian_email_addr: String, - /// Indicates whether the credentials are set. - pub is_set: bool, -} - -/// Represents a request in the system. -#[derive(Debug, Clone)] -pub struct Request { - /// The unique identifier for the request. - pub request_id: u32, - /// The Ethereum address of the account. - pub account_eth_addr: String, - /// The Ethereum address of the controller. - pub controller_eth_addr: String, - /// The email address of the guardian. - pub guardian_email_addr: String, - /// Indicates whether the request is for recovery. - pub is_for_recovery: bool, - /// The index of the template used for the request. - pub template_idx: u64, - /// Indicates whether the request has been processed. - pub is_processed: bool, - /// Indicates the success status of the request, if available. - pub is_success: Option, - /// The nullifier for the email, if available. - pub email_nullifier: Option, - /// The salt for the account, if available. - pub account_salt: Option, -} - -/// Represents the database connection and operations. -pub struct Database { - db: PgPool, -} - -impl Database { - /// Opens a new database connection. - /// - /// # Arguments - /// - /// * `path` - The connection string for the database. - /// - /// # Returns - /// - /// A `Result` containing the `Database` struct if successful, or an error if the connection fails. - pub async fn open(path: &str) -> Result { - let res = Self { - db: PgPool::connect(path) - .await - .map_err(|e| anyhow::anyhow!(e))?, - }; - - res.setup_database().await?; - - Ok(res) - } - - /// Sets up the database by creating necessary tables if they don't exist. - /// - /// # Returns - /// - /// A `Result` indicating success or failure of the setup process. - pub async fn setup_database(&self) -> Result<()> { - // Create credentials table - sqlx::query( - "CREATE TABLE IF NOT EXISTS credentials ( - account_code TEXT PRIMARY KEY, - account_eth_addr TEXT NOT NULL, - guardian_email_addr TEXT NOT NULL, - is_set BOOLEAN NOT NULL DEFAULT FALSE - );", - ) - .execute(&self.db) - .await?; - - // Create requests table - sqlx::query( - "CREATE TABLE IF NOT EXISTS requests ( - request_id BIGINT PRIMARY KEY, - account_eth_addr TEXT NOT NULL, - controller_eth_addr TEXT NOT NULL, - guardian_email_addr TEXT NOT NULL, - is_for_recovery BOOLEAN NOT NULL DEFAULT FALSE, - template_idx INT NOT NULL, - is_processed BOOLEAN NOT NULL DEFAULT FALSE, - is_success BOOLEAN, - email_nullifier TEXT, - account_salt TEXT - );", - ) - .execute(&self.db) - .await?; - - // Create expected_replies table - sqlx::query( - "CREATE TABLE IF NOT EXISTS expected_replies ( - message_id VARCHAR(255) PRIMARY KEY, - request_id VARCHAR(255), - has_reply BOOLEAN DEFAULT FALSE, - created_at TIMESTAMP DEFAULT (NOW() AT TIME ZONE 'UTC') - );", - ) - .execute(&self.db) - .await?; - Ok(()) - } - - /// Tests the database connection by attempting to execute a simple query. - /// - /// # Returns - /// - /// A `Result` indicating success or failure of the connection test. - pub(crate) async fn test_db_connection(&self) -> Result<()> { - // Try up to 3 times - for i in 1..4 { - match sqlx::query("SELECT 1").execute(&self.db).await { - Ok(_) => { - info!(LOG, "Connected successfully to database"); - return Ok(()); - } - Err(e) => { - error!( - LOG, - "Failed to initialize connection to the database: {:?}. Retrying...", e - ); - tokio::time::sleep(Duration::from_secs(i * i)).await; - } - } - } - Err(anyhow::anyhow!( - "Failed to initialize database connection after 3 attempts" - )) - } - - /// Retrieves credentials for a given account code. - /// - /// # Arguments - /// - /// * `account_code` - The unique code associated with the account. - /// - /// # Returns - /// - /// A `Result` containing an `Option` if successful, or an error if the query fails. - pub(crate) async fn get_credentials(&self, account_code: &str) -> Result> { - let row = sqlx::query("SELECT * FROM credentials WHERE account_code = $1") - .bind(account_code) - .fetch_optional(&self.db) - .await?; - - match row { - Some(row) => { - // Extract values from the row - let account_code: String = row.get("account_code"); - let account_eth_addr: String = row.get("account_eth_addr"); - let guardian_email_addr: String = row.get("guardian_email_addr"); - let is_set: bool = row.get("is_set"); - let codes_row = Credentials { - account_code, - account_eth_addr, - guardian_email_addr, - is_set, - }; - info!(LOG, "row {:?}", codes_row); - Ok(Some(codes_row)) - } - None => Ok(None), - } - } - - /// Checks if a wallet and email combination is registered in the database. - /// - /// # Arguments - /// - /// * `account_eth_addr` - The Ethereum address of the account. - /// * `email_addr` - The email address to check. - /// - /// # Returns - /// - /// A `Result` containing a boolean indicating if the combination is registered. - pub(crate) async fn is_wallet_and_email_registered( - &self, - account_eth_addr: &str, - email_addr: &str, - ) -> std::result::Result { - let row = sqlx::query( - "SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2", - ) - .bind(account_eth_addr) - .bind(email_addr) - .fetch_optional(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to check if wallet and email are registered", e))?; - - Ok(row.is_some()) - } - - /// Updates the credentials for a given account code. - /// - /// # Arguments - /// - /// * `row` - The `Credentials` struct containing the updated information. - /// - /// # Returns - /// - /// A `Result` indicating success or failure of the update operation. - pub(crate) async fn update_credentials_of_account_code( - &self, - row: &Credentials, - ) -> std::result::Result<(), DatabaseError> { - sqlx::query("UPDATE credentials SET account_eth_addr = $1, guardian_email_addr = $2, is_set = $3 WHERE account_code = $4") - .bind(&row.account_eth_addr) - .bind(&row.guardian_email_addr) - .bind(row.is_set) - .bind(&row.account_code) - .execute(&self.db) - .await - .map_err(|e| { - DatabaseError::new("Failed to update credentials of account code", e) - })?; - Ok(()) - } - - /// Updates the credentials for a given wallet and email combination. - /// - /// # Arguments - /// - /// * `row` - The `Credentials` struct containing the updated information. - /// - /// # Returns - /// - /// A `Result` indicating success or failure of the update operation. - pub(crate) async fn update_credentials_of_wallet_and_email( - &self, - row: &Credentials, - ) -> std::result::Result<(), DatabaseError> { - sqlx::query("UPDATE credentials SET account_code = $1, is_set = $2 WHERE account_eth_addr = $3 AND guardian_email_addr = $4") - .bind(&row.account_code) - .bind(row.is_set) - .bind(&row.account_eth_addr) - .bind(&row.guardian_email_addr) - .execute(&self.db) - .await - .map_err(|e| { - DatabaseError::new("Failed to insert credentials of wallet and email", e) - })?; - Ok(()) - } - - /// Updates the credentials of an inactive guardian. - /// - /// # Arguments - /// - /// * `is_set` - The new value for the `is_set` field. - /// * `account_eth_addr` - The Ethereum address of the account. - /// - /// # Returns - /// - /// A `Result` indicating success or failure of the update operation. - pub(crate) async fn update_credentials_of_inactive_guardian( - &self, - is_set: bool, - account_eth_addr: &str, - ) -> std::result::Result<(), DatabaseError> { - sqlx::query( - "UPDATE credentials SET is_set = $1 WHERE account_eth_addr = $2 AND is_set = true", - ) - .bind(is_set) - .bind(account_eth_addr) - .execute(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to update credentials of inactive guardian", e))?; - Ok(()) - } - - /// Inserts new credentials into the database. - /// - /// # Arguments - /// - /// * `row` - The `Credentials` struct containing the new information. - /// - /// # Returns - /// - /// A `Result` indicating success or failure of the insert operation. - pub(crate) async fn insert_credentials( - &self, - row: &Credentials, - ) -> std::result::Result<(), DatabaseError> { - sqlx::query( - "INSERT INTO credentials (account_code, account_eth_addr, guardian_email_addr, is_set) VALUES ($1, $2, $3, $4) RETURNING *", - ) - .bind(&row.account_code) - .bind(&row.account_eth_addr) - .bind(&row.guardian_email_addr) - .bind(row.is_set) - .fetch_one(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to insert credentials", e))?; - info!(LOG, "Credentials inserted"); - Ok(()) - } - - /// Checks if a guardian is set for a given account and email address. - /// - /// # Arguments - /// - /// * `account_eth_addr` - The Ethereum address of the account. - /// * `guardian_email_addr` - The email address of the guardian. - /// - /// # Returns - /// - /// A `Result` containing a boolean indicating whether the guardian is set. - pub async fn is_guardian_set( - &self, - account_eth_addr: &str, - guardian_email_addr: &str, - ) -> std::result::Result { - let row = sqlx::query("SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2 AND is_set = TRUE") - .bind(account_eth_addr) - .bind(guardian_email_addr) - .fetch_optional(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to check if guardian is set", e))?; - - Ok(row.is_some()) - } - - /// Retrieves a request from the database based on the request ID. - /// - /// # Arguments - /// - /// * `request_id` - The unique identifier of the request. - /// - /// # Returns - /// - /// A `Result` containing an `Option` if successful, or an error if the query fails. - pub(crate) async fn get_request( - &self, - request_id: u32, - ) -> std::result::Result, DatabaseError> { - let row = sqlx::query("SELECT * FROM requests WHERE request_id = $1") - .bind(request_id as i64) - .fetch_optional(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to get request", e))?; - - match row { - Some(row) => { - // Extract values from the row - let request_id: i64 = row.get("request_id"); - let account_eth_addr: String = row.get("account_eth_addr"); - let controller_eth_addr: String = row.get("controller_eth_addr"); - let guardian_email_addr: String = row.get("guardian_email_addr"); - let is_for_recovery: bool = row.get("is_for_recovery"); - let template_idx: i32 = row.get("template_idx"); - let is_processed: bool = row.get("is_processed"); - let is_success: Option = row.get("is_success"); - let email_nullifier: Option = row.get("email_nullifier"); - let account_salt: Option = row.get("account_salt"); - let requests_row = Request { - request_id: request_id as u32, - account_eth_addr, - controller_eth_addr, - guardian_email_addr, - is_for_recovery, - template_idx: template_idx as u64, - is_processed, - is_success, - email_nullifier, - account_salt, - }; - info!(LOG, "row {:?}", requests_row); - Ok(Some(requests_row)) - } - None => Ok(None), - } - } - - /// Updates an existing request in the database. - /// - /// # Arguments - /// - /// * `row` - The `Request` struct containing the updated information. - /// - /// # Returns - /// - /// A `Result` indicating success or failure of the update operation. - pub(crate) async fn update_request( - &self, - row: &Request, - ) -> std::result::Result<(), DatabaseError> { - sqlx::query("UPDATE requests SET account_eth_addr = $1, controller_eth_addr = $2, guardian_email_addr = $3, is_for_recovery = $4, template_idx = $5, is_processed = $6, is_success = $7, email_nullifier = $8, account_salt = $9 WHERE request_id = $10") - .bind(&row.account_eth_addr) - .bind(&row.controller_eth_addr) - .bind(&row.guardian_email_addr) - .bind(row.is_for_recovery) - .bind(row.template_idx as i64) - .bind(row.is_processed) - .bind(row.is_success) - .bind(&row.email_nullifier) - .bind(&row.account_salt) - .bind(row.request_id as i64) - .execute(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to update request", e))?; - Ok(()) - } - - /// Retrieves the account code for a given wallet and email combination. - /// - /// # Arguments - /// - /// * `account_eth_addr` - The Ethereum address of the account. - /// * `email_addr` - The email address associated with the account. - /// - /// # Returns - /// - /// A `Result` containing an `Option` with the account code if found, or an error if the query fails. - pub(crate) async fn get_account_code_from_wallet_and_email( - &self, - account_eth_addr: &str, - email_addr: &str, - ) -> std::result::Result, DatabaseError> { - let row = sqlx::query( - "SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2", - ) - .bind(account_eth_addr) - .bind(email_addr) - .fetch_optional(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to get account code from wallet and email", e))?; - - match row { - Some(row) => { - let account_code: String = row.get("account_code"); - Ok(Some(account_code)) - } - None => Ok(None), - } - } - - /// Retrieves the credentials for a given wallet and email combination. - /// - /// # Arguments - /// - /// * `account_eth_addr` - The Ethereum address of the account. - /// * `email_addr` - The email address associated with the account. - /// - /// # Returns - /// - /// A `Result` containing an `Option` if found, or an error if the query fails. - pub(crate) async fn get_credentials_from_wallet_and_email( - &self, - account_eth_addr: &str, - email_addr: &str, - ) -> std::result::Result, DatabaseError> { - let row = sqlx::query( - "SELECT * FROM credentials WHERE account_eth_addr = $1 AND guardian_email_addr = $2", - ) - .bind(account_eth_addr) - .bind(email_addr) - .fetch_optional(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to get credentials from wallet and email", e))?; - - match row { - Some(row) => { - // Extract values from the row - let account_code: String = row.get("account_code"); - let account_eth_addr: String = row.get("account_eth_addr"); - let guardian_email_addr: String = row.get("guardian_email_addr"); - let is_set: bool = row.get("is_set"); - let codes_row = Credentials { - account_code, - account_eth_addr, - guardian_email_addr, - is_set, - }; - info!(LOG, "row {:?}", codes_row); - Ok(Some(codes_row)) - } - None => Ok(None), - } - } - - /// Inserts a new request into the database. - /// - /// # Arguments - /// - /// * `row` - The `Request` struct containing the new request information. - /// - /// # Returns - /// - /// A `Result` indicating success or failure of the insert operation. - pub(crate) async fn insert_request( - &self, - row: &Request, - ) -> std::result::Result<(), DatabaseError> { - let request_id = row.request_id; - sqlx::query( - "INSERT INTO requests (request_id, account_eth_addr, controller_eth_addr, guardian_email_addr, is_for_recovery, template_idx, is_processed, is_success, email_nullifier, account_salt) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *", - ) - .bind(row.request_id as i64) - .bind(&row.account_eth_addr) - .bind(&row.controller_eth_addr) - .bind(&row.guardian_email_addr) - .bind(row.is_for_recovery) - .bind(row.template_idx as i64) - .bind(row.is_processed) - .bind(row.is_success) - .bind(&row.email_nullifier) - .bind(&row.account_salt) - .fetch_one(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to insert request", e))?; - info!(LOG, "Request inserted with request_id: {}", request_id); - Ok(()) - } - - /// Adds an expected reply to the database. - /// - /// # Arguments - /// - /// * `message_id` - The unique identifier of the message. - /// * `request_id` - An optional request ID associated with the reply. - /// - /// # Returns - /// - /// A `Result` indicating success or failure of the insert operation. - pub(crate) async fn add_expected_reply( - &self, - message_id: &str, - request_id: Option, - ) -> Result<(), DatabaseError> { - let query = " - INSERT INTO expected_replies (message_id, request_id) - VALUES ($1, $2); - "; - sqlx::query(query) - .bind(message_id) - .bind(request_id) - .execute(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to insert expected_reply", e))?; - Ok(()) - } - - /// Checks if the given message_id corresponds to a valid reply. - /// - /// This function updates the `has_reply` field to true if the message_id exists and hasn't been replied to yet. - /// - /// # Arguments - /// - /// * `message_id` - The unique identifier of the message. - /// - /// # Returns - /// - /// A `Result` containing a boolean indicating if the reply is valid (true if the update was successful). - pub(crate) async fn is_valid_reply(&self, message_id: &str) -> Result { - let query = " - UPDATE expected_replies - SET has_reply = true - WHERE message_id = $1 AND has_reply = false - RETURNING *; - "; - let result = sqlx::query(query) - .bind(message_id) - .execute(&self.db) - .await - .map_err(|e| DatabaseError::new("Failed to validate reply", e))?; - Ok(result.rows_affected() > 0) - } -} diff --git a/packages/relayer/src/db/mod.rs b/packages/relayer/src/db/mod.rs new file mode 100644 index 00000000..ee2d47ae --- /dev/null +++ b/packages/relayer/src/db/mod.rs @@ -0,0 +1 @@ +mod model; diff --git a/packages/relayer/src/db/model.rs b/packages/relayer/src/db/model.rs new file mode 100644 index 00000000..fe91c428 --- /dev/null +++ b/packages/relayer/src/db/model.rs @@ -0,0 +1,12 @@ +use serde::{Deserialize, Serialize}; +use sqlx::FromRow; +use uuid::Uuid; + +#[derive(Debug, FromRow, Deserialize, Serialize)] +#[allow(non_snake_case)] +pub struct RequestModel { + pub id: Uuid, + pub status: String, + #[serde(rename = "updatedAt")] + pub updated_at: Option>, +} diff --git a/packages/relayer/src/handler.rs b/packages/relayer/src/handler.rs new file mode 100644 index 00000000..98ea8958 --- /dev/null +++ b/packages/relayer/src/handler.rs @@ -0,0 +1,12 @@ +use axum::{response::IntoResponse, Json}; + +pub async fn health_checker_handler() -> impl IntoResponse { + const MESSAGE: &str = "Hello from ZK Email!"; + + let json_response = serde_json::json!({ + "status": "success", + "message": MESSAGE + }); + + Json(json_response) +} diff --git a/packages/relayer/src/lib.rs b/packages/relayer/src/lib.rs deleted file mode 100644 index d0b83379..00000000 --- a/packages/relayer/src/lib.rs +++ /dev/null @@ -1,143 +0,0 @@ -#![allow(dead_code)] -#![allow(unused_variables)] -#![allow(unreachable_code)] - -pub mod abis; -pub mod chain; -pub mod config; -pub mod core; -pub mod database; -pub mod modules; -pub mod strings; - -pub use abis::*; -pub use chain::*; -pub use config::*; -pub use core::*; -pub use database::*; -pub use modules::*; -use relayer_utils::LOG; -pub use strings::*; - -use tokio::sync::{Mutex, OnceCell}; - -use anyhow::{anyhow, Result}; -use dotenv::dotenv; -use ethers::prelude::*; -use lazy_static::lazy_static; -use relayer_utils::{converters::*, cryptos::*, parse_email::ParsedEmail}; -use slog::{error, info, trace}; -use std::env; -use std::path::PathBuf; -use std::sync::{Arc, OnceLock}; -use tokio::time::Duration; - -pub static REGEX_JSON_DIR_PATH: OnceLock = OnceLock::new(); -pub static WEB_SERVER_ADDRESS: OnceLock = OnceLock::new(); -pub static PROVER_ADDRESS: OnceLock = OnceLock::new(); -pub static PRIVATE_KEY: OnceLock = OnceLock::new(); -pub static CHAIN_ID: OnceLock = OnceLock::new(); -pub static EMAIL_ACCOUNT_RECOVERY_VERSION_ID: OnceLock = OnceLock::new(); -pub static CHAIN_RPC_PROVIDER: OnceLock = OnceLock::new(); -pub static CHAIN_RPC_EXPLORER: OnceLock = OnceLock::new(); -pub static EMAIL_TEMPLATES: OnceLock = OnceLock::new(); -pub static RELAYER_EMAIL_ADDRESS: OnceLock = OnceLock::new(); -pub static SMTP_SERVER: OnceLock = OnceLock::new(); - -static DB_CELL: OnceCell> = OnceCell::const_new(); - -/// Wrapper struct for database access -struct DBWrapper; - -impl DBWrapper { - /// Retrieves the database instance. - /// - /// # Returns - /// - /// A reference to the `Arc`. - /// - /// # Panics - /// - /// Panics if the database is not initialized. - fn get() -> &'static Arc { - DB_CELL.get().expect("Database not initialized") - } -} - -impl std::ops::Deref for DBWrapper { - type Target = Database; - - fn deref(&self) -> &Self::Target { - Self::get() - } -} - -static DB: DBWrapper = DBWrapper; - -lazy_static! { - /// Shared instance of the `ChainClient`. - pub static ref CLIENT: Arc = { - dotenv().ok(); - let client = tokio::task::block_in_place(|| { - tokio::runtime::Runtime::new() - .unwrap() - .block_on(ChainClient::setup()) - }) - .unwrap(); - Arc::new(client) - }; - /// Shared mutex for synchronization. - pub static ref SHARED_MUTEX: Arc> = Arc::new(Mutex::new(0)); -} - -/// Runs the relayer with the given configuration. -/// -/// # Arguments -/// -/// * `config` - The configuration for the relayer. -/// -/// # Returns -/// -/// A `Result` indicating success or failure. -pub async fn run(config: RelayerConfig) -> Result<()> { - info!(LOG, "Starting relayer"); - - // Initialize global configuration - REGEX_JSON_DIR_PATH.set(config.regex_json_dir_path).unwrap(); - WEB_SERVER_ADDRESS.set(config.web_server_address).unwrap(); - PROVER_ADDRESS.set(config.prover_address).unwrap(); - PRIVATE_KEY.set(config.private_key).unwrap(); - CHAIN_ID.set(config.chain_id).unwrap(); - CHAIN_RPC_PROVIDER.set(config.chain_rpc_provider).unwrap(); - CHAIN_RPC_EXPLORER.set(config.chain_rpc_explorer).unwrap(); - EMAIL_ACCOUNT_RECOVERY_VERSION_ID - .set(config.email_account_recovery_version_id) - .unwrap(); - EMAIL_TEMPLATES.set(config.email_templates).unwrap(); - RELAYER_EMAIL_ADDRESS - .set(config.relayer_email_addr) - .unwrap(); - SMTP_SERVER.set(config.smtp_server).unwrap(); - - // Spawn the API server task - let api_server_task = tokio::task::spawn(async move { - loop { - match run_server().await { - Ok(_) => { - info!(LOG, "run_server exited normally"); - break; // Exit loop if run_server exits normally - } - Err(err) => { - error!(LOG, "Error api server: {}", err); - // Add a delay before restarting to prevent rapid restart loops - tokio::time::sleep(Duration::from_secs(5)).await; - } - } - } - }); - - // Wait for the API server task to complete - let _ = tokio::join!(api_server_task); - - Ok(()) -} diff --git a/packages/relayer/src/main.rs b/packages/relayer/src/main.rs index a76835b6..4b622f3f 100644 --- a/packages/relayer/src/main.rs +++ b/packages/relayer/src/main.rs @@ -1,9 +1,53 @@ +mod config; +mod db; +mod handler; +mod route; + +use std::sync::Arc; + use anyhow::Result; -use relayer::*; +use axum::http::{ + header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE}, + Method, +}; +use relayer_utils::LOG; +use route::create_router; +use slog::info; +use sqlx::{postgres::PgPoolOptions, Pool, Postgres}; +use tower_http::cors::CorsLayer; + +use config::Config; + +pub struct RelayerState { + config: Config, + db: Pool, +} #[tokio::main] async fn main() -> Result<()> { - run(RelayerConfig::new()).await?; + let config = config::load_config()?; + info!(LOG, "Loaded configuration: {:?}", config); + + let pool = PgPoolOptions::new() + .max_connections(10) + .connect(&config.database_url) + .await?; + info!(LOG, "Database connection established."); + + let cors = CorsLayer::new() + .allow_origin(tower_http::cors::Any) + .allow_methods([Method::GET, Method::POST]) + .allow_headers([AUTHORIZATION, ACCEPT, CONTENT_TYPE]); + + let relayer = create_router(Arc::new(RelayerState { + config: config.clone(), + db: pool.clone(), + })) + .layer(cors); + + let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{}", config.port)).await?; + info!(LOG, "Serving relayer on port: {}", config.port); + axum::serve(listener, relayer).await?; Ok(()) } diff --git a/packages/relayer/src/modules/dkim.rs b/packages/relayer/src/modules/dkim.rs deleted file mode 100644 index 369f063b..00000000 --- a/packages/relayer/src/modules/dkim.rs +++ /dev/null @@ -1,230 +0,0 @@ -use std::fs; - -use anyhow::anyhow; -use relayer_utils::extract_substr_idxes; -use relayer_utils::DecomposedRegexConfig; -use relayer_utils::LOG; - -use crate::*; -use candid::CandidType; -use ethers::types::Bytes; -use ethers::utils::hex::FromHex; -use ic_agent::agent::http_transport::ReqwestTransport; -use ic_agent::agent::*; -use ic_agent::identity::*; -use ic_utils::canister::*; - -use serde::Deserialize; - -/// Represents a client for interacting with the DKIM Oracle. -#[derive(Debug, Clone)] -pub struct DkimOracleClient<'a> { - /// The canister used for communication - pub canister: Canister<'a>, -} - -/// Represents a signed DKIM public key. -#[derive(Default, CandidType, Deserialize, Debug, Clone)] -pub struct SignedDkimPublicKey { - /// The selector for the DKIM key - pub selector: String, - /// The domain for the DKIM key - pub domain: String, - /// The signature of the DKIM key - pub signature: String, - /// The public key - pub public_key: String, - /// The hash of the public key - pub public_key_hash: String, -} - -impl<'a> DkimOracleClient<'a> { - /// Generates an agent for the DKIM Oracle Client. - /// - /// # Arguments - /// - /// * `pem_path` - The path to the PEM file. - /// * `replica_url` - The URL of the replica. - /// - /// # Returns - /// - /// An `anyhow::Result`. - pub fn gen_agent(pem_path: &str, replica_url: &str) -> anyhow::Result { - // Create identity from PEM file - let identity = Secp256k1Identity::from_pem_file(pem_path)?; - - // Create transport using the replica URL - let transport = ReqwestTransport::create(replica_url)?; - - // Build and return the agent - let agent = AgentBuilder::default() - .with_identity(identity) - .with_transport(transport) - .build()?; - Ok(agent) - } - - /// Creates a new DkimOracleClient. - /// - /// # Arguments - /// - /// * `canister_id` - The ID of the canister. - /// * `agent` - The agent to use for communication. - /// - /// # Returns - /// - /// An `anyhow::Result`. - pub fn new(canister_id: &str, agent: &'a Agent) -> anyhow::Result { - // Build the canister using the provided ID and agent - let canister = CanisterBuilder::new() - .with_canister_id(canister_id) - .with_agent(agent) - .build()?; - Ok(Self { canister }) - } - - /// Requests a signature for a DKIM public key. - /// - /// # Arguments - /// - /// * `selector` - The selector for the DKIM key. - /// * `domain` - The domain for the DKIM key. - /// - /// # Returns - /// - /// An `anyhow::Result`. - pub async fn request_signature( - &self, - selector: &str, - domain: &str, - ) -> anyhow::Result { - // Build the request to sign the DKIM public key - let request = self - .canister - .update("sign_dkim_public_key") - .with_args((selector, domain)) - .build::<(Result,)>(); - - // Call the canister and wait for the response - let response = request - .call_and_wait_one::>() - .await? - .map_err(|e| anyhow!(format!("Error from canister: {:?}", e)))?; - - Ok(response) - } -} - -/// Checks and updates the DKIM for a given email. -/// -/// # Arguments -/// -/// * `email` - The email address. -/// * `parsed_email` - The parsed email data. -/// * `controller_eth_addr` - The Ethereum address of the controller. -/// * `wallet_addr` - The address of the wallet. -/// * `account_salt` - The salt for the account. -/// -/// # Returns -/// -/// A `Result<()>`. -pub async fn check_and_update_dkim( - email: &str, - parsed_email: &ParsedEmail, - controller_eth_addr: &str, - wallet_addr: &str, - account_salt: &str, -) -> Result<()> { - // Generate public key hash - let mut public_key_n = parsed_email.public_key.clone(); - public_key_n.reverse(); - let public_key_hash = public_key_hash(&public_key_n)?; - info!(LOG, "public_key_hash {:?}", public_key_hash); - - // Get email domain - let domain = parsed_email.get_email_domain()?; - info!(LOG, "domain {:?}", domain); - - // Check if wallet is deployed - if CLIENT.get_bytecode(wallet_addr).await? == Bytes::from_static(&[0u8; 20]) { - info!(LOG, "wallet not deployed"); - return Ok(()); - } - - // Get email auth address - let email_auth_addr = CLIENT - .get_email_auth_addr_from_wallet(controller_eth_addr, wallet_addr, account_salt) - .await?; - let email_auth_addr = format!("0x{:x}", email_auth_addr); - - // Get DKIM from wallet or email auth - let mut dkim = CLIENT.get_dkim_from_wallet(controller_eth_addr).await?; - if CLIENT.get_bytecode(&email_auth_addr).await? != Bytes::new() { - dkim = CLIENT.get_dkim_from_email_auth(&email_auth_addr).await?; - } - info!(LOG, "dkim {:?}", dkim); - - // Check if DKIM public key hash is valid - if CLIENT - .check_if_dkim_public_key_hash_valid( - domain.clone(), - fr_to_bytes32(&public_key_hash)?, - dkim.clone(), - ) - .await? - { - info!(LOG, "public key registered"); - return Ok(()); - } - - // Get selector - let selector_def_path = - PathBuf::from(env::var(REGEX_JSON_DIR_PATH_KEY).unwrap()).join("selector_def.json"); - let selector_def_contents = fs::read_to_string(&selector_def_path) - .map_err(|e| anyhow!("Failed to read file {}: {}", selector_def_path.display(), e))?; - let selector_decomposed_def: DecomposedRegexConfig = - serde_json::from_str(&selector_def_contents).map_err(|e| { - anyhow!( - "Failed to parse JSON from file {}: {}", - selector_def_path.display(), - e - ) - })?; - let selector = { - let idxes = - extract_substr_idxes(&parsed_email.canonicalized_header, &selector_decomposed_def)?[0]; - parsed_email.canonicalized_header[idxes.0..idxes.1].to_string() - }; - - info!(LOG, "selector {}", selector); - - // Generate IC agent and create oracle client - let ic_agent = DkimOracleClient::gen_agent( - &env::var(PEM_PATH_KEY).unwrap(), - &env::var(IC_REPLICA_URL_KEY).unwrap(), - )?; - let oracle_client = DkimOracleClient::new(&env::var(CANISTER_ID_KEY).unwrap(), &ic_agent)?; - - // Request signature from oracle - let oracle_result = oracle_client.request_signature(&selector, &domain).await?; - info!(LOG, "DKIM oracle result {:?}", oracle_result); - - // Process oracle response - let public_key_hash = hex::decode(&oracle_result.public_key_hash[2..])?; - info!(LOG, "public_key_hash from oracle {:?}", public_key_hash); - let signature = Bytes::from_hex(&oracle_result.signature[2..])?; - info!(LOG, "signature {:?}", signature); - - // Set DKIM public key hash - let tx_hash = CLIENT - .set_dkim_public_key_hash( - selector, - domain, - TryInto::<[u8; 32]>::try_into(public_key_hash).unwrap(), - signature, - dkim, - ) - .await?; - info!(LOG, "DKIM registry updated {:?}", tx_hash); - Ok(()) -} diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs deleted file mode 100644 index 5fbc5d9a..00000000 --- a/packages/relayer/src/modules/mail.rs +++ /dev/null @@ -1,585 +0,0 @@ -use crate::*; -use handlebars::Handlebars; -use serde::{Deserialize, Serialize}; -use serde_json::Value; -use tokio::fs::read_to_string; - -/// Represents different types of email authentication events. -#[derive(Debug, Clone)] -pub enum EmailAuthEvent { - AcceptanceRequest { - account_eth_addr: String, - guardian_email_addr: String, - request_id: u32, - command: String, - account_code: String, - }, - GuardianAlreadyExists { - account_eth_addr: String, - guardian_email_addr: String, - }, - Error { - email_addr: String, - error: String, - original_subject: String, - original_message_id: Option, - }, - RecoveryRequest { - account_eth_addr: String, - guardian_email_addr: String, - request_id: u32, - command: String, - }, - AcceptanceSuccess { - account_eth_addr: String, - guardian_email_addr: String, - request_id: u32, - original_subject: String, - original_message_id: Option, - }, - RecoverySuccess { - account_eth_addr: String, - guardian_email_addr: String, - request_id: u32, - original_subject: String, - original_message_id: Option, - }, - GuardianNotSet { - account_eth_addr: String, - guardian_email_addr: String, - }, - GuardianNotRegistered { - account_eth_addr: String, - guardian_email_addr: String, - command: String, - request_id: u32, - }, - Ack { - email_addr: String, - command: String, - original_message_id: Option, - original_subject: String, - }, - NoOp, -} - -/// Represents an email message to be sent. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct EmailMessage { - pub to: String, - pub subject: String, - pub reference: Option, - pub reply_to: Option, - pub body_plain: String, - pub body_html: String, - pub body_attachments: Option>, -} - -/// Represents an attachment in an email message. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct EmailAttachment { - pub inline_id: String, - pub content_type: String, - pub contents: Vec, -} - -/// Handles all possible email events and requests. -/// -/// # Arguments -/// -/// * `event` - The `EmailAuthEvent` to be handled. -/// -/// # Returns -/// -/// A `Result` indicating success or an `EmailError`. -pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError> { - match event { - EmailAuthEvent::AcceptanceRequest { - account_eth_addr, - guardian_email_addr, - request_id, - command, - account_code, - } => { - // Prepare the command with the account code - let command = format!("{} Code {}", command, account_code); - - // Create the plain text body - let body_plain = format!( - "You have received an guardian request from the wallet address {}. \ - {} Code {}. \ - Reply \"Confirm\" to this email to accept the request. \ - Your request ID is #{}. \ - If you did not initiate this request, please contact us immediately.", - account_eth_addr, command, account_code, request_id - ); - - let subject = "Email Recovery: Acceptance Request".to_string(); - - // Prepare data for HTML rendering - let render_data = serde_json::json!({ - "userEmailAddr": guardian_email_addr, - "walletAddress": account_eth_addr, - "command": command, - "requestId": request_id, - }); - let body_html = render_html("acceptance_request.html", render_data).await?; - - // Create and send the email - let email = EmailMessage { - to: guardian_email_addr, - subject, - reference: None, - reply_to: None, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email, Some(ExpectsReply::new(request_id))).await?; - } - EmailAuthEvent::Error { - email_addr, - error, - original_subject, - original_message_id, - } => { - let subject = format!("Re: {}", original_subject); - - let body_plain = format!( - "An error occurred while processing your request. \ - Error: {}", - error - ); - - // Prepare data for HTML rendering - let render_data = serde_json::json!({ - "error": error, - "userEmailAddr": email_addr, - }); - let body_html = render_html("error.html", render_data).await?; - - // Create and send the email - let email = EmailMessage { - to: email_addr, - subject, - reference: original_message_id.clone(), - reply_to: original_message_id, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email, None).await?; - } - EmailAuthEvent::GuardianAlreadyExists { - account_eth_addr, - guardian_email_addr, - } => { - let subject = "Guardian Already Exists"; - let body_plain = format!( - "The guardian email address {} is already associated with the wallet address {}. \ - If you did not initiate this request, please contact us immediately.", - guardian_email_addr, account_eth_addr - ); - - // Prepare data for HTML rendering - let render_data = serde_json::json!({ - "walletAddress": account_eth_addr, - "userEmailAddr": guardian_email_addr, - }); - let body_html = render_html("guardian_already_exists.html", render_data).await?; - - // Create and send the email - let email = EmailMessage { - to: guardian_email_addr, - subject: subject.to_string(), - reference: None, - reply_to: None, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email, None).await?; - } - EmailAuthEvent::RecoveryRequest { - account_eth_addr, - guardian_email_addr, - request_id, - command, - } => { - let body_plain = format!( - "You have received a recovery request from the wallet address {}. \ - Reply \"Confirm\" to this email to accept the request. \ - Your request ID is #{}. \ - If you did not initiate this request, please contact us immediately.", - account_eth_addr, request_id - ); - - let subject = "Email Recovery: Recovery Request".to_string(); - - // Prepare data for HTML rendering - let render_data = serde_json::json!({ - "userEmailAddr": guardian_email_addr, - "walletAddress": account_eth_addr, - "command": command, - "requestId": request_id, - }); - let body_html = render_html("recovery_request.html", render_data).await?; - - // Create and send the email - let email = EmailMessage { - to: guardian_email_addr, - subject, - reference: None, - reply_to: None, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email, Some(ExpectsReply::new(request_id))).await?; - } - EmailAuthEvent::AcceptanceSuccess { - account_eth_addr, - guardian_email_addr, - request_id, - original_subject, - original_message_id, - } => { - let subject = format!("Re: {}", original_subject); - let body_plain = format!( - "Your guardian request for the wallet address {} has been set. \ - Your request ID is #{} is now complete.", - account_eth_addr, request_id - ); - - // Prepare data for HTML rendering - let render_data = serde_json::json!({ - "walletAddress": account_eth_addr, - "userEmailAddr": guardian_email_addr, - "requestId": request_id, - }); - let body_html = render_html("acceptance_success.html", render_data).await?; - - // Create and send the email - let email = EmailMessage { - to: guardian_email_addr, - subject: subject.to_string(), - reference: original_message_id.clone(), - reply_to: original_message_id, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email, None).await?; - } - EmailAuthEvent::RecoverySuccess { - account_eth_addr, - guardian_email_addr, - request_id, - original_subject, - original_message_id, - } => { - let subject = format!("Re: {}", original_subject); - let body_plain = format!( - "Your recovery request for the wallet address {} is successful. \ - Your request ID is #{}.", - account_eth_addr, request_id - ); - - // Prepare data for HTML rendering - let render_data = serde_json::json!({ - "walletAddress": account_eth_addr, - "userEmailAddr": guardian_email_addr, - "requestId": request_id, - }); - let body_html = render_html("recovery_success.html", render_data).await?; - - // Create and send the email - let email = EmailMessage { - to: guardian_email_addr, - subject: subject.to_string(), - reference: original_message_id.clone(), - reply_to: original_message_id, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email, None).await?; - } - EmailAuthEvent::GuardianNotSet { - account_eth_addr, - guardian_email_addr, - } => { - let subject = "Guardian Not Set"; - let body_plain = format!("Guardian not set for wallet address {}", account_eth_addr); - - // Prepare data for HTML rendering - let render_data = serde_json::json!({ - "walletAddress": account_eth_addr, - "userEmailAddr": guardian_email_addr, - }); - let body_html = render_html("guardian_not_set.html", render_data).await?; - - // Create and send the email - let email = EmailMessage { - to: guardian_email_addr, - subject: subject.to_string(), - reference: None, - reply_to: None, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email, None).await?; - } - EmailAuthEvent::GuardianNotRegistered { - account_eth_addr, - guardian_email_addr, - command, - request_id, - } => { - let command = format!("{} Code ", command); - - let body_plain = format!( - "You have received an guardian request from the wallet address {}. \ - Reply to this email. \ - Your request ID is #{}. \ - If you did not initiate this request, please contact us immediately.", - account_eth_addr, request_id - ); - - // Prepare data for HTML rendering - let render_data = serde_json::json!({ - "userEmailAddr": guardian_email_addr, - "walletAddress": account_eth_addr, - "requestId": request_id, - "command": command, - }); - - let subject = "Guardian Not Registered".to_string(); - let body_html = render_html("credential_not_present.html", render_data).await?; - - // Create and send the email - let email = EmailMessage { - to: guardian_email_addr, - subject, - reference: None, - reply_to: None, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email, Some(ExpectsReply::new(request_id))).await?; - } - EmailAuthEvent::Ack { - email_addr, - command, - original_message_id, - original_subject, - } => { - let body_plain = format!( - "Hi {}!\nYour email with the command {} is received.", - email_addr, command - ); - // Prepare data for HTML rendering - let render_data = serde_json::json!({"userEmailAddr": email_addr, "request": command}); - let body_html = render_html("acknowledgement.html", render_data).await?; - let subject = format!("Re: {}", original_subject); - // Create and send the email - let email = EmailMessage { - to: email_addr, - subject, - body_plain, - body_html, - reference: original_message_id.clone(), - reply_to: original_message_id, - body_attachments: None, - }; - send_email(email, None).await?; - } - EmailAuthEvent::NoOp => {} - } - - Ok(()) -} - -/// Renders an HTML template with the given data. -/// -/// # Arguments -/// -/// * `template_name` - The name of the template file. -/// * `render_data` - The data to be used in rendering the template. -/// -/// # Returns -/// -/// A `Result` containing the rendered HTML string or an `EmailError`. -async fn render_html(template_name: &str, render_data: Value) -> Result { - // Construct the full path to the email template - let email_template_filename = PathBuf::new() - .join(EMAIL_TEMPLATES.get().unwrap()) - .join(template_name); - - // Read the email template file - let email_template = read_to_string(&email_template_filename) - .await - .map_err(|e| { - EmailError::FileNotFound(format!( - "Could not get email template {}: {}", - template_name, e - )) - })?; - - // Create a new Handlebars instance - let reg = Handlebars::new(); - - // Render the template with the provided data - let template = reg.render_template(&email_template, &render_data)?; - Ok(template) -} - -/// Parses an error string and returns a more user-friendly error message. -/// -/// # Arguments -/// -/// * `error` - The error string to be parsed. -/// -/// # Returns -/// -/// A `Result` containing an `Option` with the parsed error message. -fn parse_error(error: String) -> Result> { - let mut error = error; - if error.contains("Contract call reverted with data: ") { - // Extract and decode the revert data - let revert_data = error - .replace("Contract call reverted with data: ", "") - .split_at(10) - .1 - .to_string(); - let revert_bytes = hex::decode(revert_data) - .unwrap() - .into_iter() - .filter(|&b| (0x20..=0x7E).contains(&b)) - .collect(); - error = String::from_utf8(revert_bytes).unwrap().trim().to_string(); - } - - // Match known error messages and provide user-friendly responses - match error.as_str() { - "Account is already created" => Ok(Some(error)), - "insufficient balance" => Ok(Some("You don't have sufficient balance".to_string())), - _ => Ok(Some(error)), - } -} - -/// Sends an email using the configured SMTP server. -/// -/// # Arguments -/// -/// * `email` - The `EmailMessage` to be sent. -/// * `expects_reply` - An optional `ExpectsReply` struct indicating if a reply is expected. -/// -/// # Returns -/// -/// A `Result` indicating success or an `EmailError`. -async fn send_email( - email: EmailMessage, - expects_reply: Option, -) -> Result<(), EmailError> { - let smtp_server = SMTP_SERVER.get().unwrap(); - - // Send POST request to email server - let client = reqwest::Client::new(); - let response = client - .post(smtp_server) - .json(&email) - .send() - .await - .map_err(|e| EmailError::Send(format!("Failed to send email: {}", e)))?; - - // Check if the email was sent successfully - if !response.status().is_success() { - return Err(EmailError::Send(format!( - "Failed to send email: {}", - response.text().await.unwrap_or_default() - ))); - } - - // Handle expected reply if necessary - if let Some(expects_reply) = expects_reply { - let response_body: EmailResponse = response - .json() - .await - .map_err(|e| EmailError::Parse(format!("Failed to parse response JSON: {}", e)))?; - - let message_id = response_body.message_id; - DB.add_expected_reply(&message_id, expects_reply.request_id) - .await?; - } - - Ok(()) -} - -/// Represents the response from the email server after sending an email. -#[derive(Debug, Clone, Serialize, Deserialize)] -struct EmailResponse { - status: String, - message_id: String, -} - -/// Represents an expectation of a reply to an email. -pub struct ExpectsReply { - request_id: Option, -} - -impl ExpectsReply { - /// Creates a new `ExpectsReply` instance with a request ID. - /// - /// # Arguments - /// - /// * `request_id` - The ID of the request expecting a reply. - fn new(request_id: u32) -> Self { - Self { - request_id: Some(request_id.to_string()), - } - } - - /// Creates a new `ExpectsReply` instance without a request ID. - fn new_no_request_id() -> Self { - Self { request_id: None } - } -} - -/// Checks if the email is a reply to a command that expects a reply. -/// Will return false for duplicate replies. -/// Will return true if the email is not a reply. -/// -/// # Arguments -/// -/// * `email` - The `ParsedEmail` to be checked. -/// -/// # Returns -/// -/// A `Result` containing a boolean indicating if the request is valid. -pub async fn check_is_valid_request(email: &ParsedEmail) -> Result { - // Check if the email is a reply by looking for the "In-Reply-To" header - let reply_message_id = match email - .headers - .get_header("In-Reply-To") - .and_then(|v| v.first().cloned()) - { - Some(id) => id, - // Email is not a reply, so it's valid - None => return Ok(true), - }; - - // Check if the reply is valid (not a duplicate) using the database - let is_valid = DB.is_valid_reply(&reply_message_id).await?; - Ok(is_valid) -} diff --git a/packages/relayer/src/modules/mod.rs b/packages/relayer/src/modules/mod.rs deleted file mode 100644 index eaf1adc5..00000000 --- a/packages/relayer/src/modules/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -//! This module contains the dkim, mail and web_server modules. - -pub mod dkim; -pub mod mail; -pub mod web_server; - -pub use dkim::*; -pub use mail::*; -pub use web_server::*; diff --git a/packages/relayer/src/modules/web_server/mod.rs b/packages/relayer/src/modules/web_server/mod.rs deleted file mode 100644 index 3a48beb6..00000000 --- a/packages/relayer/src/modules/web_server/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -//! This module contains the axum web server and its routes and custom errors. - -pub mod relayer_errors; -pub mod rest_api; -pub mod server; - -pub use relayer_errors::*; -pub use rest_api::*; -pub use server::*; diff --git a/packages/relayer/src/modules/web_server/relayer_errors.rs b/packages/relayer/src/modules/web_server/relayer_errors.rs deleted file mode 100644 index 8b49462a..00000000 --- a/packages/relayer/src/modules/web_server/relayer_errors.rs +++ /dev/null @@ -1,223 +0,0 @@ -use crate::*; -use axum::{ - response::{IntoResponse, Response}, - Json, -}; -use handlebars::RenderError; -use relayer_utils::ExtractSubstrssError; -use reqwest::StatusCode; -use rustc_hex::FromHexError; -use serde_json::json; -use thiserror::Error; - -/// Custom error type for API-related errors -#[derive(Error, Debug)] -pub enum ApiError { - #[error("Database error: {0}")] - Database(#[from] DatabaseError), - #[error("Sqlx error: {0}")] - SqlxError(#[from] sqlx::Error), - #[error("Validation error: {0}")] - Validation(String), - #[error("Chain error: {0}")] - Chain(#[from] ChainError), - // #[error("Not found: {0}")] - // NotFound(String), - #[error("Anyhow error: {0}")] - Anyhow(#[from] anyhow::Error), - #[error("Internal error: {0}")] - Internal(String), - #[error("Error recieving email: {0}")] - Email(#[from] EmailError), -} - -/// Custom error type for email-related errors -#[derive(Error, Debug)] -pub enum EmailError { - #[error("Email body error: {0}")] - Body(String), - #[error("Email address error: {0}")] - EmailAddress(String), - #[error("Parse error: {0}")] - Parse(String), - #[error("DKIM error: {0}")] - Dkim(String), - #[error("ZkRegex error: {0}")] - ZkRegex(#[from] ExtractSubstrssError), - #[error("Database error: {0}")] - Database(#[from] DatabaseError), - #[error("Not found: {0}")] - NotFound(String), - #[error("Circuit error: {0}")] - Circuit(String), - #[error("Chain error: {0}")] - Chain(#[from] ChainError), - #[error("File not found error: {0}")] - FileNotFound(String), - #[error("Render error: {0}")] - Render(#[from] RenderError), - #[error("Failed to send email: {0}")] - Send(String), - #[error("Hex error: {0}")] - HexError(#[from] hex::FromHexError), - #[error("ABI encode error: {0}")] - AbiError(String), - // Currently used with some relayer-utils errors - #[error("Anyhow error: {0}")] - Anyhow(#[from] anyhow::Error), -} - -/// Custom error type for blockchain-related errors -#[derive(Error, Debug)] -pub enum ChainError { - #[error("Contract error: {0}")] - Contract(ContractErrorWrapper), - #[error("Signer middleware error: {0}")] - SignerMiddleware(SignerMiddlewareErrorWrapper), - #[error("Hex error: {0}")] - HexError(#[from] FromHexError), - #[error("Provider error: {0}")] - Provider(ProviderErrorWrapper), - #[error("Anyhow error: {0}")] - Anyhow(#[from] anyhow::Error), - #[error("Validation error: {0}")] - Validation(String), -} - -impl ChainError { - pub fn contract_error(msg: &str, err: ContractError) -> Self { - Self::Contract(ContractErrorWrapper::new(msg.to_string(), err)) - } - - pub fn signer_middleware_error( - msg: &str, - err: signer::SignerMiddlewareError, - ) -> Self { - Self::SignerMiddleware(SignerMiddlewareErrorWrapper::new(msg.to_string(), err)) - } - - pub fn provider_error(msg: &str, err: ethers::providers::ProviderError) -> Self { - Self::Provider(ProviderErrorWrapper::new(msg.to_string(), err)) - } -} - -/// Custom error type for database-related errors -#[derive(Debug, thiserror::Error)] -#[error("{msg}: {source}")] -pub struct DatabaseError { - #[source] - pub source: sqlx::Error, - pub msg: String, -} - -impl DatabaseError { - pub fn new(msg: &str, source: sqlx::Error) -> Self { - Self { - source, - msg: msg.to_string(), - } - } -} - -/// Wrapper for contract-related errors -#[derive(Debug)] -pub struct ContractErrorWrapper { - msg: String, - source: String, -} - -impl std::fmt::Display for ContractErrorWrapper { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}: {}", self.msg, self.source) - } -} - -impl ContractErrorWrapper { - pub fn new(msg: String, err: ContractError) -> Self { - ContractErrorWrapper { - msg, - source: err.to_string(), - } - } -} - -/// Wrapper for signer middleware-related errors -#[derive(Debug)] -pub struct SignerMiddlewareErrorWrapper { - msg: String, - source: String, -} - -impl std::fmt::Display for SignerMiddlewareErrorWrapper { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}: {}", self.msg, self.source) - } -} - -impl SignerMiddlewareErrorWrapper { - pub fn new( - msg: String, - err: signer::SignerMiddlewareError, - ) -> Self { - SignerMiddlewareErrorWrapper { - msg, - source: err.to_string(), - } - } -} - -/// Wrapper for provider-related errors -#[derive(Debug)] -pub struct ProviderErrorWrapper { - msg: String, - source: ethers::providers::ProviderError, -} - -impl std::fmt::Display for ProviderErrorWrapper { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}: {}", self.msg, self.source) - } -} - -impl ProviderErrorWrapper { - pub fn new(msg: String, err: ethers::providers::ProviderError) -> Self { - ProviderErrorWrapper { msg, source: err } - } -} - -impl ApiError { - pub fn database_error(msg: &str, source: sqlx::Error) -> Self { - Self::Database(DatabaseError::new(msg, source)) - } -} - -impl IntoResponse for ApiError { - fn into_response(self) -> Response { - let (status, error_message) = match self { - ApiError::Database(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - ApiError::Chain(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - ApiError::SqlxError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - ApiError::Validation(e) => (StatusCode::BAD_REQUEST, e.to_string()), - ApiError::Anyhow(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - ApiError::Internal(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - ApiError::Email(e) => match e { - EmailError::Body(e) => (StatusCode::BAD_REQUEST, e.to_string()), - EmailError::EmailAddress(e) => (StatusCode::BAD_REQUEST, e.to_string()), - EmailError::Parse(e) => (StatusCode::BAD_REQUEST, e.to_string()), - EmailError::NotFound(e) => (StatusCode::BAD_REQUEST, e.to_string()), - EmailError::Dkim(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - EmailError::ZkRegex(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - EmailError::Database(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - EmailError::HexError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - EmailError::AbiError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - EmailError::Circuit(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - EmailError::Chain(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - EmailError::FileNotFound(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - EmailError::Render(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - EmailError::Send(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - EmailError::Anyhow(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()), - }, - }; - (status, Json(json!({ "error": error_message }))).into_response() - } -} diff --git a/packages/relayer/src/modules/web_server/rest_api.rs b/packages/relayer/src/modules/web_server/rest_api.rs deleted file mode 100644 index e17988fe..00000000 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ /dev/null @@ -1,618 +0,0 @@ -use crate::*; -use anyhow::Result; -use axum::Json; -use hex::decode; -use rand::Rng; -use relayer_utils::{ - calculate_account_salt, extract_template_vals_from_command, TemplateValue, LOG, -}; -use serde::{Deserialize, Serialize}; -use std::str; - -/// Retrieves the status of a request. -/// -/// # Arguments -/// -/// * `payload` - A JSON payload containing the request ID. -/// -/// # Returns -/// -/// A `Result` containing a JSON `RequestStatusResponse` or an `ApiError`. -pub async fn request_status_api( - Json(payload): Json, -) -> Result, ApiError> { - let row = DB.get_request(payload.request_id).await?; - - // Determine the status based on the retrieved row - let status = if let Some(ref row) = row { - if row.is_processed { - RequestStatus::Processed - } else { - RequestStatus::Pending - } - } else { - RequestStatus::NotExist - }; - - Ok(Json(RequestStatusResponse { - request_id: payload.request_id, - status, - is_success: row - .as_ref() - .map_or(false, |r| r.is_success.unwrap_or(false)), - email_nullifier: row.clone().and_then(|r| r.email_nullifier), - account_salt: row.clone().and_then(|r| r.account_salt), - })) -} - -/// Handles an acceptance request for a wallet. -/// -/// # Arguments -/// -/// * `payload` - A JSON payload containing the acceptance request details. -/// -/// # Returns -/// -/// A `Result` containing a JSON `AcceptanceResponse` or an `ApiError`. -pub async fn handle_acceptance_request( - Json(payload): Json, -) -> Result, ApiError> { - let command_template = CLIENT - .get_acceptance_command_templates(&payload.controller_eth_addr, payload.template_idx) - .await?; - - // Extract and validate command parameters - let command_params = extract_template_vals_from_command(&payload.command, command_template) - .map_err(|_| ApiError::Validation("Invalid command".to_string()))?; - - // Recover the account address - let account_eth_addr = CLIENT - .get_recovered_account_from_acceptance_command( - &payload.controller_eth_addr, - command_params.clone(), - payload.template_idx, - ) - .await?; - - let account_eth_addr = format!("0x{:x}", account_eth_addr); - - // Check if the wallet is deployed - if !CLIENT.is_wallet_deployed(&account_eth_addr).await? { - return Err(ApiError::Validation("Wallet not deployed".to_string())); - } - - // Check if the account code is already used - if let Ok(Some(creds)) = DB.get_credentials(&payload.account_code).await { - return Err(ApiError::Validation( - "Account code already used".to_string(), - )); - } - - // Generate a unique request ID - let mut request_id = rand::thread_rng().gen::(); - while let Ok(Some(request)) = DB.get_request(request_id).await { - request_id = rand::thread_rng().gen::(); - } - - let account_salt = calculate_account_salt(&payload.guardian_email_addr, &payload.account_code); - - DB.insert_request(&Request { - request_id, - account_eth_addr: account_eth_addr.clone(), - controller_eth_addr: payload.controller_eth_addr.clone(), - guardian_email_addr: payload.guardian_email_addr.clone(), - is_for_recovery: false, - template_idx: payload.template_idx, - is_processed: false, - is_success: None, - email_nullifier: None, - account_salt: Some(account_salt.clone()), - }) - .await?; - - // Handle different scenarios based on guardian status - if DB - .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) - .await? - { - handle_email_event(EmailAuthEvent::GuardianAlreadyExists { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - }) - .await - // TODO: Add custom errors for handle_email_events and map_err - .expect("Failed to send GuardianAlreadyExists event"); - } else if DB - .is_wallet_and_email_registered(&account_eth_addr, &payload.guardian_email_addr) - .await? - { - // Update credentials and send acceptance request email - DB.update_credentials_of_wallet_and_email(&Credentials { - account_code: payload.account_code.clone(), - account_eth_addr: account_eth_addr.clone(), - guardian_email_addr: payload.guardian_email_addr.clone(), - is_set: false, - }) - .await?; - - handle_email_event(EmailAuthEvent::AcceptanceRequest { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - request_id, - command: payload.command.clone(), - account_code: payload.account_code.clone(), - }) - .await?; - } else { - // Insert new credentials and send acceptance request email - DB.insert_credentials(&Credentials { - account_code: payload.account_code.clone(), - account_eth_addr: account_eth_addr.clone(), - guardian_email_addr: payload.guardian_email_addr.clone(), - is_set: false, - }) - .await?; - - handle_email_event(EmailAuthEvent::AcceptanceRequest { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - request_id, - command: payload.command.clone(), - account_code: payload.account_code.clone(), - }) - .await?; - } - - Ok(Json(AcceptanceResponse { - request_id, - command_params, - })) -} - -/// Handles a recovery request for a wallet. -/// -/// # Arguments -/// -/// * `payload` - A JSON payload containing the recovery request details. -/// -/// # Returns -/// -/// A `Result` containing a JSON `RecoveryResponse` or an `ApiError`. -pub async fn handle_recovery_request( - Json(payload): Json, -) -> Result, ApiError> { - // Fetch the command template - let command_template = CLIENT - .get_recovery_command_templates(&payload.controller_eth_addr, payload.template_idx) - .await?; - - // Extract and validate command parameters - let command_params = extract_template_vals_from_command(&payload.command, command_template) - .map_err(|_| ApiError::Validation("Invalid command".to_string()))?; - - // Recover the account address - let account_eth_addr = CLIENT - .get_recovered_account_from_recovery_command( - &payload.controller_eth_addr, - command_params.clone(), - payload.template_idx, - ) - .await?; - - let account_eth_addr = format!("0x{:x}", account_eth_addr); - - // Check if the wallet is deployed - if !CLIENT.is_wallet_deployed(&account_eth_addr).await? { - return Err(ApiError::Validation("Wallet not deployed".to_string())); - } - - // Generate a unique request ID - let mut request_id = rand::thread_rng().gen::(); - while let Ok(Some(request)) = DB.get_request(request_id).await { - request_id = rand::thread_rng().gen::(); - } - - // Fetch account details and calculate account salt - let account = DB - .get_credentials_from_wallet_and_email(&account_eth_addr, &payload.guardian_email_addr) - .await?; - - let account_salt = if let Some(account_details) = account { - calculate_account_salt(&payload.guardian_email_addr, &account_details.account_code) - } else { - return Err(ApiError::Validation("Wallet not deployed".to_string())); - }; - - // Handle the case when wallet and email are not registered - if !DB - .is_wallet_and_email_registered(&account_eth_addr, &payload.guardian_email_addr) - .await? - { - DB.insert_request(&Request { - request_id, - account_eth_addr: account_eth_addr.clone(), - controller_eth_addr: payload.controller_eth_addr.clone(), - guardian_email_addr: payload.guardian_email_addr.clone(), - is_for_recovery: true, - template_idx: payload.template_idx, - is_processed: false, - is_success: None, - email_nullifier: None, - account_salt: Some(account_salt.clone()), - }) - .await?; - - handle_email_event(EmailAuthEvent::GuardianNotRegistered { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - command: payload.command.clone(), - request_id, - }) - .await?; - - return Ok(Json(RecoveryResponse { - request_id, - command_params, - })); - } - - // Insert the recovery request - DB.insert_request(&Request { - request_id, - account_eth_addr: account_eth_addr.clone(), - controller_eth_addr: payload.controller_eth_addr.clone(), - guardian_email_addr: payload.guardian_email_addr.clone(), - is_for_recovery: true, - template_idx: payload.template_idx, - is_processed: false, - is_success: None, - email_nullifier: None, - account_salt: Some(account_salt.clone()), - }) - .await?; - - // Handle different scenarios based on guardian status - if DB - .is_guardian_set(&account_eth_addr, &payload.guardian_email_addr) - .await? - { - handle_email_event(EmailAuthEvent::RecoveryRequest { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - request_id, - command: payload.command.clone(), - }) - .await - // TODO: Add custom error for handle_email_event - .expect("Failed to send Recovery event"); - } else { - handle_email_event(EmailAuthEvent::GuardianNotSet { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - }) - .await - // TODO: Add error handling - .expect("Failed to send Recovery event"); - } - - Ok(Json(RecoveryResponse { - request_id, - command_params, - })) -} - -/// Handles the completion of a recovery request. -/// -/// # Arguments -/// -/// * `payload` - A JSON payload containing the complete recovery request details. -/// -/// # Returns -/// -/// A `Result` containing a `String` message or an `ApiError`. -pub async fn handle_complete_recovery_request( - Json(payload): Json, -) -> Result { - // Check if the wallet is deployed - if !CLIENT.is_wallet_deployed(&payload.account_eth_addr).await? { - return Err(ApiError::Validation("Wallet not deployed".to_string())); - } - - // Attempt to complete the recovery - match CLIENT - .complete_recovery( - &payload.controller_eth_addr, - &payload.account_eth_addr, - &payload.complete_calldata, - ) - .await - { - Ok(true) => Ok("Recovery completed".to_string()), - Ok(false) => Err(ApiError::Validation("Recovery failed".to_string())), - Err(e) => { - // Parse the error message if it follows the known format - let error_message = if e - .to_string() - .starts_with("Contract call reverted with data:") - { - parse_error_message(e.to_string()) - } else { - "Internal server error".to_string() - }; - // Remove all non printable characters - let error_message = error_message - .chars() - .filter(|c| c.is_ascii()) - .collect::(); - Err(ApiError::Internal(error_message)) - } - } -} - -/// Retrieves the account salt for a given email address and account code. -/// -/// # Arguments -/// -/// * `payload` - A JSON payload containing the email address and account code. -/// -/// # Returns -/// -/// A `Result` containing the account salt as a `String` or an `ApiError`. -pub async fn get_account_salt( - Json(payload): Json, -) -> Result { - let account_salt = calculate_account_salt(&payload.email_addr, &payload.account_code); - Ok(account_salt) -} - -/// Marks a guardian as inactive for a given wallet. -/// -/// # Arguments -/// -/// * `payload` - A JSON payload containing the account and controller Ethereum addresses. -/// -/// # Returns -/// -/// A `Result` containing a `String` message or an `ApiError`. -pub async fn inactive_guardian( - Json(payload): Json, -) -> Result { - // Check if the wallet is activated - let is_activated = CLIENT - .get_is_activated(&payload.controller_eth_addr, &payload.account_eth_addr) - .await?; - - if is_activated { - return Ok("Wallet is activated".to_string()); - } - - trace!(LOG, "Inactive guardian"; "is_activated" => is_activated); - - // Parse and format the account Ethereum address - let account_eth_addr: Address = payload - .account_eth_addr - .parse() - .map_err(|e| ApiError::Validation(format!("Failed to parse account_eth_addr: {}", e)))?; - let account_eth_addr = format!("0x{:x}", &account_eth_addr); - trace!(LOG, "Inactive guardian"; "account_eth_addr" => &account_eth_addr); - - // Update the credentials of the inactive guardian - DB.update_credentials_of_inactive_guardian(false, &account_eth_addr) - .await?; - - Ok("Guardian inactivated".to_string()) -} - -/// Parses an error message from contract call data. -/// -/// # Arguments -/// -/// * `error_data` - The error data as a `String`. -/// -/// # Returns -/// -/// A `String` containing the parsed error message or a default error message. -fn parse_error_message(error_data: String) -> String { - // Attempt to extract and decode the error message - if let Some(hex_error) = error_data.split(" ").last() { - if hex_error.len() > 138 { - // Check if the length is sufficient for a message - let error_bytes = decode(&hex_error[138..]).unwrap_or_else(|_| vec![]); - if let Ok(message) = str::from_utf8(&error_bytes) { - return message.to_string(); - } - } - } - format!("Failed to parse contract error: {}", error_data) -} - -/// Receives and processes an email. -/// -/// # Arguments -/// -/// * `email` - The raw email as a `String`. -/// -/// # Returns -/// -/// A `Result` containing `()` or an `ApiError`. -pub async fn receive_email_api_fn(email: String) -> Result<(), ApiError> { - let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; - let from_addr = parsed_email.get_from_addr()?; - let original_subject = parsed_email.get_subject_all()?; - tokio::spawn(async move { - if !check_is_valid_request(&parsed_email).await.unwrap() { - trace!(LOG, "Got a non valid email request. Ignoring."); - return; - } - - // Send acknowledgment email - match handle_email_event(EmailAuthEvent::Ack { - email_addr: from_addr.clone(), - command: parsed_email.get_command(false).unwrap_or_default(), - original_message_id: parsed_email.get_message_id().ok(), - original_subject, - }) - .await - { - Ok(_) => { - trace!(LOG, "Ack email event sent"); - } - Err(e) => { - error!(LOG, "Error handling email event: {:?}", e); - } - } - - // Process the email - match handle_email(email.clone()).await { - Ok(event) => match handle_email_event(event).await { - Ok(_) => {} - Err(e) => { - error!(LOG, "Error handling email event: {:?}", e); - } - }, - Err(e) => { - error!(LOG, "Error handling email: {:?}", e); - let original_subject = parsed_email - .get_subject_all() - .unwrap_or("Unknown Error".to_string()); - match handle_email_event(EmailAuthEvent::Error { - email_addr: from_addr, - error: e.to_string(), - original_subject, - original_message_id: parsed_email.get_message_id().ok(), - }) - .await - { - Ok(_) => {} - Err(e) => { - error!(LOG, "Error handling email event: {:?}", e); - } - } - } - } - }); - Ok(()) -} - -/// Request status request structure. -#[derive(Serialize, Deserialize)] -pub struct RequestStatusRequest { - /// The unique identifier for the request. - pub request_id: u32, -} - -/// Enum representing the possible statuses of a request. -#[derive(Serialize, Deserialize)] -pub enum RequestStatus { - /// The request does not exist. - NotExist = 0, - /// The request is pending processing. - Pending = 1, - /// The request has been processed. - Processed = 2, -} - -/// Response structure for a request status query. -#[derive(Serialize, Deserialize)] -pub struct RequestStatusResponse { - /// The unique identifier for the request. - pub request_id: u32, - /// The current status of the request. - pub status: RequestStatus, - /// Indicates whether the request was successful. - pub is_success: bool, - /// The email nullifier, if available. - pub email_nullifier: Option, - /// The account salt, if available. - pub account_salt: Option, -} - -/// Request structure for an acceptance request. -#[derive(Serialize, Deserialize)] -pub struct AcceptanceRequest { - /// The Ethereum address of the controller. - pub controller_eth_addr: String, - /// The email address of the guardian. - pub guardian_email_addr: String, - /// The unique account code. - pub account_code: String, - /// The index of the template to use. - pub template_idx: u64, - /// The command to execute. - pub command: String, -} - -/// Response structure for an acceptance request. -#[derive(Serialize, Deserialize)] -pub struct AcceptanceResponse { - /// The unique identifier for the request. - pub request_id: u32, - /// The parameters extracted from the command. - pub command_params: Vec, -} - -/// Request structure for a recovery request. -#[derive(Serialize, Deserialize, Debug)] -pub struct RecoveryRequest { - /// The Ethereum address of the controller. - pub controller_eth_addr: String, - /// The email address of the guardian. - pub guardian_email_addr: String, - /// The index of the template to use. - pub template_idx: u64, - /// The command to execute. - pub command: String, -} - -/// Response structure for a recovery request. -#[derive(Serialize, Deserialize)] -pub struct RecoveryResponse { - /// The unique identifier for the request. - pub request_id: u32, - /// The parameters extracted from the command. - pub command_params: Vec, -} - -/// Request structure for completing a recovery. -#[derive(Serialize, Deserialize)] -pub struct CompleteRecoveryRequest { - /// The Ethereum address of the account to recover. - pub account_eth_addr: String, - /// The Ethereum address of the controller. - pub controller_eth_addr: String, - /// The calldata to complete the recovery. - pub complete_calldata: String, -} - -/// Request structure for retrieving an account salt. -#[derive(Serialize, Deserialize)] -pub struct GetAccountSaltRequest { - /// The unique account code. - pub account_code: String, - /// The email address associated with the account. - pub email_addr: String, -} - -/// Structure representing a permitted wallet. -#[derive(Deserialize)] -struct PermittedWallet { - /// The name of the wallet. - wallet_name: String, - /// The Ethereum address of the controller. - controller_eth_addr: String, - /// The hash of the bytecode of the proxy contract. - hash_of_bytecode_of_proxy: String, - /// The address of the implementation contract. - impl_contract_address: String, - /// The slot location in storage. - slot_location: String, -} - -/// Request structure for marking a guardian as inactive. -#[derive(Serialize, Deserialize)] -pub struct InactiveGuardianRequest { - /// The Ethereum address of the account. - pub account_eth_addr: String, - /// The Ethereum address of the controller. - pub controller_eth_addr: String, -} diff --git a/packages/relayer/src/modules/web_server/server.rs b/packages/relayer/src/modules/web_server/server.rs deleted file mode 100644 index b8f371c3..00000000 --- a/packages/relayer/src/modules/web_server/server.rs +++ /dev/null @@ -1,63 +0,0 @@ -use crate::*; -use axum::{routing::post, Router}; -use relayer_utils::LOG; -use tower_http::cors::{AllowHeaders, AllowMethods, Any, CorsLayer}; - -/// Runs the server and sets up the API routes. -/// -/// # Returns -/// -/// A `Result` indicating success or failure. -pub async fn run_server() -> Result<()> { - let addr = WEB_SERVER_ADDRESS.get().unwrap(); - - // Initialize the global DB ref before starting the server - DB_CELL - .get_or_init(|| async { - dotenv::dotenv().ok(); - let db = Database::open(&std::env::var("DATABASE_URL").unwrap()) - .await - .unwrap(); - Arc::new(db) - }) - .await; - - info!(LOG, "Testing connection to database"); - if let Err(e) = DB.test_db_connection().await { - error!(LOG, "Failed to initialize db with e: {}", e); - panic!("Forcing panic, since connection to DB could not be established"); - }; - info!(LOG, "Testing connection to database successfull"); - - // Initialize the API routes - let mut app = Router::new() - .route( - "/api/echo", - axum::routing::get(move || async move { "Hello, world!" }), - ) - .route("/api/requestStatus", post(request_status_api)) - .route("/api/acceptanceRequest", post(handle_acceptance_request)) - .route("/api/recoveryRequest", post(handle_recovery_request)) - .route( - "/api/completeRequest", - post(handle_complete_recovery_request), - ) - .route("/api/getAccountSalt", post(get_account_salt)) - .route("/api/inactiveGuardian", post(inactive_guardian)) - .route("/api/receiveEmail", post(receive_email_api_fn)); - - app = app.layer( - CorsLayer::new() - .allow_methods(AllowMethods::any()) - .allow_headers(AllowHeaders::any()) - .allow_origin(Any), - ); - - // Start the server - trace!(LOG, "Listening API at {}", addr); - axum::Server::bind(&addr.parse()?) - .serve(app.into_make_service()) - .await?; - - Ok(()) -} diff --git a/packages/relayer/src/permitted_wallets.json b/packages/relayer/src/permitted_wallets.json deleted file mode 100644 index 62a4f532..00000000 --- a/packages/relayer/src/permitted_wallets.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "wallet_name": "Safe (Base Sepolia)", - "hash_of_bytecode_of_proxy": "0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000", - "impl_contract_address": "0xfb1bffC9d739B8D520DaF37dF666da4C687191EA", - "slot_location": "0" - } -] diff --git a/packages/relayer/src/regex_json/request_def.json b/packages/relayer/src/regex_json/request_def.json deleted file mode 100644 index a80ca582..00000000 --- a/packages/relayer/src/regex_json/request_def.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "parts": [ - { - "is_public": false, - "regex_def": "Your request ID is #" - }, - { - "is_public": true, - "regex_def": "[0-9]+" - }, - { - "is_public": false, - "regex_def": "." - } - ] -} diff --git a/packages/relayer/src/regex_json/selector_def.json b/packages/relayer/src/regex_json/selector_def.json deleted file mode 100644 index 609b00e1..00000000 --- a/packages/relayer/src/regex_json/selector_def.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "parts": [ - { - "is_public": false, - "regex_def": "((\r\n)|^)dkim-signature:" - }, - { - "is_public": false, - "regex_def": "((a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)+=[^;]+; )+s=" - }, - { - "is_public": true, - "regex_def": "(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|-|_)+" - }, - { - "is_public": false, - "regex_def": ";" - } - ] -} \ No newline at end of file diff --git a/packages/relayer/src/route.rs b/packages/relayer/src/route.rs new file mode 100644 index 00000000..ea13578e --- /dev/null +++ b/packages/relayer/src/route.rs @@ -0,0 +1,17 @@ +use std::sync::Arc; + +use axum::{ + routing::{get, post}, + Router, +}; + +use crate::{handler::health_checker_handler, RelayerState}; + +pub fn create_router(relayer_state: Arc) -> Router { + Router::new() + .route("/api/healthz", get(health_checker_handler)) + // .route("/api/status/:id", get(get_status_handler)) + // .route("/api/submit/", post(submit_handler)) + // .route("/api/addDKIMKey", post(add_dkim_key_handler)) + .with_state(relayer_state) +} diff --git a/packages/relayer/src/strings.rs b/packages/relayer/src/strings.rs deleted file mode 100644 index b9db6720..00000000 --- a/packages/relayer/src/strings.rs +++ /dev/null @@ -1,37 +0,0 @@ -// Config strings -pub const SMTP_SERVER_KEY: &str = "SMTP_SERVER"; -pub const RELAYER_EMAIL_ADDR_KEY: &str = "RELAYER_EMAIL_ADDR"; -pub const DATABASE_PATH_KEY: &str = "DATABASE_URL"; -pub const WEB_SERVER_ADDRESS_KEY: &str = "WEB_SERVER_ADDRESS"; -pub const PROVER_ADDRESS_KEY: &str = "PROVER_ADDRESS"; -pub const CHAIN_RPC_PROVIDER_KEY: &str = "CHAIN_RPC_PROVIDER"; -pub const CHAIN_RPC_EXPLORER_KEY: &str = "CHAIN_RPC_EXPLORER"; -pub const PRIVATE_KEY_KEY: &str = "PRIVATE_KEY"; -pub const CHAIN_ID_KEY: &str = "CHAIN_ID"; -pub const EMAIL_ACCOUNT_RECOVERY_VERSION_ID_KEY: &str = "EMAIL_ACCOUNT_RECOVERY_VERSION_ID"; -pub const EMAIL_TEMPLATES_PATH_KEY: &str = "EMAIL_TEMPLATES_PATH"; -pub const REGEX_JSON_DIR_PATH_KEY: &str = "REGEX_JSON_DIR_PATH"; - -// Log strings -pub const JSON_LOGGER_KEY: &str = "JSON_LOGGER"; - -// Error strings -pub const WRONG_AUTH_METHOD: &str = "Not supported auth type"; -pub const IMAP_RECONNECT_ERROR: &str = "Failed to reconnect"; -pub const SMTP_RECONNECT_ERROR: &str = "Failed to reconnect"; -pub const CANNOT_GET_EMAIL_FROM_QUEUE: &str = "Cannot get email from mpsc in handle email task"; -pub const NOT_MY_SENDER: &str = "NOT_MY_SENDER"; -pub const WRONG_COMMAND_FORMAT: &str = "Wrong command format"; - -// Core REGEX'es and Commands -pub const STRING_REGEX: &str = r"\S+"; -pub const UINT_REGEX: &str = r"\d+"; -pub const INT_REGEX: &str = r"-?\d+"; -pub const ETH_ADDR_REGEX: &str = r"0x[a-fA-F0-9]{40}"; -pub const DECIMALS_REGEX: &str = r"\d+\.\d+"; -pub const SHA_PRECOMPUTE_SELECTOR: &str = r#"(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?\"(=\r\n)?[^\"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^\"]*(=\r\n)?\"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?([^<>\/]+)(<(=\r\n)?\/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>(=\r\n)?)"#; - -// DKIM ORACLE ARGS -pub const CANISTER_ID_KEY: &str = "CANISTER_ID"; -pub const PEM_PATH_KEY: &str = "PEM_PATH"; -pub const IC_REPLICA_URL_KEY: &str = "IC_REPLICA_URL"; From cfa32e9c2f3dd720af91c37be66aa8824d3c757c Mon Sep 17 00:00:00 2001 From: Shubham Gupta Date: Wed, 9 Oct 2024 08:15:22 +0700 Subject: [PATCH 108/121] chore: Add generic email templates --- .../acknowledgement_template.html | 250 +++++++++++++++++ .../email_templates/command_template.html | 260 ++++++++++++++++++ .../email_templates/completion_template.html | 252 +++++++++++++++++ .../email_templates/error_template.html | 251 +++++++++++++++++ 4 files changed, 1013 insertions(+) create mode 100644 packages/relayer/email_templates/acknowledgement_template.html create mode 100644 packages/relayer/email_templates/command_template.html create mode 100644 packages/relayer/email_templates/completion_template.html create mode 100644 packages/relayer/email_templates/error_template.html diff --git a/packages/relayer/email_templates/acknowledgement_template.html b/packages/relayer/email_templates/acknowledgement_template.html new file mode 100644 index 00000000..6c720aa7 --- /dev/null +++ b/packages/relayer/email_templates/acknowledgement_template.html @@ -0,0 +1,250 @@ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +
+ Hi, {{userEmailAddr}}! +
+ We have received your following request: {{request}} +
+

+ Cheers,
The ZK Email Team +

+
+ + + + + + +
+

+ Powered by + ZK Email +

+ + + + + + + +
+ + + + + + + +
+
+
+ + diff --git a/packages/relayer/email_templates/command_template.html b/packages/relayer/email_templates/command_template.html new file mode 100644 index 00000000..e3ca9232 --- /dev/null +++ b/packages/relayer/email_templates/command_template.html @@ -0,0 +1,260 @@ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +
+ Hi, {{userEmailAddr}}! +
+ {{body}} +
+
+ Reply "Confirm" to this email to accept the request. + Your request ID is #{{requestId}}. + +

+ If you did not initiate this request, please contact us immediately. + + +
+

+ Cheers,
The ZK Email Team +

+
+ + + + + + +
+

+ Powered by + ZK Email +

+ + + + + + + +
+ + + + + + + +
+
+
+
{{command}}
+ + diff --git a/packages/relayer/email_templates/completion_template.html b/packages/relayer/email_templates/completion_template.html new file mode 100644 index 00000000..3a4b2e97 --- /dev/null +++ b/packages/relayer/email_templates/completion_template.html @@ -0,0 +1,252 @@ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +
+ Hi, {{userEmailAddr}}! +
+ {{body}} +

+ Your request ID is #{{requestId}} is now complete. +
+

+ Cheers,
The ZK Email Team +

+
+ + + + + + +
+

+ Powered by + ZK Email +

+ + + + + + + +
+ + + + + + + +
+
+
+ + diff --git a/packages/relayer/email_templates/error_template.html b/packages/relayer/email_templates/error_template.html new file mode 100644 index 00000000..52893dda --- /dev/null +++ b/packages/relayer/email_templates/error_template.html @@ -0,0 +1,251 @@ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +
+ Hi, {{userEmailAddr}}! +
+ An error occurred while processing your request.
+ Error: {{error}} +
+

+ Cheers,
The ZK Email Team +

+
+ + + + + + +
+

+ Powered by + ZK Email +

+ + + + + + + +
+ + + + + + + +
+
+
+ + From 8391efd06343505013266879debfc96048c794f0 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Thu, 10 Oct 2024 06:38:19 +0700 Subject: [PATCH 109/121] feat: add smtp and imap interaction --- .gitignore | 6 +- Cargo.lock | 785 +++++++++++++----- packages/relayer/Cargo.toml | 9 +- packages/relayer/config.example.json | 6 +- .../email_templates/command_template.html | 2 +- .../migrations/20241008135456_init.down.sql | 5 + .../migrations/20241008135456_init.up.sql | 18 + packages/relayer/src/config.rs | 10 +- packages/relayer/src/db/mod.rs | 1 - packages/relayer/src/db/model.rs | 12 - packages/relayer/src/handler.rs | 148 +++- packages/relayer/src/mail.rs | 334 ++++++++ packages/relayer/src/main.rs | 9 +- packages/relayer/src/model.rs | 93 +++ packages/relayer/src/route.rs | 8 +- packages/relayer/src/schema.rs | 31 + packages/relayer/src/utils.rs | 12 + 17 files changed, 1268 insertions(+), 221 deletions(-) create mode 100644 packages/relayer/migrations/20241008135456_init.down.sql create mode 100644 packages/relayer/migrations/20241008135456_init.up.sql delete mode 100644 packages/relayer/src/db/mod.rs delete mode 100644 packages/relayer/src/db/model.rs create mode 100644 packages/relayer/src/mail.rs create mode 100644 packages/relayer/src/model.rs create mode 100644 packages/relayer/src/schema.rs create mode 100644 packages/relayer/src/utils.rs diff --git a/.gitignore b/.gitignore index 6c6e6de8..11170544 100644 --- a/.gitignore +++ b/.gitignore @@ -33,11 +33,7 @@ packages/contracts/deployments # Relayer target -packages/relayer/db/* -packages/relayer/*.db -packages/relayer/received_eml/*.eml -packages/relayer/received_eml/*.json -packages/relayer/proofs +packages/relayer/.sqlx/* packages/relayer/logs packages/relayer/config.json .ic.pem diff --git a/Cargo.lock b/Cargo.lock index ab3fd146..7eaf65d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,19 +14,13 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -94,9 +88,9 @@ checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -115,13 +109,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -144,6 +138,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "auto_impl" version = "1.2.0" @@ -152,14 +152,14 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" @@ -189,7 +189,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 1.0.1", "tokio", - "tower 0.5.1", + "tower", "tower-layer", "tower-service", "tracing", @@ -218,17 +218,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -368,9 +368,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" dependencies = [ "serde", ] @@ -430,9 +430,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.15" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "jobserver", "libc", @@ -579,9 +579,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" dependencies = [ "cfg-if", "cpufeatures", @@ -626,9 +626,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -761,7 +761,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -798,7 +798,7 @@ checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1141,10 +1141,10 @@ dependencies = [ "proc-macro2", "quote", "regex", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.77", + "syn 2.0.79", "toml", "walkdir", ] @@ -1162,7 +1162,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1188,7 +1188,7 @@ dependencies = [ "serde", "serde_json", "strum", - "syn 2.0.77", + "syn 2.0.79", "tempfile", "thiserror", "tiny-keccak", @@ -1203,7 +1203,7 @@ checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" dependencies = [ "chrono", "ethers-core", - "reqwest", + "reqwest 0.11.27", "semver 1.0.23", "serde", "serde_json", @@ -1228,7 +1228,7 @@ dependencies = [ "futures-locks", "futures-util", "instant", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror", @@ -1260,7 +1260,7 @@ dependencies = [ "jsonwebtoken", "once_cell", "pin-project", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror", @@ -1411,12 +1411,12 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] @@ -1436,6 +1436,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1463,9 +1478,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1478,9 +1493,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1488,15 +1503,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1516,9 +1531,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-locks" @@ -1532,26 +1547,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -1565,9 +1580,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1616,9 +1631,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -1661,7 +1676,26 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.5.0", + "indexmap 2.6.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -1671,7 +1705,7 @@ dependencies = [ [[package]] name = "halo2curves" version = "0.7.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#b753a832e92d5c86c5c997327a9cf9de86a18851" +source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#8771fe5a5d54fc03e74dbc8915db5dad3ab46a83" dependencies = [ "blake2", "digest", @@ -1697,7 +1731,7 @@ dependencies = [ [[package]] name = "halo2derive" version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#b753a832e92d5c86c5c997327a9cf9de86a18851" +source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#8771fe5a5d54fc03e74dbc8915db5dad3ab46a83" dependencies = [ "num-bigint", "num-integer", @@ -1707,6 +1741,20 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "handlebars" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25b617d1375ef96eeb920ae717e3da34a02fc979fe632c75128350f9e1f74a" +dependencies = [ + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1723,6 +1771,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + [[package]] name = "hashers" version = "1.0.1" @@ -1872,9 +1926,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1892,7 +1946,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -1915,6 +1969,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", + "h2 0.4.6", "http 1.1.0", "http-body 1.0.1", "httparse", @@ -1923,6 +1978,7 @@ dependencies = [ "pin-project-lite", "smallvec", "tokio", + "want", ] [[package]] @@ -1934,33 +1990,81 @@ dependencies = [ "futures-util", "http 0.2.12", "hyper 0.14.30", - "rustls", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "rustls 0.23.14", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.30", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "native-tls", "tokio", - "tokio-rustls", + "tokio-native-tls", + "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", + "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.1", "hyper 1.4.1", "pin-project-lite", + "socket2", "tokio", - "tower 0.4.13", "tower-service", + "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2056,12 +2160,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -2096,9 +2200,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" @@ -2178,9 +2282,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", @@ -2240,9 +2344,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libloading" @@ -2385,15 +2489,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.8.0" @@ -2415,6 +2510,23 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "neon" version = "0.10.1" @@ -2564,23 +2676,23 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "open-fastrlp" @@ -2607,6 +2719,50 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -2650,9 +2806,9 @@ dependencies = [ [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -2761,6 +2917,51 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d3a6e3394ec80feb3b6393c725571754c6188490265c61aaf260810d6b95aa0" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94429506bde1ca69d1b5601962c73f4172ab4726571a59ea95931218cb0e930e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "pest_meta" +version = "2.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac8a071862e93690b6e34e9a5fb8e33ff3734473ac0245b27232222c4906a33f" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "petgraph" version = "0.6.5" @@ -2768,7 +2969,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.5.0", + "indexmap 2.6.0", ] [[package]] @@ -2811,7 +3012,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2834,22 +3035,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2887,9 +3088,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "poseidon-rs" @@ -2931,7 +3132,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2959,9 +3160,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -3076,9 +3277,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -3096,9 +3297,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", @@ -3108,9 +3309,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -3119,9 +3320,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "relayer" @@ -3130,7 +3331,11 @@ dependencies = [ "anyhow", "axum", "chrono", + "ethers", + "handlebars", + "regex", "relayer-utils", + "reqwest 0.12.8", "serde", "serde_json", "slog", @@ -3143,7 +3348,6 @@ dependencies = [ [[package]] name = "relayer-utils" version = "0.3.7" -source = "git+https://github.com/zkemail/relayer-utils.git?branch=main#5764f93c4e803cba39c0f06f8ced0cab1d229a25" dependencies = [ "anyhow", "base64 0.21.7", @@ -3155,6 +3359,7 @@ dependencies = [ "hmac-sha256", "itertools 0.10.5", "lazy_static", + "mailparse", "neon", "num-bigint", "num-traits", @@ -3162,6 +3367,7 @@ dependencies = [ "poseidon-rs", "rand_core", "regex", + "reqwest 0.11.27", "rsa", "serde", "serde_json", @@ -3184,27 +3390,30 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.30", - "hyper-rustls", + "hyper-rustls 0.24.2", + "hyper-tls 0.5.0", "ipnet", "js-sys", "log", "mime", + "native-tls", "once_cell", "percent-encoding", "pin-project-lite", - "rustls", - "rustls-pemfile", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", - "system-configuration", + "system-configuration 0.5.1", "tokio", - "tokio-rustls", + "tokio-native-tls", + "tokio-rustls 0.24.1", "tower-service", "url", "wasm-bindgen", @@ -3214,6 +3423,49 @@ dependencies = [ "winreg", ] +[[package]] +name = "reqwest" +version = "0.12.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls 0.27.3", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 2.2.0", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "system-configuration 0.6.1", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + [[package]] name = "resolv-conf" version = "0.7.0" @@ -3340,9 +3592,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -3359,10 +3611,23 @@ checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring 0.17.8", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.23.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -3372,6 +3637,21 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -3382,6 +3662,17 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring 0.17.8", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -3436,6 +3727,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "schannel" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -3484,6 +3784,29 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "0.9.0" @@ -3548,7 +3871,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3575,9 +3898,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -3792,9 +4115,9 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" dependencies = [ "nom", "unicode_categories", @@ -3834,7 +4157,7 @@ dependencies = [ "hashbrown 0.14.5", "hashlink", "hex", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "memchr", "once_cell", @@ -3846,10 +4169,12 @@ dependencies = [ "smallvec", "sqlformat", "thiserror", + "time", "tokio", "tokio-stream", "tracing", "url", + "uuid 1.10.0", ] [[package]] @@ -3862,7 +4187,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3885,7 +4210,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.77", + "syn 2.0.79", "tempfile", "tokio", "url", @@ -3929,7 +4254,9 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror", + "time", "tracing", + "uuid 1.10.0", "whoami", ] @@ -3967,7 +4294,9 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror", + "time", "tracing", + "uuid 1.10.0", "whoami", ] @@ -3990,8 +4319,10 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", + "time", "tracing", "url", + "uuid 1.10.0", ] [[package]] @@ -4043,7 +4374,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4062,7 +4393,7 @@ dependencies = [ "fs2", "hex", "once_cell", - "reqwest", + "reqwest 0.11.27", "semver 1.0.23", "serde", "serde_json", @@ -4085,9 +4416,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -4116,6 +4447,9 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] [[package]] name = "system-configuration" @@ -4125,7 +4459,18 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation", - "system-configuration-sys", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys 0.6.0", ] [[package]] @@ -4138,6 +4483,16 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "take_mut" version = "0.2.2" @@ -4152,9 +4507,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -4176,22 +4531,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4285,7 +4640,17 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", ] [[package]] @@ -4294,15 +4659,26 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls 0.23.14", + "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -4317,18 +4693,18 @@ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", - "rustls", + "rustls 0.21.12", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tungstenite", "webpki-roots", ] [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -4360,32 +4736,17 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", "winnow", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - [[package]] name = "tower" version = "0.5.1" @@ -4448,7 +4809,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4534,7 +4895,7 @@ dependencies = [ "httparse", "log", "rand", - "rustls", + "rustls 0.21.12", "sha1", "thiserror", "url", @@ -4547,6 +4908,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "uint" version = "0.9.5" @@ -4567,36 +4934,36 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unicode_categories" @@ -4730,7 +5097,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-shared", ] @@ -4764,7 +5131,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4798,7 +5165,7 @@ checksum = "4b8220be1fa9e4c889b30fd207d4906657e7e90b12e0e6b0c8b8d8709f5de021" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4873,6 +5240,36 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -5023,9 +5420,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -5092,7 +5489,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index b46f4954..2675f1bd 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -8,13 +8,18 @@ anyhow = "1.0.89" axum = "0.7.7" serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" -sqlx = { version = "0.8.2", features = ["postgres", "runtime-tokio"] } +sqlx = { version = "0.8.2", features = ["postgres", "runtime-tokio", "migrate", "uuid", "time"] } tokio = { version = "1.40.0", features = ["full"] } tower-http = { version = "0.6.1", features = ["cors"] } -relayer-utils = { git = "https://github.com/zkemail/relayer-utils.git", branch = "main" } +# relayer-utils = { git = "https://github.com/zkemail/relayer-utils.git", branch = "main" } +relayer-utils = { path = "../../../relayer-utils" } slog = { version = "2.7.0", features = [ "max_level_trace", "release_max_level_warn", ] } uuid = { version = "1.10.0", features = ["serde", "v4"] } chrono = { version = "0.4.38", features = ["serde"] } +ethers = "2.0.14" +reqwest = { version = "0.12.8", features = ["json"] } +handlebars = "6.1.0" +regex = "1.11.0" diff --git a/packages/relayer/config.example.json b/packages/relayer/config.example.json index 415ec936..ce5da39f 100644 --- a/packages/relayer/config.example.json +++ b/packages/relayer/config.example.json @@ -1,10 +1,14 @@ { "port": 8000, "databaseUrl": "postgres://test@localhost:5432/relayer", + "smtpUrl": "http://localhost:3000", "proverUrl": "https://zkemail--email-auth-prover-v1-4-0-flask-app.modal.run", + "paths": { + "pem": "./.ic.pem", + "emailTemplates": "./email_templates" + }, "icp": { "canisterId": "q7eci-dyaaa-aaaak-qdbia-cai", - "pemPath": "./.ic.pem", "icReplicaUrl": "https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.icp0.io/?id=q7eci-dyaaa-aaaak-qdbia-cai" }, "chains": { diff --git a/packages/relayer/email_templates/command_template.html b/packages/relayer/email_templates/command_template.html index e3ca9232..91ad7ce2 100644 --- a/packages/relayer/email_templates/command_template.html +++ b/packages/relayer/email_templates/command_template.html @@ -126,7 +126,7 @@

Reply "Confirm" to this email to accept the request. - Your request ID is #{{requestId}}. + Your request ID is {{requestId}}.

If you did not initiate this request, please contact us immediately. diff --git a/packages/relayer/migrations/20241008135456_init.down.sql b/packages/relayer/migrations/20241008135456_init.down.sql new file mode 100644 index 00000000..2ff0f67a --- /dev/null +++ b/packages/relayer/migrations/20241008135456_init.down.sql @@ -0,0 +1,5 @@ +-- Add down migration script here + +DROP TABLE IF EXISTS requests; + +DROP TABLE IF EXISTS expected_replies; \ No newline at end of file diff --git a/packages/relayer/migrations/20241008135456_init.up.sql b/packages/relayer/migrations/20241008135456_init.up.sql new file mode 100644 index 00000000..bf18f5b3 --- /dev/null +++ b/packages/relayer/migrations/20241008135456_init.up.sql @@ -0,0 +1,18 @@ +-- Add up migration script here + +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +CREATE TYPE status_enum AS ENUM ('Request received', 'Email sent', 'Email response received', 'Proving', 'Performing on chain transaction', 'Finished'); + +CREATE TABLE IF NOT EXISTS requests ( + id UUID PRIMARY KEY NOT NULL DEFAULT (uuid_generate_v4()), + status status_enum NOT NULL DEFAULT 'Request received', + updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS expected_replies ( + message_id VARCHAR(255) PRIMARY KEY, + request_id VARCHAR(255), + has_reply BOOLEAN DEFAULT FALSE, + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); \ No newline at end of file diff --git a/packages/relayer/src/config.rs b/packages/relayer/src/config.rs index a1c191c9..05bf998b 100644 --- a/packages/relayer/src/config.rs +++ b/packages/relayer/src/config.rs @@ -10,17 +10,25 @@ use std::io::Read; pub struct Config { pub port: usize, pub database_url: String, + pub smtp_url: String, pub prover_url: String, + pub path: PathConfig, pub icp: IcpConfig, pub chains: HashMap, pub json_logger: bool, } +#[derive(Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct PathConfig { + pub pem: String, + pub email_templates: String, +} + #[derive(Deserialize, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct IcpConfig { pub canister_id: String, - pub pem_path: String, pub ic_replica_url: String, } diff --git a/packages/relayer/src/db/mod.rs b/packages/relayer/src/db/mod.rs deleted file mode 100644 index ee2d47ae..00000000 --- a/packages/relayer/src/db/mod.rs +++ /dev/null @@ -1 +0,0 @@ -mod model; diff --git a/packages/relayer/src/db/model.rs b/packages/relayer/src/db/model.rs deleted file mode 100644 index fe91c428..00000000 --- a/packages/relayer/src/db/model.rs +++ /dev/null @@ -1,12 +0,0 @@ -use serde::{Deserialize, Serialize}; -use sqlx::FromRow; -use uuid::Uuid; - -#[derive(Debug, FromRow, Deserialize, Serialize)] -#[allow(non_snake_case)] -pub struct RequestModel { - pub id: Uuid, - pub status: String, - #[serde(rename = "updatedAt")] - pub updated_at: Option>, -} diff --git a/packages/relayer/src/handler.rs b/packages/relayer/src/handler.rs index 98ea8958..7cbc431b 100644 --- a/packages/relayer/src/handler.rs +++ b/packages/relayer/src/handler.rs @@ -1,4 +1,19 @@ -use axum::{response::IntoResponse, Json}; +use std::sync::Arc; + +use axum::{extract::State, http::StatusCode, response::IntoResponse, Json}; +use regex::Regex; +use relayer_utils::{field_to_hex, ParsedEmail, LOG}; +use serde_json::{json, Value}; +use slog::info; +use uuid::Uuid; + +use crate::{ + mail::handle_email_event, + model::{create_request, update_request, RequestStatus}, + schema::EmailTxAuthSchema, + utils::parse_command_template, + RelayerState, +}; pub async fn health_checker_handler() -> impl IntoResponse { const MESSAGE: &str = "Hello from ZK Email!"; @@ -10,3 +25,134 @@ pub async fn health_checker_handler() -> impl IntoResponse { Json(json_response) } + +pub async fn submit_handler( + State(relayer_state): State>, + Json(body): Json, +) -> Result)> { + info!(LOG, "Payload: {:?}", body); + + let uuid = create_request(&relayer_state.db).await.map_err(|e| { + ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(json!({"error": e.to_string()})), + ) + })?; + + let command = parse_command_template(&body.command_template, &body.command_params); + + let account_code = if body.code_exists_in_email { + let hex_code = field_to_hex(&body.account_code.clone().0); + Some(hex_code.trim_start_matches("0x").to_string()) + } else { + None + }; + + handle_email_event( + crate::mail::EmailEvent::Command { + request_id: uuid, + email_address: body.email_address.clone(), + command, + account_code, + subject: body.subject.clone(), + body: body.body.clone(), + }, + (*relayer_state).clone(), + ) + .await + .map_err(|e| { + // Convert the error to the desired type + ( + reqwest::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(json!({"error": e.to_string()})), + ) + })?; + + let response = json!({ + "status": "success", + "message": "email sent", + "request_id": uuid + }); + + return Ok((StatusCode::OK, Json(response))); +} + +pub async fn receive_email_handler( + State(relayer_state): State>, + body: String, +) -> Result)> { + // Define the regex pattern for UUID + let uuid_regex = Regex::new( + r"\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b", + ) + .unwrap(); + + // Attempt to find a UUID in the body + let request_id = uuid_regex.find(&body).map(|m| m.as_str()); + + match request_id { + Some(request_id) => { + info!(LOG, "Extracted UUID: {:?}", request_id); + } + None => { + info!(LOG, "No UUID found in the body"); + // Handle the case where no UUID is found + let response = json!({ + "status": "error", + "message": "No UUID found in the email body", + }); + return Ok((StatusCode::BAD_REQUEST, Json(response))); + } + } + + let request_id = request_id + .ok_or_else(|| { + ( + reqwest::StatusCode::BAD_REQUEST, + axum::Json(json!({"error": "Request ID is None"})), + ) + }) + .and_then(|id| { + id.parse::().map_err(|_| { + ( + reqwest::StatusCode::BAD_REQUEST, + axum::Json(json!({"error": "Failed to parse request ID"})), + ) + }) + })?; + + update_request( + &relayer_state.db, + request_id, + RequestStatus::EmailResponseReceived, + ) + .await + .map_err(|e| { + // Convert the error to the expected type + ( + reqwest::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(json!({"error": e.to_string()})), + ) + })?; + + // Log the received body + info!(LOG, "Received email body: {:?}", body); + + let parsed_email = ParsedEmail::new_from_raw_email(&body).await.map_err(|e| { + // Convert the error to the expected type + ( + reqwest::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(json!({"error": e.to_string()})), + ) + })?; + + // Process the body as needed + // For example, you might want to parse it or pass it to another function + + let response = json!({ + "status": "success", + "message": "email received", + }); + + Ok((StatusCode::OK, Json(response))) +} diff --git a/packages/relayer/src/mail.rs b/packages/relayer/src/mail.rs new file mode 100644 index 00000000..4ca859a1 --- /dev/null +++ b/packages/relayer/src/mail.rs @@ -0,0 +1,334 @@ +use std::path::PathBuf; + +use anyhow::Result; +use handlebars::Handlebars; +use relayer_utils::ParsedEmail; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use sqlx::PgPool; +use tokio::fs::read_to_string; +use uuid::Uuid; + +use crate::{ + config::PathConfig, + model::{insert_expected_reply, is_valid_reply, update_request, RequestStatus}, + RelayerState, +}; + +/// Represents an email message to be sent. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct EmailMessage { + pub to: String, + pub subject: String, + pub reference: Option, + pub reply_to: Option, + pub body_plain: String, + pub body_html: String, + pub body_attachments: Option>, +} + +/// Represents an attachment in an email message. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct EmailAttachment { + pub inline_id: String, + pub content_type: String, + pub contents: Vec, +} + +/// Represents different types of email events. +#[derive(Debug, Clone)] +pub enum EmailEvent { + Command { + request_id: Uuid, + email_address: String, + command: String, + account_code: Option, + subject: String, + body: String, + }, + Ack { + email_addr: String, + command: String, + original_message_id: Option, + original_subject: String, + }, + Completion {}, + Error { + email_addr: String, + error: String, + original_subject: String, + original_message_id: Option, + }, +} + +/// Handles all possible email events and requests. +/// +/// # Arguments +/// +/// * `event` - The `EmailAuthEvent` to be handled. +/// +/// # Returns +/// +/// A `Result` indicating success or an `EmailError`. +pub async fn handle_email_event(event: EmailEvent, relayer_state: RelayerState) -> Result<()> { + match event { + EmailEvent::Command { + request_id, + email_address, + command, + account_code, + subject, + body, + } => { + // Prepare the command with the account code if it exists + let command = if let Some(code) = account_code { + format!("{} Code {}", command, code) + } else { + command + }; + + // Create the plain text body + let body_plain = format!( + "ZK Email request. \ + Your request ID is {}", + request_id + ); + + // Prepare data for HTML rendering + let render_data = serde_json::json!({ + "userEmailAddr": email_address, + "body": body, + "requestId": request_id, + "command": command, + }); + let body_html = + render_html("command_template.html", render_data, relayer_state.clone()).await?; + + // Create and send the email + let email = EmailMessage { + to: email_address, + subject, + reference: None, + reply_to: None, + body_plain, + body_html, + body_attachments: None, + }; + + send_email( + email, + Some(ExpectsReply::new(request_id)), + relayer_state.clone(), + ) + .await?; + + update_request(&relayer_state.db, request_id, RequestStatus::EmailSent).await?; + } + EmailEvent::Ack { + email_addr, + command, + original_message_id, + original_subject, + } => todo!(), + EmailEvent::Completion {} => todo!(), + EmailEvent::Error { + email_addr, + error, + original_subject, + original_message_id, + } => todo!(), // EmailEvent::Ack { + // email_addr, + // command, + // original_message_id, + // original_subject, + // } => { + // let body_plain = format!( + // "Hi {}!\nYour email with the command {} is received.", + // email_addr, command + // ); + // // Prepare data for HTML rendering + // let render_data = serde_json::json!({"userEmailAddr": email_addr, "request": command}); + // let body_html = render_html("acknowledgement.html", render_data).await?; + // let subject = format!("Re: {}", original_subject); + // // Create and send the email + // let email = EmailMessage { + // to: email_addr, + // subject, + // body_plain, + // body_html, + // reference: original_message_id.clone(), + // reply_to: original_message_id, + // body_attachments: None, + // }; + // send_email(email, None).await?; + // } + // EmailEvent::Completion {} => {} + // EmailEvent::Error { + // email_addr, + // error, + // original_subject, + // original_message_id, + // } => { + // let subject = format!("Re: {}", original_subject); + + // let body_plain = format!( + // "An error occurred while processing your request. \ + // Error: {}", + // error + // ); + + // // Prepare data for HTML rendering + // let render_data = serde_json::json!({ + // "error": error, + // "userEmailAddr": email_addr, + // }); + // let body_html = render_html("error.html", render_data).await?; + + // // Create and send the email + // let email = EmailMessage { + // to: email_addr, + // subject, + // reference: original_message_id.clone(), + // reply_to: original_message_id, + // body_plain, + // body_html, + // body_attachments: None, + // }; + + // send_email(email, None).await?; + // } + } + + Ok(()) +} + +/// Renders an HTML template with the given data. +/// +/// # Arguments +/// +/// * `template_name` - The name of the template file. +/// * `render_data` - The data to be used in rendering the template. +/// +/// # Returns +/// +/// A `Result` containing the rendered HTML string or an `Error`. +async fn render_html( + template_name: &str, + render_data: Value, + relayer_state: RelayerState, +) -> Result { + // Construct the full path to the email template + let email_template_filename = PathBuf::new() + .join(relayer_state.config.path.email_templates) + .join(template_name); + + // Read the email template file + let email_template = read_to_string(&email_template_filename).await?; + + // Create a new Handlebars instance + let reg = Handlebars::new(); + + // Render the template with the provided data + let template = reg.render_template(&email_template, &render_data)?; + Ok(template) +} + +/// Sends an email using the configured SMTP server. +/// +/// # Arguments +/// +/// * `email` - The `EmailMessage` to be sent. +/// * `expects_reply` - An optional `ExpectsReply` struct indicating if a reply is expected. +/// +/// # Returns +/// +/// A `Result` indicating success or an `EmailError`. +async fn send_email( + email: EmailMessage, + expects_reply: Option, + relayer_state: RelayerState, +) -> Result<()> { + // Send POST request to email server + let response = relayer_state + .http_client + .post(format!("{}/api/sendEmail", relayer_state.config.smtp_url)) + .json(&email) + .send() + .await?; + + // Check if the email was sent successfully + if !response.status().is_success() { + return Err(anyhow::anyhow!( + "Failed to send email: {}", + response.text().await.unwrap_or_default() + )); + } + + // Handle expected reply if necessary + if let Some(expects_reply) = expects_reply { + let response_body: EmailResponse = response.json().await?; + + let message_id = response_body.message_id; + insert_expected_reply(&relayer_state.db, &message_id, expects_reply.request_id).await?; + } + + Ok(()) +} + +/// Represents the response from the email server after sending an email. +#[derive(Debug, Clone, Serialize, Deserialize)] +struct EmailResponse { + status: String, + message_id: String, +} + +/// Represents an expectation of a reply to an email. +pub struct ExpectsReply { + request_id: Option, +} + +impl ExpectsReply { + /// Creates a new `ExpectsReply` instance with a request ID. + /// + /// # Arguments + /// + /// * `request_id` - The ID of the request expecting a reply. + fn new(request_id: Uuid) -> Self { + Self { + request_id: Some(request_id.to_string()), + } + } + + /// Creates a new `ExpectsReply` instance without a request ID. + fn new_no_request_id() -> Self { + Self { request_id: None } + } +} + +/// Checks if the email is a reply to a command that expects a reply. +/// Will return false for duplicate replies. +/// Will return true if the email is not a reply. +/// +/// # Arguments +/// +/// * `email` - The `ParsedEmail` to be checked. +/// +/// # Returns +/// +/// A `Result` containing a boolean indicating if the request is valid. +pub async fn check_is_valid_request(email: &ParsedEmail, pool: &PgPool) -> Result { + // Check if the email is a reply by looking for the "In-Reply-To" header + let reply_message_id = match email + .headers + .get_header("In-Reply-To") + .and_then(|v| v.first().cloned()) + { + Some(id) => id, + // Email is not a reply, so it's valid + None => return Ok(true), + }; + + // Check if the reply is valid (not a duplicate) using the database + let is_valid = is_valid_reply(pool, &reply_message_id).await?; + Ok(is_valid) +} diff --git a/packages/relayer/src/main.rs b/packages/relayer/src/main.rs index 4b622f3f..ca490f21 100644 --- a/packages/relayer/src/main.rs +++ b/packages/relayer/src/main.rs @@ -1,7 +1,10 @@ mod config; -mod db; mod handler; +mod mail; +mod model; mod route; +mod schema; +mod utils; use std::sync::Arc; @@ -11,6 +14,7 @@ use axum::http::{ Method, }; use relayer_utils::LOG; +use reqwest::Client; use route::create_router; use slog::info; use sqlx::{postgres::PgPoolOptions, Pool, Postgres}; @@ -18,7 +22,9 @@ use tower_http::cors::CorsLayer; use config::Config; +#[derive(Debug, Clone)] pub struct RelayerState { + http_client: Client, config: Config, db: Pool, } @@ -40,6 +46,7 @@ async fn main() -> Result<()> { .allow_headers([AUTHORIZATION, ACCEPT, CONTENT_TYPE]); let relayer = create_router(Arc::new(RelayerState { + http_client: Client::new(), config: config.clone(), db: pool.clone(), })) diff --git a/packages/relayer/src/model.rs b/packages/relayer/src/model.rs new file mode 100644 index 00000000..3070c8a9 --- /dev/null +++ b/packages/relayer/src/model.rs @@ -0,0 +1,93 @@ +use anyhow::{Error, Ok, Result}; +use serde::{Deserialize, Serialize}; +use sqlx::{FromRow, PgPool, Row}; +use uuid::Uuid; + +#[derive(Debug, FromRow, Deserialize, Serialize)] +#[allow(non_snake_case)] +pub struct RequestModel { + pub id: Uuid, + pub status: String, + #[serde(rename = "updatedAt")] + pub updated_at: Option>, +} + +#[derive(Debug, FromRow, Deserialize, Serialize)] +#[allow(non_snake_case)] +pub struct ExpectedReplyModel { + pub message_id: String, + pub request_id: Option, + pub has_reply: Option, + #[serde(rename = "createdAt")] + pub created_at: chrono::DateTime, +} + +#[derive(Debug, Serialize, Deserialize, sqlx::Type)] +#[sqlx(type_name = "status_enum")] +pub enum RequestStatus { + #[sqlx(rename = "Request received")] + RequestReceived, + #[sqlx(rename = "Email sent")] + EmailSent, + #[sqlx(rename = "Email response received")] + EmailResponseReceived, + #[sqlx(rename = "Proving")] + Proving, + #[sqlx(rename = "Performing on chain transaction")] + PerformingOnChainTransaction, + #[sqlx(rename = "Finished")] + Finished, +} + +pub async fn create_request(pool: &PgPool) -> Result { + let query_result = sqlx::query!("INSERT INTO requests DEFAULT VALUES RETURNING id") + .fetch_one(pool) + .await?; + + Ok(query_result.id) +} + +pub async fn update_request(pool: &PgPool, request_id: Uuid, status: RequestStatus) -> Result<()> { + sqlx::query!( + "UPDATE requests SET status = $1 WHERE id = $2", + status as RequestStatus, + request_id + ) + .execute(pool) + .await + .map_err(|e| Error::msg(format!("Failed to update request: {}", e)))?; + + Ok(()) +} + +pub async fn insert_expected_reply( + pool: &PgPool, + message_id: &str, + request_id: Option, +) -> Result<()> { + sqlx::query!( + "INSERT INTO expected_replies (message_id, request_id) VALUES ($1, $2)", + message_id, + request_id + ) + .execute(pool) + .await + .map_err(|e| Error::msg(format!("Failed to insert expected_reply: {}", e)))?; + + Ok(()) +} + +pub async fn is_valid_reply(pool: &PgPool, message_id: &str) -> Result { + let query_result = sqlx::query!( + "UPDATE expected_replies + SET has_reply = true + WHERE message_id = $1 AND has_reply = false + RETURNING has_reply", + message_id + ) + .fetch_one(pool) + .await + .map_err(|e| Error::msg(format!("Failed to validate reply: {}", e)))?; + + Ok(query_result.has_reply.unwrap_or(false)) +} diff --git a/packages/relayer/src/route.rs b/packages/relayer/src/route.rs index ea13578e..0a6d8723 100644 --- a/packages/relayer/src/route.rs +++ b/packages/relayer/src/route.rs @@ -5,13 +5,17 @@ use axum::{ Router, }; -use crate::{handler::health_checker_handler, RelayerState}; +use crate::{ + handler::{health_checker_handler, receive_email_handler, submit_handler}, + RelayerState, +}; pub fn create_router(relayer_state: Arc) -> Router { Router::new() .route("/api/healthz", get(health_checker_handler)) + .route("/api/submit", post(submit_handler)) + .route("/api/receiveEmail", post(receive_email_handler)) // .route("/api/status/:id", get(get_status_handler)) - // .route("/api/submit/", post(submit_handler)) // .route("/api/addDKIMKey", post(add_dkim_key_handler)) .with_state(relayer_state) } diff --git a/packages/relayer/src/schema.rs b/packages/relayer/src/schema.rs new file mode 100644 index 00000000..bb396c1d --- /dev/null +++ b/packages/relayer/src/schema.rs @@ -0,0 +1,31 @@ +use std::collections::HashMap; + +use ethers::{abi::Item, types::Address}; +use relayer_utils::AccountCode; +use serde::Deserialize; + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct EmailTxAuthSchema { + pub contract_address: Address, + pub email_auth_contract_address: Address, + pub account_code: AccountCode, + pub code_exists_in_email: bool, + pub function_abi: Item, + pub command_template: String, + pub command_params: HashMap, + pub remaining_args: HashMap, + pub email_address: String, + pub subject: String, + pub body: String, + pub chain: String, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct DKIMSchema { + dkim_contract_address: Address, + selector: String, + domain: String, + chain: String, +} diff --git a/packages/relayer/src/utils.rs b/packages/relayer/src/utils.rs new file mode 100644 index 00000000..8ddadd18 --- /dev/null +++ b/packages/relayer/src/utils.rs @@ -0,0 +1,12 @@ +use std::collections::HashMap; + +pub fn parse_command_template(template: &str, params: &HashMap) -> String { + let mut parsed_string = template.to_string(); + + for (key, value) in params { + let placeholder = format!("${{{}}}", key); + parsed_string = parsed_string.replace(&placeholder, value); + } + + parsed_string +} From f08144aadc8d8a0f0d5574b48ca52405482b07cb Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Thu, 10 Oct 2024 17:25:31 +0700 Subject: [PATCH 110/121] fix: uuid capture --- packages/relayer/src/handler.rs | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/packages/relayer/src/handler.rs b/packages/relayer/src/handler.rs index 7cbc431b..53002d87 100644 --- a/packages/relayer/src/handler.rs +++ b/packages/relayer/src/handler.rs @@ -83,29 +83,15 @@ pub async fn receive_email_handler( ) -> Result)> { // Define the regex pattern for UUID let uuid_regex = Regex::new( - r"\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b", + r"(Your request ID is )([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})", ) .unwrap(); // Attempt to find a UUID in the body - let request_id = uuid_regex.find(&body).map(|m| m.as_str()); - - match request_id { - Some(request_id) => { - info!(LOG, "Extracted UUID: {:?}", request_id); - } - None => { - info!(LOG, "No UUID found in the body"); - // Handle the case where no UUID is found - let response = json!({ - "status": "error", - "message": "No UUID found in the email body", - }); - return Ok((StatusCode::BAD_REQUEST, Json(response))); - } - } - - let request_id = request_id + let captures = uuid_regex.captures(&body); + + let request_id = captures + .and_then(|caps| caps.get(2).map(|m| m.as_str())) .ok_or_else(|| { ( reqwest::StatusCode::BAD_REQUEST, @@ -121,6 +107,8 @@ pub async fn receive_email_handler( }) })?; + info!(LOG, "Request ID received: {}", request_id); + update_request( &relayer_state.db, request_id, From 036a96d106b2130f4f9c1be63b5098051a4ad059 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Fri, 11 Oct 2024 18:19:58 +0700 Subject: [PATCH 111/121] feat: add icp, prover and on chain stuff --- Cargo.lock | 627 ++++++++++++++++-- packages/relayer/Cargo.toml | 9 +- packages/relayer/build.rs | 23 + .../acknowledgement_template.html | 2 +- .../email_templates/command_template.html | 2 +- .../email_templates/completion_template.html | 6 +- .../migrations/20241008135456_init.up.sql | 10 +- packages/relayer/src/chain.rs | 207 ++++++ packages/relayer/src/command.rs | 80 +++ packages/relayer/src/constants.rs | 4 + packages/relayer/src/dkim.rs | 215 ++++++ packages/relayer/src/handler.rs | 140 +++- packages/relayer/src/mail.rs | 226 +++++-- packages/relayer/src/main.rs | 8 +- packages/relayer/src/model.rs | 65 +- packages/relayer/src/prove.rs | 69 ++ packages/relayer/src/schema.rs | 18 +- packages/relayer/src/statics.rs | 7 + packages/relayer/src/utils.rs | 12 - 19 files changed, 1561 insertions(+), 169 deletions(-) create mode 100644 packages/relayer/build.rs create mode 100644 packages/relayer/src/chain.rs create mode 100644 packages/relayer/src/command.rs create mode 100644 packages/relayer/src/constants.rs create mode 100644 packages/relayer/src/dkim.rs create mode 100644 packages/relayer/src/prove.rs create mode 100644 packages/relayer/src/statics.rs delete mode 100644 packages/relayer/src/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 7eaf65d6..a23aac9a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -92,6 +92,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "arrayvec" version = "0.7.6" @@ -107,6 +113,17 @@ dependencies = [ "term", ] +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + [[package]] name = "async-trait" version = "0.1.83" @@ -216,6 +233,17 @@ dependencies = [ "tracing", ] +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom", + "instant", + "rand", +] + [[package]] name = "backtrace" version = "0.3.74" @@ -267,6 +295,29 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "binread" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16598dfc8e6578e9b597d9910ba2e73618385dc9f4b1d43dd92c349d6be6418f" +dependencies = [ + "binread_derive", + "lazy_static", + "rustversion", +] + +[[package]] +name = "binread_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9672209df1714ee804b1f4d4f68c8eb2a90b1f7a07acf472f88ce198ef1fed" +dependencies = [ + "either", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -315,7 +366,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -325,10 +376,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.7.6", "constant_time_eq 0.3.1", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -344,7 +404,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ - "sha2", + "sha2 0.10.8", "tinyvec", ] @@ -396,6 +456,19 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "cached" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8466736fe5dbcaf8b8ee24f9bbefe43c884dc3e9ff7178da70f55bffca1133c" +dependencies = [ + "ahash", + "hashbrown 0.14.5", + "instant", + "once_cell", + "thiserror", +] + [[package]] name = "camino" version = "1.1.9" @@ -405,6 +478,41 @@ dependencies = [ "serde", ] +[[package]] +name = "candid" +version = "0.10.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c30ee7f886f296b6422c0ff017e89dd4f831521dfdcc76f3f71aae1ce817222" +dependencies = [ + "anyhow", + "binread", + "byteorder", + "candid_derive", + "hex", + "ic_principal", + "leb128", + "num-bigint", + "num-traits", + "paste", + "pretty", + "serde", + "serde_bytes", + "stacker", + "thiserror", +] + +[[package]] +name = "candid_derive" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3de398570c386726e7a59d9887b68763c481477f9a043fb998a2e09d428df1a9" +dependencies = [ + "lazy_static", + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "cargo-platform" version = "0.1.8" @@ -459,7 +567,7 @@ dependencies = [ "rsa", "serde_json", "sha-1", - "sha2", + "sha2 0.10.8", "slog", "trust-dns-resolver", "wasm-bindgen", @@ -514,11 +622,11 @@ checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ "bs58", "coins-core", - "digest", + "digest 0.10.7", "hmac", "k256", "serde", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -534,7 +642,7 @@ dependencies = [ "once_cell", "pbkdf2 0.12.2", "rand", - "sha2", + "sha2 0.10.8", "thiserror", ] @@ -547,13 +655,13 @@ dependencies = [ "base64 0.21.7", "bech32", "bs58", - "digest", + "digest 0.10.7", "generic-array", "hex", "ripemd", "serde", "serde_derive", - "sha2", + "sha2 0.10.8", "sha3", "thiserror", ] @@ -746,7 +854,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "rustc_version", "subtle", @@ -764,6 +872,19 @@ dependencies = [ "syn 2.0.79", ] +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core", + "subtle-ng", + "zeroize", +] + [[package]] name = "data-encoding" version = "2.6.0" @@ -801,13 +922,22 @@ dependencies = [ "syn 2.0.79", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", @@ -874,7 +1004,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -891,6 +1021,21 @@ dependencies = [ "signature", ] +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core", + "serde", + "sha2 0.9.9", + "thiserror", + "zeroize", +] + [[package]] name = "ed25519-dalek" version = "2.1.1" @@ -900,7 +1045,7 @@ dependencies = [ "curve25519-dalek", "ed25519", "serde", - "sha2", + "sha2 0.10.8", "subtle", "zeroize", ] @@ -922,10 +1067,11 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", + "pem-rfc7468", "pkcs8", "rand_core", "sec1", @@ -1016,7 +1162,7 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest", + "digest 0.10.7", "hex", "hmac", "pbkdf2 0.11.0", @@ -1024,7 +1170,7 @@ dependencies = [ "scrypt", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "sha3", "thiserror", "uuid 0.8.2", @@ -1171,7 +1317,7 @@ version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" dependencies = [ - "arrayvec", + "arrayvec 0.7.6", "bytes", "cargo_metadata", "chrono", @@ -1289,7 +1435,7 @@ dependencies = [ "eth-keystore", "ethers-core", "rand", - "sha2", + "sha2 0.10.8", "thiserror", "tracing", ] @@ -1337,6 +1483,16 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "eyre" version = "0.6.12" @@ -1702,13 +1858,19 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" + [[package]] name = "halo2curves" version = "0.7.0" source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#8771fe5a5d54fc03e74dbc8915db5dad3ab46a83" dependencies = [ "blake2", - "digest", + "digest 0.10.7", "ff", "group", "halo2derive", @@ -1722,7 +1884,7 @@ dependencies = [ "rand", "rand_core", "rayon", - "sha2", + "sha2 0.10.8", "static_assertions", "subtle", "unroll", @@ -1840,7 +2002,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -2010,6 +2172,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.0", "tower-service", + "webpki-roots 0.26.6", ] [[package]] @@ -2083,6 +2246,139 @@ dependencies = [ "cc", ] +[[package]] +name = "ic-agent" +version = "0.37.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd3fdf5e5c4f4a9fe5ca612f0febd22dcb161d2f2b75b0142326732be5e4978" +dependencies = [ + "async-lock", + "backoff", + "cached", + "candid", + "ed25519-consensus", + "futures-util", + "hex", + "http 1.1.0", + "http-body 1.0.1", + "ic-certification", + "ic-transport-types", + "ic-verify-bls-signature", + "k256", + "leb128", + "p256", + "pem 3.0.4", + "pkcs8", + "rand", + "rangemap", + "reqwest 0.12.8", + "ring 0.17.8", + "rustls-webpki 0.102.8", + "sec1", + "serde", + "serde_bytes", + "serde_cbor", + "serde_repr", + "sha2 0.10.8", + "simple_asn1", + "thiserror", + "time", + "tokio", + "url", +] + +[[package]] +name = "ic-certification" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64ee3d8b6e81b51f245716d3e0badb63c283c00f3c9fb5d5219afc30b5bf821" +dependencies = [ + "hex", + "serde", + "serde_bytes", + "sha2 0.10.8", +] + +[[package]] +name = "ic-transport-types" +version = "0.37.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875dc4704780383112e8e8b5063a1b98de114321d0c7d3e7f635dcf360a57fba" +dependencies = [ + "candid", + "hex", + "ic-certification", + "leb128", + "serde", + "serde_bytes", + "serde_repr", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "ic-utils" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fa832296800758c9c921dd1704985ded6b3e6fbc3aee409727eb1f00d69a595" +dependencies = [ + "async-trait", + "candid", + "futures-util", + "ic-agent", + "once_cell", + "semver 1.0.23", + "serde", + "serde_bytes", + "sha2 0.10.8", + "strum", + "strum_macros", + "thiserror", + "time", + "tokio", +] + +[[package]] +name = "ic-verify-bls-signature" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d420b25c0091059f6c3c23a21427a81915e6e0aca3b79e0d403ed767f286a3b9" +dependencies = [ + "hex", + "ic_bls12_381", + "lazy_static", + "pairing", + "rand", + "sha2 0.10.8", +] + +[[package]] +name = "ic_bls12_381" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22c65787944f32af084dffd0c68c1e544237b76e215654ddea8cd9f527dd8b69" +dependencies = [ + "digest 0.10.7", + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + +[[package]] +name = "ic_principal" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1762deb6f7c8d8c2bdee4b6c5a47b60195b74e9b5280faa5ba29692f8e17429c" +dependencies = [ + "crc32fast", + "data-encoding", + "serde", + "sha2 0.10.8", + "thiserror", +] + [[package]] name = "idna" version = "0.2.3" @@ -2273,7 +2569,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ "base64 0.21.7", - "pem", + "pem 1.1.1", "ring 0.16.20", "serde", "serde_json", @@ -2290,7 +2586,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2", + "sha2 0.10.8", "signature", ] @@ -2342,6 +2638,12 @@ dependencies = [ "spin 0.9.8", ] +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "libc" version = "0.2.159" @@ -2458,7 +2760,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest", + "digest 0.10.7", ] [[package]] @@ -2592,6 +2894,7 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", + "serde", ] [[package]] @@ -2694,13 +2997,19 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "open-fastrlp" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" dependencies = [ - "arrayvec", + "arrayvec 0.7.6", "auto_impl", "bytes", "ethereum-types", @@ -2769,6 +3078,18 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.8", +] + [[package]] name = "pairing" version = "0.23.0" @@ -2784,7 +3105,7 @@ version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ - "arrayvec", + "arrayvec 0.7.6", "bitvec", "byte-slice-cast", "impl-trait-for-tuples", @@ -2877,10 +3198,10 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest", + "digest 0.10.7", "hmac", "password-hash", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -2889,7 +3210,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest", + "digest 0.10.7", "hmac", ] @@ -2902,6 +3223,16 @@ dependencies = [ "base64 0.13.1", ] +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.1", + "serde", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -2959,7 +3290,7 @@ checksum = "ac8a071862e93690b6e34e9a5fb8e33ff3734473ac0245b27232222c4906a33f" dependencies = [ "once_cell", "pest", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -3125,6 +3456,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "pretty" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55c4d17d994b637e2f4daf6e5dc5d660d209d5642377d675d7a1c3ab69fa579" +dependencies = [ + "arrayvec 0.5.2", + "typed-arena", + "unicode-width", +] + [[package]] name = "prettyplease" version = "0.2.22" @@ -3135,6 +3477,15 @@ dependencies = [ "syn 2.0.79", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "primitive-types" version = "0.12.2" @@ -3183,6 +3534,15 @@ dependencies = [ "unarray", ] +[[package]] +name = "psm" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" +dependencies = [ + "cc", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -3195,6 +3555,54 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +[[package]] +name = "quinn" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.14", + "socket2", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +dependencies = [ + "bytes", + "rand", + "ring 0.17.8", + "rustc-hash", + "rustls 0.23.14", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +dependencies = [ + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "quote" version = "1.0.37" @@ -3255,6 +3663,12 @@ dependencies = [ "rand_core", ] +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + [[package]] name = "rayon" version = "1.10.0" @@ -3330,9 +3744,13 @@ version = "0.1.0" dependencies = [ "anyhow", "axum", + "candid", "chrono", "ethers", "handlebars", + "ic-agent", + "ic-utils", + "lazy_static", "regex", "relayer-utils", "reqwest 0.12.8", @@ -3419,7 +3837,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 0.25.4", "winreg", ] @@ -3432,6 +3850,7 @@ dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", + "futures-channel", "futures-core", "futures-util", "h2 0.4.6", @@ -3450,7 +3869,10 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "quinn", + "rustls 0.23.14", "rustls-pemfile 2.2.0", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", @@ -3458,11 +3880,15 @@ dependencies = [ "system-configuration 0.6.1", "tokio", "tokio-native-tls", + "tokio-rustls 0.26.0", + "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", + "webpki-roots 0.26.6", "windows-registry", ] @@ -3522,7 +3948,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -3554,7 +3980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" dependencies = [ "const-oid", - "digest", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-traits", @@ -3562,7 +3988,7 @@ dependencies = [ "pkcs8", "rand_core", "serde", - "sha2", + "sha2 0.10.8", "signature", "spki", "subtle", @@ -3575,6 +4001,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -3622,6 +4054,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", + "ring 0.17.8", "rustls-pki-types", "rustls-webpki 0.102.8", "subtle", @@ -3757,7 +4190,7 @@ dependencies = [ "hmac", "pbkdf2 0.11.0", "salsa20", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -3863,6 +4296,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_cbor" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.210" @@ -3896,6 +4348,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "serde_spanned" version = "0.6.8" @@ -3925,7 +4388,7 @@ checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -3936,7 +4399,20 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", ] [[package]] @@ -3947,7 +4423,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -3956,7 +4432,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] @@ -3981,7 +4457,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] @@ -4145,6 +4621,7 @@ dependencies = [ "atoi", "byteorder", "bytes", + "chrono", "crc", "crossbeam-queue", "either", @@ -4165,7 +4642,7 @@ dependencies = [ "percent-encoding", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "smallvec", "sqlformat", "thiserror", @@ -4205,7 +4682,7 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "sqlx-core", "sqlx-mysql", "sqlx-postgres", @@ -4227,8 +4704,9 @@ dependencies = [ "bitflags 2.6.0", "byteorder", "bytes", + "chrono", "crc", - "digest", + "digest 0.10.7", "dotenvy", "either", "futures-channel", @@ -4249,7 +4727,7 @@ dependencies = [ "rsa", "serde", "sha1", - "sha2", + "sha2 0.10.8", "smallvec", "sqlx-core", "stringprep", @@ -4270,6 +4748,7 @@ dependencies = [ "base64 0.22.1", "bitflags 2.6.0", "byteorder", + "chrono", "crc", "dotenvy", "etcetera", @@ -4289,7 +4768,7 @@ dependencies = [ "rand", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "smallvec", "sqlx-core", "stringprep", @@ -4307,6 +4786,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" dependencies = [ "atoi", + "chrono", "flume", "futures-channel", "futures-core", @@ -4325,6 +4805,19 @@ dependencies = [ "uuid 1.10.0", ] +[[package]] +name = "stacker" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -4383,6 +4876,12 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "svm-rs" version = "0.3.5" @@ -4397,7 +4896,7 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "sha2", + "sha2 0.10.8", "thiserror", "url", "zip", @@ -4697,7 +5196,7 @@ dependencies = [ "tokio", "tokio-rustls 0.24.1", "tungstenite", - "webpki-roots", + "webpki-roots 0.25.4", ] [[package]] @@ -4902,6 +5401,12 @@ dependencies = [ "utf-8", ] +[[package]] +name = "typed-arena" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" + [[package]] name = "typenum" version = "1.17.0" @@ -4959,6 +5464,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -5168,6 +5679,19 @@ dependencies = [ "syn 2.0.79", ] +[[package]] +name = "wasm-streams" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.70" @@ -5184,6 +5708,15 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "webpki-roots" +version = "0.26.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "whoami" version = "1.5.2" diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 2675f1bd..a9fa0964 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -8,7 +8,7 @@ anyhow = "1.0.89" axum = "0.7.7" serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" -sqlx = { version = "0.8.2", features = ["postgres", "runtime-tokio", "migrate", "uuid", "time"] } +sqlx = { version = "0.8.2", features = ["postgres", "runtime-tokio", "migrate", "uuid", "time", "chrono"] } tokio = { version = "1.40.0", features = ["full"] } tower-http = { version = "0.6.1", features = ["cors"] } # relayer-utils = { git = "https://github.com/zkemail/relayer-utils.git", branch = "main" } @@ -23,3 +23,10 @@ ethers = "2.0.14" reqwest = { version = "0.12.8", features = ["json"] } handlebars = "6.1.0" regex = "1.11.0" +ic-agent = { version = "0.37.1", features = ["pem", "reqwest"] } +ic-utils = "0.37.0" +candid = "0.10.10" +lazy_static = "1.5.0" + +[build-dependencies] +ethers = "2.0.14" diff --git a/packages/relayer/build.rs b/packages/relayer/build.rs new file mode 100644 index 00000000..0da3c7f8 --- /dev/null +++ b/packages/relayer/build.rs @@ -0,0 +1,23 @@ +use ethers::contract::Abigen; + +fn main() { + Abigen::new( + "EmailAuth", + "../contracts/artifacts/EmailAuth.sol/EmailAuth.json", + ) + .unwrap() + .generate() + .unwrap() + .write_to_file("./src/abis/email_auth.rs") + .unwrap(); + + Abigen::new( + "ECDSAOwnedDKIMRegistry", + "../contracts/artifacts/ECDSAOwnedDKIMRegistry.sol/ECDSAOwnedDKIMRegistry.json", + ) + .unwrap() + .generate() + .unwrap() + .write_to_file("./src/abis/ecdsa_owned_dkim_registry.rs") + .unwrap(); +} diff --git a/packages/relayer/email_templates/acknowledgement_template.html b/packages/relayer/email_templates/acknowledgement_template.html index 6c720aa7..729f7a13 100644 --- a/packages/relayer/email_templates/acknowledgement_template.html +++ b/packages/relayer/email_templates/acknowledgement_template.html @@ -117,7 +117,7 @@ > - Hi, {{userEmailAddr}}! + Hi, diff --git a/packages/relayer/email_templates/command_template.html b/packages/relayer/email_templates/command_template.html index 91ad7ce2..04053475 100644 --- a/packages/relayer/email_templates/command_template.html +++ b/packages/relayer/email_templates/command_template.html @@ -117,7 +117,7 @@ > - Hi, {{userEmailAddr}}! + Hi, diff --git a/packages/relayer/email_templates/completion_template.html b/packages/relayer/email_templates/completion_template.html index 3a4b2e97..cc39f73e 100644 --- a/packages/relayer/email_templates/completion_template.html +++ b/packages/relayer/email_templates/completion_template.html @@ -117,14 +117,12 @@ > - Hi, {{userEmailAddr}}! + Hi, - {{body}} -

- Your request ID is #{{requestId}} is now complete. + Your request ID is {{requestId}} is now complete. diff --git a/packages/relayer/migrations/20241008135456_init.up.sql b/packages/relayer/migrations/20241008135456_init.up.sql index bf18f5b3..7b183059 100644 --- a/packages/relayer/migrations/20241008135456_init.up.sql +++ b/packages/relayer/migrations/20241008135456_init.up.sql @@ -2,12 +2,18 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -CREATE TYPE status_enum AS ENUM ('Request received', 'Email sent', 'Email response received', 'Proving', 'Performing on chain transaction', 'Finished'); +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'status_enum') THEN + CREATE TYPE status_enum AS ENUM ('Request received', 'Processing', 'Completed', 'Failed'); + END IF; +END $$; CREATE TABLE IF NOT EXISTS requests ( id UUID PRIMARY KEY NOT NULL DEFAULT (uuid_generate_v4()), status status_enum NOT NULL DEFAULT 'Request received', - updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() + updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + email_tx_auth JSONB NOT NULL ); CREATE TABLE IF NOT EXISTS expected_replies ( diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs new file mode 100644 index 00000000..3d2fa6b8 --- /dev/null +++ b/packages/relayer/src/chain.rs @@ -0,0 +1,207 @@ +use std::collections::HashMap; + +use crate::*; +use abi::{Abi, Token}; +use abis::{ECDSAOwnedDKIMRegistry, EmailAuth, EmailAuthMsg, EmailProof}; +use anyhow::anyhow; +use config::ChainConfig; +use ethers::prelude::*; +use ethers::signers::Signer; +use ethers::utils::hex; +use model::RequestModel; +use statics::SHARED_MUTEX; + +const CONFIRMATIONS: usize = 1; + +type SignerM = SignerMiddleware, LocalWallet>; + +/// Represents a client for interacting with the blockchain. +#[derive(Debug, Clone)] +pub struct ChainClient { + pub client: Arc, +} + +impl ChainClient { + /// Sets up a new ChainClient. + /// + /// # Returns + /// + /// A `Result` containing the new `ChainClient` if successful, or an error if not. + pub async fn setup(chain: String, chains: HashMap) -> Result { + let chain_config = chains + .get(&chain) + .ok_or_else(|| anyhow!("Chain configuration not found"))?; + let wallet: LocalWallet = chain_config.private_key.parse()?; + let provider = Provider::::try_from(chain_config.rpc_url.clone())?; + + // Create a new SignerMiddleware with the provider and wallet + let client = Arc::new(SignerMiddleware::new( + provider, + wallet.with_chain_id(chain_config.chain_id), + )); + + Ok(Self { client }) + } + + /// Sets the DKIM public key hash. + /// + /// # Arguments + /// + /// * `selector` - The selector string. + /// * `domain_name` - The domain name. + /// * `public_key_hash` - The public key hash as a 32-byte array. + /// * `signature` - The signature as Bytes. + /// * `dkim` - The ECDSA Owned DKIM Registry. + /// + /// # Returns + /// + /// A `Result` containing the transaction hash as a String if successful, or an error if not. + pub async fn set_dkim_public_key_hash( + &self, + selector: String, + domain_name: String, + public_key_hash: [u8; 32], + signature: Bytes, + dkim: ECDSAOwnedDKIMRegistry, + ) -> Result { + // Mutex is used to prevent nonce conflicts. + let mut mutex = SHARED_MUTEX + .lock() + .map_err(|e| anyhow::anyhow!("Mutex poisoned: {}", e))?; + *mutex += 1; + + // Call the contract method + let call = dkim.set_dkim_public_key_hash(selector, domain_name, public_key_hash, signature); + let tx = call.send().await?; + + // Wait for the transaction to be confirmed + let receipt = tx + .log() + .confirmations(CONFIRMATIONS) + .await? + .ok_or(anyhow!("No receipt"))?; + + // Format the transaction hash + let tx_hash = receipt.transaction_hash; + let tx_hash = format!("0x{}", hex::encode(tx_hash.as_bytes())); + Ok(tx_hash) + } + + /// Checks if a DKIM public key hash is valid. + /// + /// # Arguments + /// + /// * `domain_name` - The domain name. + /// * `public_key_hash` - The public key hash as a 32-byte array. + /// * `dkim` - The ECDSA Owned DKIM Registry. + /// + /// # Returns + /// + /// A `Result` containing a boolean indicating if the hash is valid. + pub async fn check_if_dkim_public_key_hash_valid( + &self, + domain_name: ::std::string::String, + public_key_hash: [u8; 32], + dkim: ECDSAOwnedDKIMRegistry, + ) -> Result { + // Call the contract method to check if the hash is valid + let is_valid = dkim + .is_dkim_public_key_hash_valid(domain_name, public_key_hash) + .call() + .await?; + Ok(is_valid) + } + + /// Gets the DKIM from an email auth address. + /// + /// # Arguments + /// + /// * `email_auth_addr` - The email auth address as a string. + /// + /// # Returns + /// + /// A `Result` containing the ECDSA Owned DKIM Registry if successful, or an error if not. + pub async fn get_dkim_from_email_auth( + &self, + email_auth_address: Address, + ) -> Result, anyhow::Error> { + // Create a new EmailAuth contract instance + let contract = EmailAuth::new(email_auth_address, self.client.clone()); + + // Call the dkim_registry_addr method to get the DKIM registry address + let dkim = contract.dkim_registry_addr().call().await?; + + // Create and return a new ECDSAOwnedDKIMRegistry instance + Ok(ECDSAOwnedDKIMRegistry::new(dkim, self.client.clone())) + } + + pub async fn call(&self, request: RequestModel, email_auth_msg: EmailAuthMsg) -> Result<()> { + let abi = Abi { + functions: vec![request.email_tx_auth.function_abi.clone()] + .into_iter() + .map(|f| (f.name.clone(), vec![f])) + .collect(), + events: Default::default(), + constructor: None, + receive: false, + fallback: false, + errors: Default::default(), + }; + + let contract = Contract::new( + request.email_tx_auth.contract_address, + abi, + self.client.clone(), + ); + let function = request.email_tx_auth.function_abi; + let remaining_args = request.email_tx_auth.remaining_args; + + // Assuming remaining_args is a Vec of some type that can be converted to tokens + let mut tokens = email_auth_msg.to_tokens(); + + // Convert remaining_args to tokens and add them to the tokens vector + for arg in remaining_args { + // Convert each arg to a Token. This conversion depends on the type of arg. + // For example, if arg is a string, you might use Token::String(arg). + // Adjust the conversion based on the actual type of arg. + let token = Token::from(arg); // Replace with appropriate conversion + tokens.push(token); + } + + // Now you can use the tokens vector to call the contract function + let call = contract.method::<_, ()>(&function.name, tokens)?; + let _result = call.send().await?; + Ok(()) + } +} + +impl EmailAuthMsg { + pub fn to_tokens(&self) -> Vec { + vec![ + Token::Uint(self.template_id), + Token::Array( + self.command_params + .iter() + .map(|param| Token::Bytes(param.clone().to_vec())) + .collect(), + ), + Token::Uint(self.skipped_command_prefix), + Token::Tuple(self.proof.to_tokens()), + ] + } +} + +impl EmailProof { + pub fn to_tokens(&self) -> Vec { + vec![ + Token::String(self.domain_name.clone()), + Token::FixedBytes(self.public_key_hash.to_vec()), + Token::Uint(self.timestamp), + Token::String(self.masked_command.clone()), + Token::FixedBytes(self.email_nullifier.to_vec()), + Token::FixedBytes(self.account_salt.to_vec()), + Token::Bool(self.is_code_exist), + Token::Bytes(self.proof.clone().to_vec()), + ] + } +} diff --git a/packages/relayer/src/command.rs b/packages/relayer/src/command.rs new file mode 100644 index 00000000..5171e407 --- /dev/null +++ b/packages/relayer/src/command.rs @@ -0,0 +1,80 @@ +use anyhow::{anyhow, Result}; +use ethers::types::{Bytes, U256}; +use relayer_utils::{ + command_templates, extract_template_vals_from_command, u256_to_bytes32_little, +}; + +use crate::{constants::COMMAND_FIELDS, model::RequestModel}; + +pub fn parse_command_template(template: &str, params: Vec) -> String { + let mut parsed_string = template.to_string(); + let mut param_iter = params.iter(); + + while let Some(value) = param_iter.next() { + if let Some(start) = parsed_string.find('{') { + if let Some(end) = parsed_string[start..].find('}') { + parsed_string.replace_range(start..start + end + 1, value); + } + } + } + + parsed_string +} + +/// Retrieves and encodes the command parameters for the email authentication request. +/// +/// # Arguments +/// +/// * `params` - The `EmailRequestContext` containing request details. +/// +/// # Returns +/// +/// A `Result` containing a vector of encoded command parameters or an `EmailError`. +pub async fn get_encoded_command_params(email: &str, request: RequestModel) -> Result> { + let command_template = request + .email_tx_auth + .command_template + .split_whitespace() + .map(String::from) + .collect(); + + let command_params = extract_template_vals_from_command(email, command_template)?; + + let command_params_encoded = command_params + .iter() + .map(|param| { + param + .abi_encode(None) + .map_err(|e| anyhow::anyhow!(e.to_string())) + }) + .collect::>>()?; + + Ok(command_params_encoded) +} + +/// Extracts the masked command from public signals. +/// +/// # Arguments +/// +/// * `public_signals` - The vector of public signals. +/// * `start_idx` - The starting index for command extraction. +/// +/// # Returns +/// +/// A `Result` containing the masked command as a `String` or an error. +pub fn get_masked_command(public_signals: Vec, start_idx: usize) -> Result { + // Gather signals from start_idx to start_idx + COMMAND_FIELDS + let command_bytes: Vec = public_signals + .iter() + .skip(start_idx) + .take(COMMAND_FIELDS) + .take_while(|&signal| *signal != U256::zero()) + .flat_map(u256_to_bytes32_little) + .collect(); + + // Bytes to string, removing null bytes + let command = String::from_utf8(command_bytes.into_iter().filter(|&b| b != 0u8).collect()) + .map_err(|e| anyhow!("Failed to convert bytes to string: {}", e))?; + + Ok(command) +} diff --git a/packages/relayer/src/constants.rs b/packages/relayer/src/constants.rs new file mode 100644 index 00000000..4dd6a3b2 --- /dev/null +++ b/packages/relayer/src/constants.rs @@ -0,0 +1,4 @@ +pub const SHA_PRECOMPUTE_SELECTOR: &str = r#"(<(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)? (=\r\n)?i(=\r\n)?d(=\r\n)?=3D(=\r\n)?\"(=\r\n)?[^\"]*(=\r\n)?z(=\r\n)?k(=\r\n)?e(=\r\n)?m(=\r\n)?a(=\r\n)?i(=\r\n)?l(=\r\n)?[^\"]*(=\r\n)?\"(=\r\n)?[^>]*(=\r\n)?>(=\r\n)?)(=\r\n)?([^<>\/]+)(<(=\r\n)?\/(=\r\n)?d(=\r\n)?i(=\r\n)?v(=\r\n)?>(=\r\n)?)"#; + +pub const DOMAIN_FIELDS: usize = 9; +pub const COMMAND_FIELDS: usize = 20; diff --git a/packages/relayer/src/dkim.rs b/packages/relayer/src/dkim.rs new file mode 100644 index 00000000..6b62d21a --- /dev/null +++ b/packages/relayer/src/dkim.rs @@ -0,0 +1,215 @@ +use std::env; + +use anyhow::anyhow; +use chain::ChainClient; +use ethers::types::Address; +use ethers::utils::hex; +use relayer_utils::fr_to_bytes32; +use relayer_utils::public_key_hash; +use relayer_utils::ParsedEmail; +use relayer_utils::LOG; + +use crate::*; +use candid::CandidType; +use ethers::types::Bytes; +use ethers::utils::hex::FromHex; +use ic_agent::agent::http_transport::ReqwestTransport; +use ic_agent::agent::*; +use ic_agent::identity::*; +use ic_utils::canister::*; + +use serde::Deserialize; + +/// Represents a client for interacting with the DKIM Oracle. +#[derive(Debug, Clone)] +pub struct DkimOracleClient<'a> { + /// The canister used for communication + pub canister: Canister<'a>, +} + +/// Represents a signed DKIM public key. +#[derive(Default, CandidType, Deserialize, Debug, Clone)] +pub struct SignedDkimPublicKey { + /// The selector for the DKIM key + pub selector: String, + /// The domain for the DKIM key + pub domain: String, + /// The signature of the DKIM key + pub signature: String, + /// The public key + pub public_key: String, + /// The hash of the public key + pub public_key_hash: String, +} + +impl<'a> DkimOracleClient<'a> { + /// Generates an agent for the DKIM Oracle Client. + /// + /// # Arguments + /// + /// * `pem_path` - The path to the PEM file. + /// * `replica_url` - The URL of the replica. + /// + /// # Returns + /// + /// An `anyhow::Result`. + pub fn gen_agent(pem_path: &str, replica_url: &str) -> anyhow::Result { + // Create identity from PEM file + let identity = Secp256k1Identity::from_pem_file(pem_path)?; + + // Create transport using the replica URL + let transport = ReqwestTransport::create(replica_url)?; + + // Build and return the agent + let agent = AgentBuilder::default() + .with_identity(identity) + .with_transport(transport) + .build()?; + Ok(agent) + } + + /// Creates a new DkimOracleClient. + /// + /// # Arguments + /// + /// * `canister_id` - The ID of the canister. + /// * `agent` - The agent to use for communication. + /// + /// # Returns + /// + /// An `anyhow::Result`. + pub fn new(canister_id: &str, agent: &'a Agent) -> anyhow::Result { + // Build the canister using the provided ID and agent + let canister = CanisterBuilder::new() + .with_canister_id(canister_id) + .with_agent(agent) + .build()?; + Ok(Self { canister }) + } + + /// Requests a signature for a DKIM public key. + /// + /// # Arguments + /// + /// * `selector` - The selector for the DKIM key. + /// * `domain` - The domain for the DKIM key. + /// + /// # Returns + /// + /// An `anyhow::Result`. + pub async fn request_signature( + &self, + selector: &str, + domain: &str, + ) -> anyhow::Result { + // Build the request to sign the DKIM public key + let request = self + .canister + .update("sign_dkim_public_key") + .with_args((selector, domain)) + .build::<(Result,)>(); + + // Call the canister and wait for the response + let response = request + .call_and_wait_one::>() + .await? + .map_err(|e| anyhow!(format!("Error from canister: {:?}", e)))?; + + Ok(response) + } +} + +/// Checks and updates the DKIM for a given email. +/// +/// # Arguments +/// +/// * `email` - The email address. +/// * `parsed_email` - The parsed email data. +/// * `controller_eth_addr` - The Ethereum address of the controller. +/// * `wallet_addr` - The address of the wallet. +/// * `account_salt` - The salt for the account. +/// +/// # Returns +/// +/// A `Result<()>`. +pub async fn check_and_update_dkim( + parsed_email: &ParsedEmail, + email_auth_addr: Address, + chain_client: ChainClient, + relayer_state: RelayerState, +) -> Result<()> { + // Generate public key hash + let mut public_key_n = parsed_email.public_key.clone(); + public_key_n.reverse(); + let public_key_hash = public_key_hash(&public_key_n)?; + info!(LOG, "public_key_hash {:?}", public_key_hash); + + // Get email domain + let domain = parsed_email.get_email_domain()?; + info!(LOG, "domain {:?}", domain); + + // Get DKIM + let dkim = chain_client + .get_dkim_from_email_auth(email_auth_addr) + .await?; + + info!(LOG, "dkim {:?}", dkim); + + // Check if DKIM public key hash is valid + if chain_client + .check_if_dkim_public_key_hash_valid( + domain.clone(), + fr_to_bytes32(&public_key_hash)?, + dkim.clone(), + ) + .await? + { + info!(LOG, "public key registered"); + return Ok(()); + } + + // Get selector using regex + let regex_pattern = r"((\r\n)|^)dkim-signature:([a-z]+=[^;]+; )+s=([0-9a-z_-]+);"; + let re = regex::Regex::new(regex_pattern).map_err(|e| anyhow!("Invalid regex: {}", e))?; + + let selector = re + .captures(&parsed_email.canonicalized_header) + .and_then(|caps| caps.get(4)) + .map(|m| m.as_str().to_string()) + .ok_or_else(|| anyhow!("Failed to extract selector using regex"))?; + + info!(LOG, "selector {}", selector); + + // Generate IC agent and create oracle client + let ic_agent = DkimOracleClient::gen_agent( + &env::var(relayer_state.config.path.pem).unwrap(), + &env::var(relayer_state.config.icp.ic_replica_url).unwrap(), + )?; + let oracle_client = DkimOracleClient::new( + &env::var(relayer_state.config.icp.canister_id).unwrap(), + &ic_agent, + )?; + + // Request signature from oracle + let oracle_result = oracle_client.request_signature(&selector, &domain).await?; + info!(LOG, "DKIM oracle result {:?}", oracle_result); + + // Process oracle response + let public_key_hash = hex::decode(&oracle_result.public_key_hash[2..])?; + info!(LOG, "public_key_hash from oracle {:?}", public_key_hash); + let signature = Bytes::from_hex(&oracle_result.signature[2..])?; + info!(LOG, "signature {:?}", signature); + + // Set DKIM public key hash + let tx_hash = chain_client + .set_dkim_public_key_hash( + selector, + domain, + TryInto::<[u8; 32]>::try_into(public_key_hash).unwrap(), + signature, + dkim, + ) + .await?; + info!(LOG, "DKIM registry updated {:?}", tx_hash); + Ok(()) +} diff --git a/packages/relayer/src/handler.rs b/packages/relayer/src/handler.rs index 53002d87..90ff686a 100644 --- a/packages/relayer/src/handler.rs +++ b/packages/relayer/src/handler.rs @@ -1,17 +1,23 @@ use std::sync::Arc; -use axum::{extract::State, http::StatusCode, response::IntoResponse, Json}; +use axum::{ + body::Body, + extract::State, + http::{request, StatusCode}, + response::IntoResponse, + Json, +}; use regex::Regex; use relayer_utils::{field_to_hex, ParsedEmail, LOG}; use serde_json::{json, Value}; -use slog::info; +use slog::{error, info, trace}; use uuid::Uuid; use crate::{ - mail::handle_email_event, - model::{create_request, update_request, RequestStatus}, + command::parse_command_template, + mail::{handle_email, handle_email_event, EmailEvent}, + model::{create_request, get_request, update_request, RequestStatus}, schema::EmailTxAuthSchema, - utils::parse_command_template, RelayerState, }; @@ -32,14 +38,16 @@ pub async fn submit_handler( ) -> Result)> { info!(LOG, "Payload: {:?}", body); - let uuid = create_request(&relayer_state.db).await.map_err(|e| { - ( - axum::http::StatusCode::INTERNAL_SERVER_ERROR, - axum::Json(json!({"error": e.to_string()})), - ) - })?; + let uuid = create_request(&relayer_state.db, &body) + .await + .map_err(|e| { + ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(json!({"error": e.to_string()})), + ) + })?; - let command = parse_command_template(&body.command_template, &body.command_params); + let command = parse_command_template(&body.command_template, body.command_params); let account_code = if body.code_exists_in_email { let hex_code = field_to_hex(&body.account_code.clone().0); @@ -49,7 +57,7 @@ pub async fn submit_handler( }; handle_email_event( - crate::mail::EmailEvent::Command { + EmailEvent::Command { request_id: uuid, email_address: body.email_address.clone(), command, @@ -79,8 +87,25 @@ pub async fn submit_handler( pub async fn receive_email_handler( State(relayer_state): State>, - body: String, + body: axum::body::Body, ) -> Result)> { + // Convert the body into a string + let bytes = axum::body::to_bytes(body, usize::MAX) + .await + .map_err(|err| { + ( + StatusCode::BAD_REQUEST, + axum::Json(json!({"error": format!("Failed to read request body: {}", err)})), + ) + })?; + + let email = String::from_utf8(bytes.to_vec()).map_err(|err| { + ( + StatusCode::BAD_REQUEST, + axum::Json(json!({"error": format!("Invalid UTF-8 sequence: {}", err)})), + ) + })?; + // Define the regex pattern for UUID let uuid_regex = Regex::new( r"(Your request ID is )([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})", @@ -88,7 +113,7 @@ pub async fn receive_email_handler( .unwrap(); // Attempt to find a UUID in the body - let captures = uuid_regex.captures(&body); + let captures = uuid_regex.captures(&email); let request_id = captures .and_then(|caps| caps.get(2).map(|m| m.as_str())) @@ -124,18 +149,95 @@ pub async fn receive_email_handler( })?; // Log the received body - info!(LOG, "Received email body: {:?}", body); + info!(LOG, "Received email: {:?}", email); - let parsed_email = ParsedEmail::new_from_raw_email(&body).await.map_err(|e| { + let parsed_email = ParsedEmail::new_from_raw_email(&email).await.map_err(|e| { // Convert the error to the expected type ( reqwest::StatusCode::INTERNAL_SERVER_ERROR, axum::Json(json!({"error": e.to_string()})), ) })?; + let from_addr = match parsed_email.get_from_addr() { + Ok(addr) => addr, + Err(e) => { + return Err(( + reqwest::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(json!({"error": e.to_string()})), + )) + } + }; + let original_subject = match parsed_email.get_subject_all() { + Ok(subject) => subject, + Err(e) => { + return Err(( + reqwest::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(json!({"error": e.to_string()})), + )) + } + }; + + // Send acknowledgment email + match handle_email_event( + EmailEvent::Ack { + email_addr: from_addr.clone(), + command: parsed_email.get_command(false).unwrap_or_default(), + original_message_id: parsed_email.get_message_id().ok(), + original_subject, + }, + (*relayer_state).clone(), + ) + .await + { + Ok(_) => { + trace!(LOG, "Ack email event sent"); + } + Err(e) => { + error!(LOG, "Error handling email event: {:?}", e); + } + } + + let request = get_request(&relayer_state.db, request_id) + .await + .map_err(|e| { + // Convert the error to the expected type + ( + reqwest::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(json!({"error": e.to_string()})), + ) + })?; - // Process the body as needed - // For example, you might want to parse it or pass it to another function + // Process the email + match handle_email(email, request, (*relayer_state).clone()).await { + Ok(event) => match handle_email_event(event, (*relayer_state).clone()).await { + Ok(_) => {} + Err(e) => { + error!(LOG, "Error handling email event: {:?}", e); + } + }, + Err(e) => { + error!(LOG, "Error handling email: {:?}", e); + let original_subject = parsed_email + .get_subject_all() + .unwrap_or("Unknown Error".to_string()); + match handle_email_event( + EmailEvent::Error { + email_addr: from_addr, + error: e.to_string(), + original_subject, + original_message_id: parsed_email.get_message_id().ok(), + }, + (*relayer_state).clone(), + ) + .await + { + Ok(_) => {} + Err(e) => { + error!(LOG, "Error handling email event: {:?}", e); + } + } + } + } let response = json!({ "status": "success", diff --git a/packages/relayer/src/mail.rs b/packages/relayer/src/mail.rs index 4ca859a1..17b41d3d 100644 --- a/packages/relayer/src/mail.rs +++ b/packages/relayer/src/mail.rs @@ -1,6 +1,7 @@ use std::path::PathBuf; use anyhow::Result; +use ethers::types::U256; use handlebars::Handlebars; use relayer_utils::ParsedEmail; use serde::{Deserialize, Serialize}; @@ -10,8 +11,12 @@ use tokio::fs::read_to_string; use uuid::Uuid; use crate::{ - config::PathConfig, - model::{insert_expected_reply, is_valid_reply, update_request, RequestStatus}, + abis::{EmailAuthMsg, EmailProof}, + chain::ChainClient, + command::get_encoded_command_params, + dkim::check_and_update_dkim, + model::{insert_expected_reply, is_valid_reply, update_request, RequestModel, RequestStatus}, + prove::generate_email_proof, RelayerState, }; @@ -52,7 +57,12 @@ pub enum EmailEvent { original_message_id: Option, original_subject: String, }, - Completion {}, + Completion { + email_addr: String, + request_id: Uuid, + original_subject: String, + original_message_id: Option, + }, Error { email_addr: String, error: String, @@ -96,7 +106,6 @@ pub async fn handle_email_event(event: EmailEvent, relayer_state: RelayerState) // Prepare data for HTML rendering let render_data = serde_json::json!({ - "userEmailAddr": email_address, "body": body, "requestId": request_id, "command": command, @@ -124,79 +133,104 @@ pub async fn handle_email_event(event: EmailEvent, relayer_state: RelayerState) update_request(&relayer_state.db, request_id, RequestStatus::EmailSent).await?; } + EmailEvent::Completion { + email_addr, + request_id, + original_subject, + original_message_id, + } => { + let subject = format!("Re: {}", original_subject); + let body_plain = format!("Your request ID is #{} is now complete.", request_id); + + // Prepare data for HTML rendering + let render_data = serde_json::json!({ + "requestId": request_id, + }); + let body_html = render_html( + "acceptance_success.html", + render_data, + relayer_state.clone(), + ) + .await?; + + // Create and send the email + let email = EmailMessage { + to: email_addr, + subject: subject.to_string(), + reference: original_message_id.clone(), + reply_to: original_message_id, + body_plain, + body_html, + body_attachments: None, + }; + + send_email(email, None, relayer_state).await?; + } EmailEvent::Ack { email_addr, command, original_message_id, original_subject, - } => todo!(), - EmailEvent::Completion {} => todo!(), + } => { + let body_plain = format!( + "Hi {}!\nYour email with the command {} is received.", + email_addr, command + ); + // Prepare data for HTML rendering + let render_data = serde_json::json!({"request": command}); + let body_html = render_html( + "acknowledgement_template.html", + render_data, + relayer_state.clone(), + ) + .await?; + let subject = format!("Re: {}", original_subject); + // Create and send the email + let email = EmailMessage { + to: email_addr, + subject, + body_plain, + body_html, + reference: original_message_id.clone(), + reply_to: original_message_id, + body_attachments: None, + }; + send_email(email, None, relayer_state).await?; + } EmailEvent::Error { email_addr, error, original_subject, original_message_id, - } => todo!(), // EmailEvent::Ack { - // email_addr, - // command, - // original_message_id, - // original_subject, - // } => { - // let body_plain = format!( - // "Hi {}!\nYour email with the command {} is received.", - // email_addr, command - // ); - // // Prepare data for HTML rendering - // let render_data = serde_json::json!({"userEmailAddr": email_addr, "request": command}); - // let body_html = render_html("acknowledgement.html", render_data).await?; - // let subject = format!("Re: {}", original_subject); - // // Create and send the email - // let email = EmailMessage { - // to: email_addr, - // subject, - // body_plain, - // body_html, - // reference: original_message_id.clone(), - // reply_to: original_message_id, - // body_attachments: None, - // }; - // send_email(email, None).await?; - // } - // EmailEvent::Completion {} => {} - // EmailEvent::Error { - // email_addr, - // error, - // original_subject, - // original_message_id, - // } => { - // let subject = format!("Re: {}", original_subject); - - // let body_plain = format!( - // "An error occurred while processing your request. \ - // Error: {}", - // error - // ); - - // // Prepare data for HTML rendering - // let render_data = serde_json::json!({ - // "error": error, - // "userEmailAddr": email_addr, - // }); - // let body_html = render_html("error.html", render_data).await?; - - // // Create and send the email - // let email = EmailMessage { - // to: email_addr, - // subject, - // reference: original_message_id.clone(), - // reply_to: original_message_id, - // body_plain, - // body_html, - // body_attachments: None, - // }; - - // send_email(email, None).await?; - // } + } => { + let subject = format!("Re: {}", original_subject); + + let body_plain = format!( + "An error occurred while processing your request. \ + Error: {}", + error + ); + + // Prepare data for HTML rendering + let render_data = serde_json::json!({ + "error": error, + "userEmailAddr": email_addr, + }); + let body_html = render_html("error.html", render_data, relayer_state.clone()).await?; + + // Create and send the email + let email = EmailMessage { + to: email_addr, + subject, + reference: original_message_id.clone(), + reply_to: original_message_id, + body_plain, + body_html, + body_attachments: None, + }; + + send_email(email, None, relayer_state).await?; + } } Ok(()) @@ -332,3 +366,61 @@ pub async fn check_is_valid_request(email: &ParsedEmail, pool: &PgPool) -> Resul let is_valid = is_valid_reply(pool, &reply_message_id).await?; Ok(is_valid) } + +pub async fn handle_email( + email: String, + request: RequestModel, + relayer_state: RelayerState, +) -> Result { + let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; + + let chain_client = ChainClient::setup( + request.clone().email_tx_auth.chain, + relayer_state.clone().config.chains, + ) + .await?; + + check_and_update_dkim( + &parsed_email, + request.email_tx_auth.email_auth_contract_address, + chain_client.clone(), + relayer_state.clone(), + ) + .await?; + + let email_auth_msg = get_email_auth_msg(&email, request.clone(), relayer_state).await?; + + chain_client.call(request.clone(), email_auth_msg).await?; + + Ok(EmailEvent::Completion { + email_addr: parsed_email.get_from_addr()?, + request_id: request.id, + original_subject: parsed_email.get_subject_all()?, + original_message_id: parsed_email.get_message_id().ok(), + }) +} + +/// Generates the email authentication message. +/// +/// # Arguments +/// +/// * `params` - The `EmailRequestContext` containing request details. +/// +/// # Returns +/// +/// A `Result` containing the `EmailAuthMsg`, `EmailProof`, and account salt, or an `EmailError`. +async fn get_email_auth_msg( + email: &str, + request: RequestModel, + relayer_state: RelayerState, +) -> Result { + let command_params_encoded = get_encoded_command_params(email, request.clone()).await?; + let email_proof = generate_email_proof(email, request.clone(), relayer_state).await?; + let email_auth_msg = EmailAuthMsg { + template_id: request.email_tx_auth.template_id.into(), + command_params: command_params_encoded, + skipped_command_prefix: U256::zero(), + proof: email_proof, + }; + Ok(email_auth_msg) +} diff --git a/packages/relayer/src/main.rs b/packages/relayer/src/main.rs index ca490f21..e931a39d 100644 --- a/packages/relayer/src/main.rs +++ b/packages/relayer/src/main.rs @@ -1,10 +1,16 @@ +mod abis; +mod chain; +mod command; mod config; +mod constants; +mod dkim; mod handler; mod mail; mod model; +mod prove; mod route; mod schema; -mod utils; +mod statics; use std::sync::Arc; diff --git a/packages/relayer/src/model.rs b/packages/relayer/src/model.rs index 3070c8a9..b2f27f64 100644 --- a/packages/relayer/src/model.rs +++ b/packages/relayer/src/model.rs @@ -1,15 +1,23 @@ +use std::fmt::Display; + use anyhow::{Error, Ok, Result}; +use chrono::{DateTime, NaiveDateTime, Utc}; use serde::{Deserialize, Serialize}; -use sqlx::{FromRow, PgPool, Row}; +use sqlx::types::Json; +use sqlx::{FromRow, PgPool}; use uuid::Uuid; -#[derive(Debug, FromRow, Deserialize, Serialize)] +use crate::schema::EmailTxAuthSchema; + +#[derive(Debug, FromRow, Deserialize, Serialize, Clone)] #[allow(non_snake_case)] pub struct RequestModel { pub id: Uuid, pub status: String, #[serde(rename = "updatedAt")] - pub updated_at: Option>, + pub updated_at: Option, + #[serde(rename = "emailTxAuth")] + pub email_tx_auth: EmailTxAuthSchema, } #[derive(Debug, FromRow, Deserialize, Serialize)] @@ -39,10 +47,32 @@ pub enum RequestStatus { Finished, } -pub async fn create_request(pool: &PgPool) -> Result { - let query_result = sqlx::query!("INSERT INTO requests DEFAULT VALUES RETURNING id") - .fetch_one(pool) - .await?; +impl std::fmt::Display for RequestStatus { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "{:?}", self) + } +} + +impl From for String { + fn from(status: RequestStatus) -> Self { + status.to_string() + } +} + +impl From> for EmailTxAuthSchema { + fn from(json: sqlx::types::Json) -> Self { + json.0 + } +} + +pub async fn create_request(pool: &PgPool, email_tx_auth: &EmailTxAuthSchema) -> Result { + // Assuming the database column is of type JSONB and can directly accept the struct + let query_result = sqlx::query!( + "INSERT INTO requests (email_tx_auth) VALUES ($1) RETURNING id", + serde_json::to_value(email_tx_auth)? // Convert struct to JSON for insertion + ) + .fetch_one(pool) + .await?; Ok(query_result.id) } @@ -60,6 +90,27 @@ pub async fn update_request(pool: &PgPool, request_id: Uuid, status: RequestStat Ok(()) } +pub async fn get_request(pool: &PgPool, request_id: Uuid) -> Result { + let query_result = sqlx::query_as!( + RequestModel, + r#" + SELECT + id, + status as "status: RequestStatus", + updated_at::timestamp as "updated_at: NaiveDateTime", + email_tx_auth as "email_tx_auth: Json" + FROM requests + WHERE id = $1 + "#, + request_id + ) + .fetch_optional(pool) + .await?; + + // If query_result is None, it means no row was found for the given request_id + query_result.ok_or_else(|| sqlx::Error::RowNotFound) +} + pub async fn insert_expected_reply( pool: &PgPool, message_id: &str, diff --git a/packages/relayer/src/prove.rs b/packages/relayer/src/prove.rs new file mode 100644 index 00000000..d04ff32e --- /dev/null +++ b/packages/relayer/src/prove.rs @@ -0,0 +1,69 @@ +use anyhow::{anyhow, Result}; +use ethers::types::U256; +use relayer_utils::{ + generate_email_circuit_input, generate_proof, hex_to_field, u256_to_bytes32, + u256_to_bytes32_little, AccountCode, AccountSalt, EmailCircuitParams, ParsedEmail, LOG, +}; +use slog::info; + +use crate::{ + abis::EmailProof, + command::get_masked_command, + constants::{COMMAND_FIELDS, DOMAIN_FIELDS, SHA_PRECOMPUTE_SELECTOR}, + model::RequestModel, + RelayerState, +}; + +/// Generates the email proof for authentication. +/// +/// # Arguments +/// +/// * `params` - The `EmailRequestContext` containing request details. +/// +/// # Returns +/// +/// A `Result` containing the `EmailProof` and account salt, or an `EmailError`. +pub async fn generate_email_proof( + email: &str, + request: RequestModel, + relayer_state: RelayerState, +) -> Result { + let parsed_email = ParsedEmail::new_from_raw_email(&email).await?; + let circuit_input = generate_email_circuit_input( + &email, + &request.email_tx_auth.account_code, + Some(EmailCircuitParams { + max_header_length: Some(1024), + max_body_length: Some(1024), + sha_precompute_selector: Some(SHA_PRECOMPUTE_SELECTOR.to_string()), + ignore_body_hash_check: Some(false), + }), + ) + .await?; + + let (proof, public_signals) = generate_proof( + &circuit_input, + "email_auth", + &relayer_state.config.prover_url, + ) + .await?; + + info!(LOG, "Public signals: {:?}", public_signals); + + let account_salt = u256_to_bytes32(&public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 3]); + let is_code_exist = public_signals[COMMAND_FIELDS + DOMAIN_FIELDS + 4] == 1u8.into(); + let masked_command = get_masked_command(public_signals.clone(), DOMAIN_FIELDS + 3)?; + + let email_proof = EmailProof { + proof, + domain_name: parsed_email.get_email_domain()?, + public_key_hash: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 0]), + timestamp: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 2]).into(), + masked_command, + email_nullifier: u256_to_bytes32(&public_signals[DOMAIN_FIELDS + 1]), + account_salt, + is_code_exist, + }; + + Ok((email_proof)) +} diff --git a/packages/relayer/src/schema.rs b/packages/relayer/src/schema.rs index bb396c1d..c562fb6c 100644 --- a/packages/relayer/src/schema.rs +++ b/packages/relayer/src/schema.rs @@ -1,27 +1,31 @@ use std::collections::HashMap; -use ethers::{abi::Item, types::Address}; +use ethers::{ + abi::{Abi, Function, Token}, + types::Address, +}; use relayer_utils::AccountCode; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; -#[derive(Deserialize, Debug)] +#[derive(Deserialize, Serialize, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct EmailTxAuthSchema { pub contract_address: Address, pub email_auth_contract_address: Address, pub account_code: AccountCode, pub code_exists_in_email: bool, - pub function_abi: Item, + pub function_abi: Function, pub command_template: String, - pub command_params: HashMap, - pub remaining_args: HashMap, + pub command_params: Vec, + pub template_id: usize, + pub remaining_args: Vec, pub email_address: String, pub subject: String, pub body: String, pub chain: String, } -#[derive(Deserialize, Debug)] +#[derive(Deserialize, Debug, Serialize)] #[serde(rename_all = "camelCase")] pub struct DKIMSchema { dkim_contract_address: Address, diff --git a/packages/relayer/src/statics.rs b/packages/relayer/src/statics.rs new file mode 100644 index 00000000..46a7cec7 --- /dev/null +++ b/packages/relayer/src/statics.rs @@ -0,0 +1,7 @@ +use std::sync::{Arc, Mutex}; + +use lazy_static::lazy_static; + +lazy_static! { + pub static ref SHARED_MUTEX: Arc> = Arc::new(Mutex::new(0)); +} diff --git a/packages/relayer/src/utils.rs b/packages/relayer/src/utils.rs deleted file mode 100644 index 8ddadd18..00000000 --- a/packages/relayer/src/utils.rs +++ /dev/null @@ -1,12 +0,0 @@ -use std::collections::HashMap; - -pub fn parse_command_template(template: &str, params: &HashMap) -> String { - let mut parsed_string = template.to_string(); - - for (key, value) in params { - let placeholder = format!("${{{}}}", key); - parsed_string = parsed_string.replace(&placeholder, value); - } - - parsed_string -} From a32543a73c5071582ca0f7a56f3eab58fd622de9 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Fri, 11 Oct 2024 20:07:58 +0700 Subject: [PATCH 112/121] fix: use tokio mutex --- packages/relayer/src/chain.rs | 4 +--- packages/relayer/src/handler.rs | 28 +++++----------------------- packages/relayer/src/statics.rs | 3 ++- 3 files changed, 8 insertions(+), 27 deletions(-) diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index 3d2fa6b8..ac2f35a7 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -65,9 +65,7 @@ impl ChainClient { dkim: ECDSAOwnedDKIMRegistry, ) -> Result { // Mutex is used to prevent nonce conflicts. - let mut mutex = SHARED_MUTEX - .lock() - .map_err(|e| anyhow::anyhow!("Mutex poisoned: {}", e))?; + let mut mutex = SHARED_MUTEX.lock().await; *mutex += 1; // Call the contract method diff --git a/packages/relayer/src/handler.rs b/packages/relayer/src/handler.rs index 90ff686a..83274a3c 100644 --- a/packages/relayer/src/handler.rs +++ b/packages/relayer/src/handler.rs @@ -1,7 +1,6 @@ use std::sync::Arc; use axum::{ - body::Body, extract::State, http::{request, StatusCode}, response::IntoResponse, @@ -87,25 +86,8 @@ pub async fn submit_handler( pub async fn receive_email_handler( State(relayer_state): State>, - body: axum::body::Body, + body: String, ) -> Result)> { - // Convert the body into a string - let bytes = axum::body::to_bytes(body, usize::MAX) - .await - .map_err(|err| { - ( - StatusCode::BAD_REQUEST, - axum::Json(json!({"error": format!("Failed to read request body: {}", err)})), - ) - })?; - - let email = String::from_utf8(bytes.to_vec()).map_err(|err| { - ( - StatusCode::BAD_REQUEST, - axum::Json(json!({"error": format!("Invalid UTF-8 sequence: {}", err)})), - ) - })?; - // Define the regex pattern for UUID let uuid_regex = Regex::new( r"(Your request ID is )([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})", @@ -113,7 +95,7 @@ pub async fn receive_email_handler( .unwrap(); // Attempt to find a UUID in the body - let captures = uuid_regex.captures(&email); + let captures = uuid_regex.captures(&body); let request_id = captures .and_then(|caps| caps.get(2).map(|m| m.as_str())) @@ -149,9 +131,9 @@ pub async fn receive_email_handler( })?; // Log the received body - info!(LOG, "Received email: {:?}", email); + info!(LOG, "Received email body: {:?}", body); - let parsed_email = ParsedEmail::new_from_raw_email(&email).await.map_err(|e| { + let parsed_email = ParsedEmail::new_from_raw_email(&body).await.map_err(|e| { // Convert the error to the expected type ( reqwest::StatusCode::INTERNAL_SERVER_ERROR, @@ -208,7 +190,7 @@ pub async fn receive_email_handler( })?; // Process the email - match handle_email(email, request, (*relayer_state).clone()).await { + match handle_email(body, request, (*relayer_state).clone()).await { Ok(event) => match handle_email_event(event, (*relayer_state).clone()).await { Ok(_) => {} Err(e) => { diff --git a/packages/relayer/src/statics.rs b/packages/relayer/src/statics.rs index 46a7cec7..ba542e6f 100644 --- a/packages/relayer/src/statics.rs +++ b/packages/relayer/src/statics.rs @@ -1,4 +1,5 @@ -use std::sync::{Arc, Mutex}; +use std::sync::Arc; +use tokio::sync::Mutex; use lazy_static::lazy_static; From 8d8e520015d64344c6af3065fbcbe2fedfd9847c Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Fri, 11 Oct 2024 20:10:45 +0700 Subject: [PATCH 113/121] feat: add status api --- packages/relayer/src/handler.rs | 34 +++++++++++++++++++++++++++++++++ packages/relayer/src/route.rs | 5 ++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/relayer/src/handler.rs b/packages/relayer/src/handler.rs index 83274a3c..5974fd7e 100644 --- a/packages/relayer/src/handler.rs +++ b/packages/relayer/src/handler.rs @@ -228,3 +228,37 @@ pub async fn receive_email_handler( Ok((StatusCode::OK, Json(response))) } + +pub async fn get_status_handler( + State(relayer_state): State>, + request: request::Parts, +) -> Result)> { + let request_id = request + .uri + .path() + .trim_start_matches("/api/status/") + .parse::() + .map_err(|_| { + ( + reqwest::StatusCode::BAD_REQUEST, + axum::Json(json!({"error": "Failed to parse request ID"})), + ) + })?; + + let request = get_request(&relayer_state.db, request_id) + .await + .map_err(|e| { + ( + reqwest::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(json!({"error": e.to_string()})), + ) + })?; + + let response = json!({ + "status": "success", + "message": "request status", + "request": request, + }); + + Ok((StatusCode::OK, Json(response))) +} diff --git a/packages/relayer/src/route.rs b/packages/relayer/src/route.rs index 0a6d8723..0f66dfd3 100644 --- a/packages/relayer/src/route.rs +++ b/packages/relayer/src/route.rs @@ -6,7 +6,7 @@ use axum::{ }; use crate::{ - handler::{health_checker_handler, receive_email_handler, submit_handler}, + handler::{get_status_handler, health_checker_handler, receive_email_handler, submit_handler}, RelayerState, }; @@ -15,7 +15,6 @@ pub fn create_router(relayer_state: Arc) -> Router { .route("/api/healthz", get(health_checker_handler)) .route("/api/submit", post(submit_handler)) .route("/api/receiveEmail", post(receive_email_handler)) - // .route("/api/status/:id", get(get_status_handler)) - // .route("/api/addDKIMKey", post(add_dkim_key_handler)) + .route("/api/status/:id", get(get_status_handler)) .with_state(relayer_state) } From 3c306b0b60531b8c7d6afcc3a3f34f848d6b7085 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Fri, 11 Oct 2024 23:51:19 +0900 Subject: [PATCH 114/121] Fix circom version --- .github/workflows/unit-tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 3d784ba0..cd011de8 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -21,9 +21,9 @@ jobs: override: true components: rustfmt, clippy - - name: Download circom (Linux) - run: git clone https://github.com/iden3/circom.git && cd circom && cargo build --release && cargo install --path circom - + - name: Download circom v2.1.8 (Linux) + run: wget https://github.com/iden3/circom/releases/download/v2.1.8/circom-linux-amd64 -O /usr/local/bin/circom && chmod +x /usr/local/bin/circom + - name: Print circom version run: circom --version From 0a458c8c274c7d4f3066236dfb0c34fe2b54155d Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Sat, 12 Oct 2024 19:23:08 +0700 Subject: [PATCH 115/121] fix: update schema --- packages/relayer/src/chain.rs | 7 +++++-- packages/relayer/src/schema.rs | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index ac2f35a7..64f214fa 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -162,13 +162,16 @@ impl ChainClient { // Convert each arg to a Token. This conversion depends on the type of arg. // For example, if arg is a string, you might use Token::String(arg). // Adjust the conversion based on the actual type of arg. - let token = Token::from(arg); // Replace with appropriate conversion + let token = Token::from(arg); tokens.push(token); } // Now you can use the tokens vector to call the contract function let call = contract.method::<_, ()>(&function.name, tokens)?; - let _result = call.send().await?; + + let tx = call.send().await?; + let receipt = tx.await?; + Ok(()) } } diff --git a/packages/relayer/src/schema.rs b/packages/relayer/src/schema.rs index c562fb6c..ae2c7423 100644 --- a/packages/relayer/src/schema.rs +++ b/packages/relayer/src/schema.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use ethers::{ abi::{Abi, Function, Token}, - types::Address, + types::{Address, U256}, }; use relayer_utils::AccountCode; use serde::{Deserialize, Serialize}; @@ -17,7 +17,7 @@ pub struct EmailTxAuthSchema { pub function_abi: Function, pub command_template: String, pub command_params: Vec, - pub template_id: usize, + pub template_id: U256, pub remaining_args: Vec, pub email_address: String, pub subject: String, From 8e9fc0c9e08435800b6e5d80a6f9659575df8c44 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Mon, 14 Oct 2024 12:10:47 +0900 Subject: [PATCH 116/121] Fix circom test in github action --- .github/workflows/unit-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 3d784ba0..4b084cf2 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -21,8 +21,8 @@ jobs: override: true components: rustfmt, clippy - - name: Download circom (Linux) - run: git clone https://github.com/iden3/circom.git && cd circom && cargo build --release && cargo install --path circom + - name: Download circom v2.1.8 (Linux) + run: wget https://github.com/iden3/circom/releases/download/v2.1.8/circom-linux-amd64 -O /usr/local/bin/circom && chmod +x /usr/local/bin/circom - name: Print circom version run: circom --version From 230951b480efe13a0f03d157e949d0da8cf6a054 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Mon, 14 Oct 2024 15:01:34 +0900 Subject: [PATCH 117/121] Add example contract --- .gitignore | 5 + example/contracts/README.md | 496 +++++++++++++++++++ example/contracts/foundry.toml | 53 +++ example/contracts/package.json | 24 + example/contracts/remappings.txt | 9 + example/contracts/src/EmitEmailCommand.sol | 212 +++++++++ example/contracts/yarn.lock | 526 +++++++++++++++++++++ example/scripts/package.json | 8 + 8 files changed, 1333 insertions(+) create mode 100644 example/contracts/README.md create mode 100644 example/contracts/foundry.toml create mode 100644 example/contracts/package.json create mode 100644 example/contracts/remappings.txt create mode 100644 example/contracts/src/EmitEmailCommand.sol create mode 100644 example/contracts/yarn.lock create mode 100644 example/scripts/package.json diff --git a/.gitignore b/.gitignore index 11170544..bd746ae9 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,8 @@ book # For zksync zkout .cache + +# Example +example/contracts/artifacts +example/contracts/cache +example/contracts/node_modules diff --git a/example/contracts/README.md b/example/contracts/README.md new file mode 100644 index 00000000..0df21735 --- /dev/null +++ b/example/contracts/README.md @@ -0,0 +1,496 @@ +## Set up + +```bash +yarn install +``` + +## Requirements +- Newer than or equal to `forge 0.2.0 (13497a5)`. + +## Build and Test + +Make sure you have [Foundry](https://github.com/foundry-rs/foundry) installed + +Build the contracts using the below command. + +```bash +$ yarn build +``` + +Run unit tests +```bash +$ yarn test +``` + +Run integration tests + +Before running integration tests, you need to make a `packages/contracts/test/build_integration` directory, download the zip file from the following link, and place its unzipped directory under that directory. +https://drive.google.com/file/d/1XDPFIL5YK8JzLGoTjmHLXO9zMDjSQcJH/view?usp=sharing + +Then, move `email_auth_with_body_parsing_with_qp_encoding.zkey` and `email_auth_with_body_parsing_with_qp_encoding.wasm` in the unzipped directory `params` to `build_integration`. + + +Run each integration tests **one by one** as each test will consume a lot of memory. +```bash +Eg: contracts % forge test --skip '*ZKSync*' --match-contract "IntegrationTest" -vvv --chain 8453 --ffi +``` +#### Deploy Common Contracts. +You need to deploy common contracts, i.e., `ECDSAOwnedDKIMRegistry`, `Verifier`, and implementations of `EmailAuth` and `SimpleWallet`, only once before deploying each wallet. +1. `cp .env.sample .env`. +2. Write your private key in hex to the `PRIVATE_KEY` field in `.env`. If you want to verify your own contracts, you can set `ETHERSCAN_API_KEY` to your own key. +3. `source .env` +4. `forge script script/DeployCommons.s.sol:Deploy --rpc-url $RPC_URL --chain-id $CHAIN_ID --etherscan-api-key $ETHERSCAN_API_KEY --broadcast --verify -vvvv` + +#### Deploy Each Wallet. +After deploying common contracts, you can deploy a proxy contract of `SimpleWallet`, which is an example contract supporting our email-based account recovery by `RecoveryController`. +1. Check that the env values of `DKIM`, `VERIFIER`, `EMAIL_AUTH_IMPL`, and `SIMPLE_WALLET_IMPL` are the same as those output by the `DeployCommons.s.sol` script. +2. `forge script script/DeployRecoveryController.s.sol:Deploy --rpc-url $RPC_URL --chain-id $CHAIN_ID --broadcast -vvvv` + +## Specification +There are four main contracts that developers should understand: `IDKIMRegistry`, `Verifier`, `EmailAuth` and `EmailAccountRecovery`. +While the first three contracts are agnostic to use cases of our SDK, the last one is an abstract contract only for our email-based account recovery. + +### `IDKIMRegistry` Contract +It is an interface of the DKIM registry contract that traces public keys registered for each email domain in DNS. +It is defined in [the zk-email library](https://github.com/zkemail/zk-email-verify/blob/main/packages/contracts/interfaces/IDKIMRegistry.sol). +It requires a function `isDKIMPublicKeyHashValid(string domainName, bytes32 publicKeyHash) view returns (bool)`: it returns true if the given hash of the public key `publicKeyHash` is registered for the given email-domain name `domainName`. + +One of its implementations is [`ECDSAOwnedDKIMRegistry`](https://github.com/zkemail/ether-email-auth/blob/main/packages/contracts/src/utils/ECDSAOwnedDKIMRegistry.sol). +It stores the Ethereum address `signer` who can update the registry. + +We also provide another implementation called [`ForwardDKIMRegistry`](https://github.com/zkemail/ether-email-auth/blob/main/packages/contracts/src/utils/ForwardDKIMRegistry.sol). It stores an address of any internal DKIM registry and forwards its outputs. We can use it to upgrade a proxy of the ECDSAOwnedDKIMRegistry registry to a new DKIM registry with a different storage slots design by 1) upgrading its implementation into ForwardDKIMRegistry and 2) calling `resetStorageForUpgradeFromECDSAOwnedDKIMRegistry` function with an address of the internal DKIM registry. + +### `Verifier` Contract +It has the responsibility to verify a ZK proof for the [`email_auth_with_body_parsing_with_qp_encoding.circom` circuit](https://github.com/zkemail/ether-email-auth/blob/main/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom). +It is implemented in [`utils/Verifier.sol`](https://github.com/zkemail/ether-email-auth/blob/main/packages/contracts/src/utils/Verifier.sol). + +It defines a structure `EmailProof` consisting of the ZK proof and data of the instances necessary for proof verification as follows: +``` +struct EmailProof { + string domainName; // Domain name of the sender's email + bytes32 publicKeyHash; // Hash of the DKIM public key used in email/proof + uint timestamp; // Timestamp of the email + string maskedCommand; // Masked command of the email + bytes32 emailNullifier; // Nullifier of the email to prevent its reuse. + bytes32 accountSalt; // Create2 salt of the account + bool isCodeExist; // Check if the account code exists + bytes proof; // ZK Proof of Email +} +``` + +Using that, it provides a function `function verifyEmailProof(EmailProof memory proof) public view returns (bool)`: it takes as input the `EmailProof proof` and returns true if the proof is valid. Notably, it internally calls [`Groth16Verifier.sol`](https://github.com/zkemail/ether-email-auth/blob/main/packages/contracts/src/utils/Groth16Verifier.sol) generated by snarkjs from the verifying key of the [`email_auth_with_body_parsing_with_qp_encoding.circom` circuit](https://github.com/zkemail/ether-email-auth/blob/main/packages/circuits/src/email_auth_with_body_parsing_with_qp_encoding.circom). + +### `EmailAuth` Contract +It is a contract deployed for each email user to verify an email-auth message from that user. The structure of the email-auth message is defined as follows: +``` +struct EmailAuthMsg { + uint templateId; // The ID of the command template that the email command should satisfy. + bytes[] commandParams; // The parameters in the email command, which should be taken according to the specified command template. + uint skippedCommandPrefix; // The number of skipped bytes in the email command. + EmailProof proof; // The email proof containing the zk proof and other necessary information for the email verification by the verifier contract. +} +``` + +It has the following storage variables. +- `address owner`: an address of the contract owner. +- `bytes32 accountSalt`: an `accountSalt` used for the CREATE2 salt of this contract. +- `DKIMRegistry dkim`: an instance of the DKIM registry contract. +- `Verifier verifier`: an instance of the Verifier contract. +- `address controller`: an address of a controller contract, defining the command templates supported by this contract. +- `mapping(uint=>string[]) commandTemplates`: a mapping of the supported command templates associated with its ID. +- `mapping(bytes32⇒bytes32) authedHash`: a mapping of the hash of the authorized message associated with its `emailNullifier`. +- `uint lastTimestamp`: the latest `timestamp` in the verified `EmailAuthMsg`. +- `mapping(bytes32=>bool) usedNullifiers`: a mapping storing the used `emailNullifier` bytes. +- `bool timestampCheckEnabled`: a boolean whether timestamp check is enabled or not. + +It provides the following functions. +- `initialize(address _initialOwner, bytes32 _accountSalt, address _controller)` + 1. Set `owner=_initialOwner` . + 2. Set `accountSalt=_accountSalt`. + 3. Set `timestampCheckEnabled=true`. + 4. Set `controller=_controller`. +- `dkimRegistryAddr() view returns (address)` + Return `address(dkim)` +- `verifierAddr() view returns (address)` + Return `address(verifier)` . +- `initDKIMRegistry(address _dkimRegistryAddr)` + 1. Assert `msg.sender==controller`. + 2. Assert `dkim` is zero. + 3. Set `dkim=IDKIMRegistry(_dkimRegistryAddr)`. +- `initVerifier(address _verifierAddr)` + 1. Assert `msg.sender==controller`. + 2. Assert `verifier` is zero. + 3. Set `verifier=Verifier(_verifierAddr)`. +- `updateDKIMRegistry(address _dkimRegistryAddr)` + 1. Assert `msg.sender==owner`. + 2. Assert `_dkimRegistryAddr` is not zero. + 3. Set `dkim=DKIMRegistry(_dkimRegistryAddr)`. +- `updateVerifier(address _verifier)` + 1. Assert `msg.sender==owner`. + 2. Assert `_verifier` is not zero. + 3. Set `verifier=Verifier(_verifier)`. +- `updateVerifier(address _verifierAddr)` + 1. Assert `msg.sender==owner` . + 2. Assert `_verifierAddr!=0`. + 3. Update `verifier` to `Verifier(_verifierAddr)`. +- `updateDKIMRegistry(address _dkimRegistryAddr)` + 1. Assert `msg.sender==owner` . + 2. Assert `_dkimRegistryAddr!=0`. + 3. Update `dkim` to `DKIMRegistry(_dkimRegistryAddr)`. +- `getCommandTemplate(uint _templateId) public view returns (string[] memory)` + 1. Assert that the template for `_templateId` exists, i.e., `commandTemplates[_templateId].length >0` holds. + 2. Return `commandTemplates[_templateId]`. +- `insertCommandTemplate(uint _templateId, string[] _commandTemplate)` + 1. Assert `_commandTemplate.length>0` . + 2. Assert `msg.sender==controller`. + 3. Assert `commandTemplates[_templateId].length == 0`, i.e., no template has not been registered with `_templateId`. + 4. Set `commandTemplates[_templateId]=_commandTemplate`. +- `updateCommandTemplate(uint _templateId, string[] _commandTemplate)` + 1. Assert `_commandTemplate.length>0` . + 2. Assert `msg.sender==controller`. + 3. Assert `commandTemplates[_templateId].length != 0` , i.e., any template has been already registered with `_templateId`. + 4. Set `commandTemplates[_templateId]=_commandTemplate`. +- `deleteCommandTemplate(uint _templateId)` + 1. Assert `msg.sender==controller`. + 2. Assert `commandTemplates[_templateId].length > 0`, i.e., any template has been already registered with `_templateId`. + 3. `delete commandTemplates[_templateId]`. +- `authEmail(EmailAuthMsg emailAuthMsg) returns (bytes32)` + 1. Assert `msg.sender==controller`. + 2. Let `string[] memory template = commandTemplates[emailAuthMsg.templateId]`. + 3. Assert `template.length > 0`. + 4. Assert `dkim.isDKIMPublicKeyHashValid(emailAuthMsg.proof.domain, emailAuthMsg.proof.publicKeyHash)==true`. + 5. Assert `usedNullifiers[emailAuthMsg.proof.emailNullifier]==false` and set `usedNullifiers[emailAuthMsg.proof.emailNullifier]` to `true`. + 6. Assert `accountSalt==emailAuthMsg.proof.accountSalt`. + 7. If `timestampCheckEnabled` is true, assert that `emailAuthMsg.proof.timestamp` is zero OR `lastTimestamp < emailAuthMsg.proof.timestamp`, and update `lastTimestamp` to `emailAuthMsg.proof.timestamp`. + 8. Construct an expected command `expectedCommand` from `template` and the values of `emailAuthMsg.commandParams`. + 9. Assert that `expectedCommand` is equal to `emailAuthMsg.proof.maskedCommand[skippedCommandPrefix:]` , i.e., the string of `emailAuthMsg.proof.maskedCommand` from the `skippedCommandPrefix`-th byte. + 10. Assert `verifier.verifyEmailProof(emailAuthMsg.proof)==true`. +- `isValidSignature(bytes32 _hash, bytes memory _signature) public view returns (bytes4 magicValue)` + 1. Parse `_signature` as `(bytes32 emailNullifier)`. + 2. If `authedHash[emailNullifier]== _hash`, return `0x1626ba7e`; otherwise return `0xffffffff`. +- `setTimestampCheckEnabled(bool enabled) public` + 1. Assert `msg.sender==controller`. + 2. Set `timestampCheckEnabled` to `enabled`. + +### `EmailAccountRecovery` Contract +It is an abstract contract for each smart account brand to implement the email-based account recovery. **Each smart account provider only needs to implement the following functions in a new contract called controller.** In the following, the `templateIdx` is different from `templateId` in the email-auth contract in the sense that the `templateIdx` is an incremental index defined for each of the command templates in `acceptanceCommandTemplates()` and `recoveryCommandTemplates()`. + +- `isActivated(address recoveredAccount) public view virtual returns (bool)`: it returns if the account to be recovered has already activated the controller (the contract implementing `EmailAccountRecovery`). +- `acceptanceCommandTemplates() public view virtual returns (string[][])`: it returns multiple command templates for an email to accept becoming a guardian (acceptance email). +- `recoveryCommandTemplates() public view virtual returns (string[][])`: it returns multiple command templates for an email to confirm the account recovery (recovery email). +- `extractRecoveredAccountFromAcceptanceCommand(bytes[] memory commandParams, uint templateIdx) public view virtual returns (address)`: it takes as input the parameters `commandParams` and the index of the chosen command template `templateIdx` in those for acceptance emails. +- `extractRecoveredAccountFromRecoveryCommand(bytes[] memory commandParams, uint templateIdx) public view virtual returns (address)`: it takes as input the parameters `commandParams` and the index of the chosen command template `templateIdx` in those for recovery emails. +- `acceptGuardian(address guardian, uint templateIdx, bytes[] commandParams, bytes32 emailNullifier) internal virtual`: it takes as input the Ethereum address `guardian` corresponding to the guardian's email address, the index `templateIdx` of the command template in the output of `acceptanceCommandTemplates()`, the parameter values of the variable parts `commandParams` in the template `acceptanceCommandTemplates()[templateIdx]`, and an email nullifier `emailNullifier`. It is called after verifying the email-auth message to accept the role of the guardian; thus you can assume the arguments are already verified. +- `processRecovery(address guardian, uint templateIdx, bytes[] commandParams, bytes32 emailNullifier) internal virtual`: it takes as input the Ethereum address `guardian` corresponding to the guardian's email address, the index `templateIdx` of the command template in the output of `recoveryCommandTemplates()`, the parameter values of the variable parts `commandParams` in the template `recoveryCommandTemplates()[templateIdx]`, and an email nullifier `emailNullifier`. It is called after verifying the email-auth message to confirm the recovery; thus you can assume the arguments are already verified. +- `completeRecovery(address account, bytes memory completeCalldata) external virtual`: it can be called by anyone, in particular a Relayer, when completing the account recovery. It should first check if the condition for the recovery of `account` holds and then update its owner's address in the wallet contract. + +It also provides the following entry functions with their default implementations, called by the Relayer. +- `handleAcceptance(EmailAuthMsg emailAuthMsg, uint templateIdx) external` + 1. Extract an account address to be recovered `recoveredAccount` by calling `extractRecoveredAccountFromAcceptanceCommand`. + 2. Let `address guardian = CREATE2(emailAuthMsg.proof.accountSalt, ERC1967Proxy.creationCode, emailAuthImplementation(), (emailAuthMsg.proof.accountSalt))`. + 3. Let `uint templateId = keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "ACCEPTANCE", templateIdx)`. + 4. Assert that `templateId` is equal to `emailAuthMsg.templateId`. + 5. Assert that `emailAuthMsg.proof.isCodeExist` is true. + 6. If the `EmailAuth` contract of `guardian` has not been deployed, deploy the proxy contract of `emailAuthImplementation()`. Its salt is `emailAuthMsg.proof.accountSalt` and its initialization parameter is `recoveredAccount`, `emailAuthMsg.proof.accountSalt`, and `address(this)`, which is a controller of the deployed contract. + 7. If the `EmailAuth` contract of `guardian` has not been deployed, call `EmailAuth(guardian).initDKIMRegistry(dkim())`. + 8. If the `EmailAuth` contract of `guardian` has not been deployed, call `EmailAuth(guardian).initVerifier(verifier())`. + 9. If the `EmailAuth` contract of `guardian` has not been deployed, for each `template` in `acceptanceCommandTemplates()` along with its index `idx`, call `EmailAuth(guardian).insertCommandTemplate(keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "ACCEPTANCE", idx), template)`. + 10. If the `EmailAuth` contract of `guardian` has not been deployed, for each `template` in `recoveryCommandTemplates()` along with its index `idx`, call `EmailAuth(guardian).insertCommandTemplate(keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "RECOVERY", idx), template)`. + 11. If the `EmailAuth` contract of `guardian` has been already deployed, assert that its `controller` is equal to `address(this)`. + 11. Assert that `EmailAuth(guardian).authEmail(emailAuthMsg)` returns no error. + 12. Call `acceptGuardian(guardian, templateIdx, emailAuthMsg.commandParams, emailAuthMsg.proof.emailNullifier)`. +- `handleRecovery(EmailAuthMsg emailAuthMsg, uint templateIdx) external` + 1. Extract an account address to be recovered `recoveredAccount` by calling `extractRecoveredAccountFromRecoveryCommand`. + 1. Let `address guardian = CREATE2(emailAuthMsg.proof.accountSalt, ERC1967Proxy.creationCode, emailAuthImplementation(), (emailAuthMsg.proof.accountSalt))`. + 2. Assert that the contract of `guardian` has been already deployed. + 3. Let `uint templateId=keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "RECOVERY", templateIdx)`. + 4. Assert that `templateId` is equal to `emailAuthMsg.templateId`. + 5. Assert that `EmailAuth(guardian).authEmail(emailAuthMsg)` returns no error. + 6. Call `processRecovery(guardian, templateIdx, emailAuthMsg.commandParams, emailAuthMsg.proof.emailNullifier)`. + +# For zkSync + +You should use foundry-zksync, the installation process is following URL. +https://github.com/matter-labs/foundry-zksync + +Current version foundry-zksync is forge 0.0.2 (6e1c282 2024-07-01T00:26:02.947919000Z) + +Now foundry-zksync supports solc 0.8.26, but it won't be automatically downloaded by foundry-zksync. +First you should compile our contracts with foundry, and then install foundry-zksync. + +``` +# Install foundry +foundryup + +cd packages/contracts +yarn build + +# Check if you have already had 0.8.26 +ls -l /Users/{USER_NAME}/Library/Application\ Support/svm/0.8.26 + +# Install foundry-zksync +cd YOUR_FOUNDRY_ZKSYNC_DIR +chmod +x ./install-foundry-zksync +./install-foundry-zksync + +# Install zksolc-bin 1.5.0 manually +# Download https://github.com/matter-labs/zksolc-bin/releases/tag/v1.5.0 +chmod a+x {BINARY_NAME} +mv {BINARY_NAME} ~/.zksync/. +``` + +In addition, there are problems with foundry-zksync. Currently, they can't resolve contracts in monorepo's node_modules. + +https://github.com/matter-labs/foundry-zksync/issues/411 + +To fix this, you should copy `node_modules` in the project root dir to `packages/contracts/node_modules`. And then you should replace `libs = ["../../node_modules", "lib"]` with `libs = ["node_modules", "lib"]` in `foundry.toml`. At the end, you should replace `../../node_modules` with `node_modules` in `remappings.txt`. + +Next, you should uncomment the following lines in `foundry.toml`. + +``` +# via-ir = true +``` + +Partial comment-out files can be found the following. Please uncomment them. +(Uncomment from `FOR_ZKSYNC:START` to `FOR_ZKSYNC:END`) + +- src/utils/ZKSyncCreate2Factory.sol +- test/helpers/DeploymentHelper.sol + +At the first forge build, you need to detect the missing libraries. + +``` +forge build --zksync --zk-detect-missing-libraries +``` + +As you saw before, you need to deploy missing libraries. +You can deploy them by the following command for example. + +``` +$ forge build --zksync --zk-detect-missing-libraries +Missing libraries detected: src/libraries/CommandUtils.sol:CommandUtils, src/libraries/DecimalUtils.sol:DecimalUtils +``` + +Run the following command in order to deploy each missing library: + +``` +forge create src/libraries/DecimalUtils.sol:DecimalUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url https://sepolia.era.zksync.dev --chain 300 --zksync +forge create src/libraries/CommandUtils.sol:CommandUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url https://sepolia.era.zksync.dev --chain 300 --zksync --libraries src/libraries/DecimalUtils.sol:DecimalUtils:{DECIMAL_UTILS_DEPLOYED_ADDRESS} +``` + +After that, you can see the following line in foundry.toml. +Also, this line is needed only for foundry-zksync, if you use foundry, please remove this line. Otherwise, the test will fail. + +``` +libraries = [ + "{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:{DEPLOYED_ADDRESS}", + "{PROJECT_DIR}/packages/contracts/src/libraries/CommandUtils.sol:CommandUtils:{DEPLOYED_ADDRESS}"] +``` + +Incidentally, the above line already exists in `foundy.toml` with it commented out, if you uncomment it by replacing `{PROJECT_DIR}` with the appropriate path, it will also work. + +About Create2, `L2ContractHelper.computeCreate2Address` should be used. +And `type(ERC1967Proxy).creationCode` doesn't work correctly in zkSync. +We need to hardcode the `type(ERC1967Proxy).creationCode` to bytecodeHash. +Perhaps that is a different value in each compiler version. + +You should replace the following line to the correct hash. +packages/contracts/src/EmailAccountRecovery.sol:L111 + +See, test/ComputeCreate2Address.t.sol + +# For zkSync testing + +Run `yarn zktest`. + +Current foundry-zksync overrides the foundry behavior. If you installed foundry-zksync, some EVM code will be different and some test cases will fail. If you want to test on other EVM, please install foundry. + +Even if the contract size is fine for EVM, it may exceed the bytecode size limit for zksync, and the test may not be executed. +Therefore, EmailAccountRecovery.t.sol has been split. + +Currently, some test cases are not working correctly because there is an issue about missing libraries. + +https://github.com/matter-labs/foundry-zksync/issues/382 + +Failing test cases are here. + +DKIMRegistryUpgrade.t.sol + +- testAuthEmail() + +EmailAuth.t.sol + +- testAuthEmail() +- testExpectRevertAuthEmailEmailNullifierAlreadyUsed() +- testExpectRevertAuthEmailInvalidEmailProof() +- testExpectRevertAuthEmailInvalidCommand() +- testExpectRevertAuthEmailInvalidTimestamp() + +EmailAuthWithUserOverrideableDkim.t.sol + +- testAuthEmail() + +# For integration testing + +To pass the integration testing, you should use era-test-node. +See the following URL and install it. +https://github.com/matter-labs/era-test-node + +Run the era-test-node + +``` +era_test_node fork https://sepolia.era.zksync.dev +``` + +You remove .zksolc-libraries-cache directory, and run the following command. + +``` +forge build --zksync --zk-detect-missing-libraries +``` + +As you saw before, you need to deploy missing libraries. +You can deploy them by the following command for example. + +``` +Missing libraries detected: src/libraries/CommandUtils.sol:CommandUtils, src/libraries/DecimalUtils.sol:DecimalUtils + +Run the following command in order to deploy each missing library: + +forge create src/libraries/DecimalUtils.sol:DecimalUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url http://127.0.0.1:8011 --chain 260 --zksync +forge create src/libraries/CommandUtils.sol:CommandUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url http://127.0.0.1:8011 --chain 260 --zksync --libraries src/libraries/DecimalUtils.sol:DecimalUtils:{DECIMAL_UTILS_DEPLOYED_ADDRESS} +``` + +Set the libraries in foundry.toml using the above deployed address. + +Due to this change in the address of the missing libraries, the value of the proxyBytecodeHash must also be changed: change the value of the proxyBytecodeHash in E-mailAccountRecoveryZKSync.sol. + +And then, run the integration testing. + +``` +forge test --match-contract "IntegrationZKSyncTest" --system-mode=true --zksync --gas-limit 1000000000 --chain 300 -vvv --ffi +``` + +# For zkSync deployment (For test net) + +You need to edit .env at first. +Second, just run the following commands with `--zksync` + +``` +source .env +forge script script/DeployRecoveryControllerZKSync.s.sol:Deploy --zksync --rpc-url $RPC_URL --broadcast --slow --via-ir --system-mode true -vvvv +``` + +As you saw before, you need to deploy missing libraries. +You can deploy them by the following command for example. + +``` +Missing libraries detected: src/libraries/CommandUtils.sol:CommandUtils, src/libraries/DecimalUtils.sol:DecimalUtils + +Run the following command in order to deploy each missing library: + +forge create src/libraries/DecimalUtils.sol:DecimalUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url https://sepolia.era.zksync.dev --chain 300 --zksync +forge create src/libraries/CommandUtils.sol:CommandUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url https://sepolia.era.zksync.dev --chain 300 --zksync --libraries src/libraries/DecimalUtils.sol:DecimalUtils:{DECIMAL_UTILS_DEPLOYED_ADDRESS} +``` + +After that, you can see the following line in foundry.toml. +Also, this line is needed only for foundry-zksync, if you use foundry, please remove this line. Otherwise, the test will fail. + +``` +libraries = [ + "{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:{DEPLOYED_ADDRESS}", + "{PROJECT_DIR}/packages/contracts/src/libraries/CommandUtils.sol:CommandUtils:{DEPLOYED_ADDRESS}"] +``` + +Incidentally, the above line already exists in `foundy.toml` with it commented out, if you uncomment it by replacing `{PROJECT_DIR}` with the appropriate path, it will also work. + +About Create2, `L2ContractHelper.computeCreate2Address` should be used. +And `type(ERC1967Proxy).creationCode` doesn't work correctly in zkSync. +We need to hardcode the `type(ERC1967Proxy).creationCode` to bytecodeHash. +Perhaps that is a different value in each compiler version. + +You should replace the following line to the correct hash. +packages/contracts/src/EmailAccountRecovery.sol:L111 + +See, test/ComputeCreate2Address.t.sol + +# For zkSync testing + +Run `yarn zktest`. + +Current foundry-zksync overrides the foundry behavior. If you installed foundry-zksync, some EVM code will be different and some test cases will fail. If you want to test on other EVM, please install foundry. + +Even if the contract size is fine for EVM, it may exceed the bytecode size limit for zksync, and the test may not be executed. +Therefore, EmailAccountRecovery.t.sol has been split. + +Currently, some test cases are not working correctly because there is an issue about missing libraries. + +https://github.com/matter-labs/foundry-zksync/issues/382 + +Failing test cases are here. + +DKIMRegistryUpgrade.t.sol + +- testAuthEmail() + +EmailAuth.t.sol + +- testAuthEmail() +- testExpectRevertAuthEmailEmailNullifierAlreadyUsed() +- testExpectRevertAuthEmailInvalidEmailProof() +- testExpectRevertAuthEmailInvalidCommand() +- testExpectRevertAuthEmailInvalidTimestamp() + +EmailAuthWithUserOverrideableDkim.t.sol + +- testAuthEmail() + +# For integration testing + +To pass the integration testing, you should use era-test-node. +See the following URL and install it. +https://github.com/matter-labs/era-test-node + +Run the era-test-node + +``` +era_test_node fork https://sepolia.era.zksync.dev +``` + +You remove .zksolc-libraries-cache directory, and run the following command. + +``` +forge build --zksync --zk-detect-missing-libraries +``` + +As you saw before, you need to deploy missing libraries. +You can deploy them by the following command for example. + +``` +Missing libraries detected: src/libraries/CommandUtils.sol:CommandUtils, src/libraries/DecimalUtils.sol:DecimalUtils + +Run the following command in order to deploy each missing library: + +forge create src/libraries/DecimalUtils.sol:DecimalUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url http://127.0.0.1:8011 --chain 260 --zksync +forge create src/libraries/CommandUtils.sol:CommandUtils --private-key {YOUR_PRIVATE_KEY} --rpc-url http://127.0.0.1:8011 --chain 260 --zksync --libraries src/libraries/DecimalUtils.sol:DecimalUtils:{DECIMAL_UTILS_DEPLOYED_ADDRESS} +``` + +Set the libraries in foundry.toml using the above deployed address. + +Due to this change in the address of the missing libraries, the value of the proxyBytecodeHash must also be changed: change the value of the proxyBytecodeHash in E-mailAccountRecoveryZKSync.sol. + +And then, run the integration testing. + +``` +forge test --match-contract "IntegrationZKSyncTest" --system-mode=true --zksync --gas-limit 1000000000 --chain 300 -vvv --ffi +``` + +# For zkSync deployment (For test net) + +You need to edit .env at first. +Second just run the following commands with `--zksync` + +``` +source .env +forge script script/DeployRecoveryControllerZKSync.s.sol:Deploy --zksync --rpc-url $RPC_URL --broadcast --slow --via-ir --system-mode true -vvvv +``` + diff --git a/example/contracts/foundry.toml b/example/contracts/foundry.toml new file mode 100644 index 00000000..4edb0e0e --- /dev/null +++ b/example/contracts/foundry.toml @@ -0,0 +1,53 @@ +[profile.default] +src = "src" +out = "artifacts" +libs = ["../../node_modules", "lib"] +optimizer = true +# The following line `via-ir = true` is needed to compile this project using zksync features +# See README.md for more details -> TODO +# via-ir = true +optimizer-runs = 20_000 +fs_permissions = [ + { access = "read", path = "./artifacts/WETH9.sol/WETH9.json" }, + { access = "read", path = "./test/build_integration" }, + { access = "read", path = "./zkout/ERC1967Proxy.sol/ERC1967Proxy.json" }, +] + +solc = "0.8.26" + +# See more config options https://github.com/foundry-rs/foundry/tree/master/config + +# OpenZeppelin +build_info = true +extra_output = ["storageLayout"] + +# For missing libraries, please comment out this if you use foundry-zksync for unit test +#libraries = [ +# "{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:0x91cc0f0a227b8dd56794f9391e8af48b40420a0b", +# "{PROJECT_DIR}/packages/contracts/src/libraries/CommandUtils.sol:CommandUtils:0x981e3df952358a57753c7b85de7949da4abcf54a" +#] + +# For missing libraries, please comment out this if you use foundry-zksync for integration test +#libraries = [ +# "{PROJECT_DIR}/packages/contracts/src/libraries/DecimalUtils.sol:DecimalUtils:0x34eb91D6a0c6Cea4B3b2e4eE8176d6Fc120CB133", +# "{PROJECT_DIR}/packages/contracts/src/libraries/CommandUtils.sol:CommandUtils:0x3CE48a2c96889FeB67f2e3fb0285AEc9e3FCb68b" +#] + + +[rpc_endpoints] +localhost = "${LOCALHOST_RPC_URL}" +sepolia = "${SEPOLIA_RPC_URL}" +mainnet = "${MAINNET_RPC_URL}" + +[etherscan] +sepolia = { key = "${ETHERSCAN_API_KEY}" } +mainnet = { key = "${ETHERSCAN_API_KEY}" } + +[profile.default.zksync] +src = 'src' +libs = ["node_modules", "lib"] +fallback_oz = true +is_system = true +mode = "3" + +zksolc = "1.5.0" diff --git a/example/contracts/package.json b/example/contracts/package.json new file mode 100644 index 00000000..0c937a16 --- /dev/null +++ b/example/contracts/package.json @@ -0,0 +1,24 @@ +{ + "name": "@zk-email/ether-email-auth-example-contracts", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "build": "forge build --skip '*ZKSync*'", + "zkbuild": "forge build --zksync", + "test": "forge test --no-match-test \"testIntegration\" --no-match-contract \".*Script.*\" --skip '*ZKSync*'", + "zktest": "forge test --no-match-test \"testIntegration\" --no-match-contract \".*Script.*\" --system-mode=true --zksync --gas-limit 1000000000 --chain 300", + "lint": "solhint 'src/**/*.sol'" + }, + "dependencies": { + "@openzeppelin/contracts": "^5.0.0", + "@openzeppelin/contracts-upgradeable": "^5.0.0", + "@zk-email/contracts": "^6.1.5", + "@zk-email/ether-email-auth-contracts": "0.0.2-preview", + "solady": "^0.0.123" + }, + "devDependencies": { + "ds-test": "https://github.com/dapphub/ds-test", + "forge-std": "https://github.com/foundry-rs/forge-std", + "solhint": "^3.6.1" + } +} \ No newline at end of file diff --git a/example/contracts/remappings.txt b/example/contracts/remappings.txt new file mode 100644 index 00000000..6166ea09 --- /dev/null +++ b/example/contracts/remappings.txt @@ -0,0 +1,9 @@ +@openzeppelin/=./node_modules/@openzeppelin +@openzeppelin/contracts-upgradeable/=./node_modules/@openzeppelin/contracts-upgradeable +@zk-email/=./node_modules/@zk-email +@uniswap/=./node_modules/@uniswap +@matterlabs/=./node_modules/@matterlabs +forge-std/=./node_modules/forge-std/src +ds-test/=./node_modules/ds-test/src +solady/=./node_modules/solady/src/ +accountabstraction/=./node_modules/accountabstraction/ diff --git a/example/contracts/src/EmitEmailCommand.sol b/example/contracts/src/EmitEmailCommand.sol new file mode 100644 index 00000000..51f6fc79 --- /dev/null +++ b/example/contracts/src/EmitEmailCommand.sol @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.12; + +import "@zk-email/ether-email-auth-contracts/src/EmailAuth.sol"; +import "@openzeppelin/contracts/utils/Create2.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +/// @title Example contract that emits an event for the command in the given email. +contract EmitEmailCommand { + uint8 constant EMAIL_ACCOUNT_RECOVERY_VERSION_ID = 1; + address public verifierAddr; + address public dkimAddr; + address public emailAuthImplementationAddr; + + event StringCommand(address indexed emailAuthAddr, string indexed command); + event UintCommand(address indexed emailAuthAddr, uint indexed command); + event IntCommand(address indexed emailAuthAddr, int indexed command); + event DecimalsCommand(address indexed emailAuthAddr, uint indexed command); + event EthAddrCommand( + address indexed emailAuthAddr, + address indexed command + ); + + /// @notice Returns the address of the verifier contract. + /// @dev This function is virtual and can be overridden by inheriting contracts. + /// @return address The address of the verifier contract. + function verifier() public view virtual returns (address) { + return verifierAddr; + } + + /// @notice Returns the address of the DKIM contract. + /// @dev This function is virtual and can be overridden by inheriting contracts. + /// @return address The address of the DKIM contract. + function dkim() public view virtual returns (address) { + return dkimAddr; + } + + /// @notice Returns the address of the email auth contract implementation. + /// @dev This function is virtual and can be overridden by inheriting contracts. + /// @return address The address of the email authentication contract implementation. + function emailAuthImplementation() public view virtual returns (address) { + return emailAuthImplementationAddr; + } + + /// @notice Computes the address for email auth contract using the CREATE2 opcode. + /// @dev This function utilizes the `Create2` library to compute the address. The computation uses a provided account address to be recovered, account salt, + /// and the hash of the encoded ERC1967Proxy creation code concatenated with the encoded email auth contract implementation + /// address and the initialization call data. This ensures that the computed address is deterministic and unique per account salt. + /// @param owner The address of the owner of the EmailAuth proxy. + /// @param accountSalt A bytes32 salt value defined as a hash of the guardian's email address and an account code. This is assumed to be unique to a pair of the guardian's email address and the wallet address to be recovered. + /// @return address The computed address. + function computeEmailAuthAddress( + address owner, + bytes32 accountSalt + ) public view returns (address) { + return + Create2.computeAddress( + accountSalt, + keccak256( + abi.encodePacked( + type(ERC1967Proxy).creationCode, + abi.encode( + emailAuthImplementation(), + abi.encodeCall( + EmailAuth.initialize, + (owner, accountSalt, address(this)) + ) + ) + ) + ) + ); + } + + /// @notice Deploys a new proxy contract for email authentication. + /// @dev This function uses the CREATE2 opcode to deploy a new ERC1967Proxy contract with a deterministic address. + /// @param owner The address of the owner of the EmailAuth proxy. + /// @param accountSalt A bytes32 salt value used to ensure the uniqueness of the deployed proxy address. + /// @return address The address of the newly deployed proxy contract. + function deployEmailAuthProxy( + address owner, + bytes32 accountSalt + ) internal returns (address) { + ERC1967Proxy proxy = new ERC1967Proxy{salt: accountSalt}( + emailAuthImplementation(), + abi.encodeCall( + EmailAuth.initialize, + (owner, accountSalt, address(this)) + ) + ); + return address(proxy); + } + + /// @notice Calculates a unique command template ID for template provided by this contract. + /// @dev Encodes the email account recovery version ID, "EXAMPLE", and the template index, + /// then uses keccak256 to hash these values into a uint ID. + /// @param templateIdx The index of the command template. + /// @return uint The computed uint ID. + function computeTemplateId(uint templateIdx) public pure returns (uint) { + return + uint256( + keccak256( + abi.encode( + EMAIL_ACCOUNT_RECOVERY_VERSION_ID, + "EXAMPLE", + templateIdx + ) + ) + ); + } + + /// @notice Returns a two-dimensional array of strings representing the command templates. + /// @return string[][] A two-dimensional array of strings, where each inner array represents a set of fixed strings and matchers for a command template. + function commandTemplates() public pure returns (string[][] memory) { + string[][] memory templates = new string[][](2); + templates[0] = new string[](5); + templates[0][0] = "Emit"; + templates[0][1] = "string"; + templates[0][2] = "{string}"; + + templates[1][0] = "Emit"; + templates[1][1] = "uint"; + templates[1][2] = "{uint}"; + + templates[2][0] = "Emit"; + templates[2][1] = "int"; + templates[2][2] = "{int}"; + + templates[3][0] = "Emit"; + templates[3][1] = "decimals"; + templates[3][2] = "{decimals}"; + + templates[4][0] = "Emit"; + templates[4][1] = "ethereum"; + templates[4][2] = "adddress"; + templates[4][3] = "{ethAddr}"; + + return templates; + } + + /// @notice Emits an event for the command in the given email. + function emitEmailCommand( + EmailAuthMsg memory emailAuthMsg, + address owner, + uint templateIdx + ) public { + address emailAuthAddr = computeEmailAuthAddress( + owner, + emailAuthMsg.proof.accountSalt + ); + uint templateId = computeTemplateId(templateIdx); + require(templateId == emailAuthMsg.templateId, "invalid template id"); + + EmailAuth emailAuth; + if (emailAuthAddr.code.length == 0) { + require( + emailAuthMsg.proof.isCodeExist == true, + "isCodeExist must be true for the first email" + ); + address proxyAddress = deployEmailAuthProxy( + owner, + emailAuthMsg.proof.accountSalt + ); + require( + proxyAddress == emailAuthAddr, + "proxy address does not match with emailAuthAddr" + ); + emailAuth = EmailAuth(proxyAddress); + emailAuth.initDKIMRegistry(dkim()); + emailAuth.initVerifier(verifier()); + string[][] memory templates = commandTemplates(); + for (uint idx = 0; idx < templates.length; idx++) { + emailAuth.insertCommandTemplate( + computeTemplateId(idx), + templates[idx] + ); + } + } else { + emailAuth = EmailAuth(payable(address(emailAuthAddr))); + require( + emailAuth.controller() == address(this), + "invalid controller" + ); + } + emailAuth.authEmail(emailAuthMsg); + _emitEvent(emailAuthAddr, emailAuthMsg.commandParams, templateIdx); + } + + function _emitEvent( + address emailAuthAddr, + bytes[] memory commandParams, + uint templateIdx + ) private { + if (templateIdx == 0) { + string memory command = abi.decode(commandParams[0], (string)); + emit StringCommand(emailAuthAddr, command); + } else if (templateIdx == 1) { + uint command = abi.decode(commandParams[0], (uint)); + emit UintCommand(emailAuthAddr, command); + } else if (templateIdx == 2) { + int command = abi.decode(commandParams[0], (int)); + emit IntCommand(emailAuthAddr, command); + } else if (templateIdx == 3) { + uint command = abi.decode(commandParams[0], (uint)); + emit DecimalsCommand(emailAuthAddr, command); + } else if (templateIdx == 4) { + address command = abi.decode(commandParams[0], (address)); + emit EthAddrCommand(emailAuthAddr, command); + } else { + revert("invalid templateIdx"); + } + } +} diff --git a/example/contracts/yarn.lock b/example/contracts/yarn.lock new file mode 100644 index 00000000..6513f116 --- /dev/null +++ b/example/contracts/yarn.lock @@ -0,0 +1,526 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7" + integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== + dependencies: + "@babel/highlight" "^7.25.7" + picocolors "^1.0.0" + +"@babel/helper-validator-identifier@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" + integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== + +"@babel/highlight@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5" + integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw== + dependencies: + "@babel/helper-validator-identifier" "^7.25.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@matterlabs/zksync-contracts@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@matterlabs/zksync-contracts/-/zksync-contracts-0.6.1.tgz#39f061959d5890fd0043a2f1ae710f764b172230" + integrity sha512-+hucLw4DhGmTmQlXOTEtpboYCaOm/X2VJcWmnW4abNcOgQXEHX+mTxQrxEfPjIZT0ZE6z5FTUrOK9+RgUZwBMQ== + +"@openzeppelin/contracts-upgradeable@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.2.tgz#3e5321a2ecdd0b206064356798c21225b6ec7105" + integrity sha512-0MmkHSHiW2NRFiT9/r5Lu4eJq5UJ4/tzlOgYXNAIj/ONkQTVnz22pLxDvp4C4uZ9he7ZFvGn3Driptn1/iU7tQ== + +"@openzeppelin/contracts@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.2.tgz#b1d03075e49290d06570b2fd42154d76c2a5d210" + integrity sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA== + +"@solidity-parser/parser@^0.16.0": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" + integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@zk-email/contracts@^6.1.5": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@zk-email/contracts/-/contracts-6.1.6.tgz#9ffe129bdd74b0373fbd94d650bbf7548e4dd927" + integrity sha512-oAsAAnsEybupFbKW1svXt/DFXF97UK8JFO2KuME75IjYB7AmJpMXAF+LeH3AUx6WnLpXj9d0+B/EM9vLUns1VQ== + dependencies: + "@openzeppelin/contracts" "^5.0.0" + dotenv "^16.3.1" + +"@zk-email/ether-email-auth-contracts@0.0.2-preview": + version "0.0.2-preview" + resolved "https://registry.yarnpkg.com/@zk-email/ether-email-auth-contracts/-/ether-email-auth-contracts-0.0.2-preview.tgz#1b10b02ae0f28b2d110688c7057c182bab322a96" + integrity sha512-ZITqmhdcxuICd/4sU1z8a2w04p2LWIOMl0FOX4j04gBz17k0hYsGcbNQl41FIqLQRTBVc+AZ8DMuegFO6/T2jQ== + dependencies: + "@matterlabs/zksync-contracts" "^0.6.1" + "@openzeppelin/contracts" "^5.0.0" + "@openzeppelin/contracts-upgradeable" "^5.0.0" + "@zk-email/contracts" "^6.1.5" + solady "^0.0.123" + +ajv@^6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +antlr4@^4.11.0: + version "4.13.2" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" + integrity sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg== + +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +ast-parents@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" + integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +cosmiconfig@^8.0.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +dotenv@^16.3.1: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +"ds-test@https://github.com/dapphub/ds-test": + version "1.0.0" + resolved "https://github.com/dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-uri@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.2.tgz#d78b298cf70fd3b752fd951175a3da6a7b48f024" + integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== + +"forge-std@https://github.com/foundry-rs/forge-std": + version "1.9.3" + resolved "https://github.com/foundry-rs/forge-std#ee000c6c27859065d7b3da6047345607c1d94a0d" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +prettier@^2.8.3: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +semver@^7.5.2: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +solady@^0.0.123: + version "0.0.123" + resolved "https://registry.yarnpkg.com/solady/-/solady-0.0.123.tgz#7ef95767c1570e3efde7550da2a8b439b2f413d2" + integrity sha512-F/B8OMCplGsS4FrdPrnEG0xdg8HKede5PwC+Rum8soj/LWxfKckA0p+Uwnlbgey2iI82IHvmSOCNhsdbA+lUrw== + +solhint@^3.6.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" + integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== + dependencies: + "@solidity-parser/parser" "^0.16.0" + ajv "^6.12.6" + antlr4 "^4.11.0" + ast-parents "^0.0.1" + chalk "^4.1.2" + commander "^10.0.0" + cosmiconfig "^8.0.0" + fast-diff "^1.2.0" + glob "^8.0.3" + ignore "^5.2.4" + js-yaml "^4.1.0" + lodash "^4.17.21" + pluralize "^8.0.0" + semver "^7.5.2" + strip-ansi "^6.0.1" + table "^6.8.1" + text-table "^0.2.0" + optionalDependencies: + prettier "^2.8.3" + +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +table@^6.8.1: + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== diff --git a/example/scripts/package.json b/example/scripts/package.json new file mode 100644 index 00000000..560aa299 --- /dev/null +++ b/example/scripts/package.json @@ -0,0 +1,8 @@ +{ + "name": "@zk-email/ether-email-auth-example-scripts", + "version": "0.0.1", + "license": "MIT", + "scripts": {}, + "dependencies": {}, + "devDependencies": {} +} \ No newline at end of file From faa36ed8e98030d71a58187e7795db9e63fff5f5 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Mon, 14 Oct 2024 18:29:34 +0900 Subject: [PATCH 118/121] Start scripts in example --- .gitignore | 1 + example/contracts/.env.example | 8 + .../script/DeployEmitEmailCommand.s.sol | 102 + example/contracts/src/EmitEmailCommand.sol | 22 +- example/scripts/package.json | 95 +- example/scripts/src/main.ts | 0 example/scripts/tsconfig.json | 32 + example/scripts/yarn.lock | 4849 +++++++++++++++++ 8 files changed, 5096 insertions(+), 13 deletions(-) create mode 100644 example/contracts/.env.example create mode 100644 example/contracts/script/DeployEmitEmailCommand.s.sol create mode 100644 example/scripts/src/main.ts create mode 100644 example/scripts/tsconfig.json create mode 100644 example/scripts/yarn.lock diff --git a/.gitignore b/.gitignore index bd746ae9..174d6b86 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,4 @@ zkout example/contracts/artifacts example/contracts/cache example/contracts/node_modules +example/scripts/dist \ No newline at end of file diff --git a/example/contracts/.env.example b/example/contracts/.env.example new file mode 100644 index 00000000..5a9c454b --- /dev/null +++ b/example/contracts/.env.example @@ -0,0 +1,8 @@ +# NEED 0x prefix +PRIVATE_KEY= + +CHAIN_ID=84532 +RPC_URL="https://sepolia.base.org" +SIGNER=0x69bec2dd161d6bbcc91ec32aa44d9333ebc864c0 # Signer for the dkim oracle on IC (Don't change this) +ETHERSCAN_API_KEY= +# CHAIN_NAME="base_sepolia" diff --git a/example/contracts/script/DeployEmitEmailCommand.s.sol b/example/contracts/script/DeployEmitEmailCommand.s.sol new file mode 100644 index 00000000..a8bc5d62 --- /dev/null +++ b/example/contracts/script/DeployEmitEmailCommand.s.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/Script.sol"; + +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import "@zk-email/ether-email-auth-contracts/src/utils/Verifier.sol"; +import "@zk-email/ether-email-auth-contracts/src/utils/Groth16Verifier.sol"; +import "@zk-email/ether-email-auth-contracts/src/utils/ECDSAOwnedDKIMRegistry.sol"; +import "@zk-email/ether-email-auth-contracts/src/EmailAuth.sol"; +import "../src/EmitEmailCommand.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +contract Deploy is Script { + using ECDSA for *; + + ECDSAOwnedDKIMRegistry dkimImpl; + ECDSAOwnedDKIMRegistry dkim; + Verifier verifierImpl; + Verifier verifier; + EmailAuth emailAuthImpl; + EmitEmailCommand emitEmailCommand; + + function run() external { + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + if (deployerPrivateKey == 0) { + console.log("PRIVATE_KEY env var not set"); + return; + } + address signer = vm.envAddress("SIGNER"); + if (signer == address(0)) { + console.log("SIGNER env var not set"); + return; + } + + vm.startBroadcast(deployerPrivateKey); + address initialOwner = vm.addr(deployerPrivateKey); + console.log("Initial owner: %s", vm.toString(initialOwner)); + // Deploy ECDSA DKIM registry + { + dkimImpl = new ECDSAOwnedDKIMRegistry(); + console.log( + "ECDSAOwnedDKIMRegistry implementation deployed at: %s", + address(dkimImpl) + ); + ERC1967Proxy dkimProxy = new ERC1967Proxy( + address(dkimImpl), + abi.encodeCall(dkimImpl.initialize, (initialOwner, signer)) + ); + dkim = ECDSAOwnedDKIMRegistry(address(dkimProxy)); + console.log( + "ECDSAOwnedDKIMRegistry deployed at: %s", + address(dkim) + ); + vm.setEnv("ECDSA_DKIM", vm.toString(address(dkim))); + } + + // Deploy Verifier + { + verifierImpl = new Verifier(); + console.log( + "Verifier implementation deployed at: %s", + address(verifierImpl) + ); + Groth16Verifier groth16Verifier = new Groth16Verifier(); + ERC1967Proxy verifierProxy = new ERC1967Proxy( + address(verifierImpl), + abi.encodeCall( + verifierImpl.initialize, + (initialOwner, address(groth16Verifier)) + ) + ); + verifier = Verifier(address(verifierProxy)); + console.log("Verifier deployed at: %s", address(verifier)); + vm.setEnv("VERIFIER", vm.toString(address(verifier))); + } + + // Deploy EmailAuth Implementation + { + emailAuthImpl = new EmailAuth(); + console.log( + "EmailAuth implementation deployed at: %s", + address(emailAuthImpl) + ); + vm.setEnv("EMAIL_AUTH_IMPL", vm.toString(address(emailAuthImpl))); + } + + // Deploy EmitEmailCommand + { + emitEmailCommand = new EmitEmailCommand( + address(verifier), + address(dkim), + address(emailAuthImpl) + ); + console.log( + "EmitEmailCommand deployed at: %s", + address(emitEmailCommand) + ); + } + vm.stopBroadcast(); + } +} diff --git a/example/contracts/src/EmitEmailCommand.sol b/example/contracts/src/EmitEmailCommand.sol index 51f6fc79..8451c8d2 100644 --- a/example/contracts/src/EmitEmailCommand.sol +++ b/example/contracts/src/EmitEmailCommand.sol @@ -7,7 +7,6 @@ import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.s /// @title Example contract that emits an event for the command in the given email. contract EmitEmailCommand { - uint8 constant EMAIL_ACCOUNT_RECOVERY_VERSION_ID = 1; address public verifierAddr; address public dkimAddr; address public emailAuthImplementationAddr; @@ -21,6 +20,16 @@ contract EmitEmailCommand { address indexed command ); + constructor( + address _verifierAddr, + address _dkimAddr, + address _emailAuthImplementationAddr + ) { + verifierAddr = _verifierAddr; + dkimAddr = _dkimAddr; + emailAuthImplementationAddr = _emailAuthImplementationAddr; + } + /// @notice Returns the address of the verifier contract. /// @dev This function is virtual and can be overridden by inheriting contracts. /// @return address The address of the verifier contract. @@ -96,16 +105,7 @@ contract EmitEmailCommand { /// @param templateIdx The index of the command template. /// @return uint The computed uint ID. function computeTemplateId(uint templateIdx) public pure returns (uint) { - return - uint256( - keccak256( - abi.encode( - EMAIL_ACCOUNT_RECOVERY_VERSION_ID, - "EXAMPLE", - templateIdx - ) - ) - ); + return uint256(keccak256(abi.encode("EXAMPLE", templateIdx))); } /// @notice Returns a two-dimensional array of strings representing the command templates. diff --git a/example/scripts/package.json b/example/scripts/package.json index 560aa299..688a5bce 100644 --- a/example/scripts/package.json +++ b/example/scripts/package.json @@ -2,7 +2,98 @@ "name": "@zk-email/ether-email-auth-example-scripts", "version": "0.0.1", "license": "MIT", - "scripts": {}, + "scripts": { + "install": "yarn build", + "build": "npx tsc" + }, "dependencies": {}, - "devDependencies": {} + "devDependencies": { + "@babel/core": "^7.22.5", + "@babel/preset-env": "^7.22.2", + "@babel/preset-typescript": "^7.21.5", + "@types/addressparser": "^1.0.3", + "@types/atob": "^2.1.2", + "@types/jest": "^29.5.12", + "@types/mocha": "^10.0.1", + "@types/node": "^22.7.2", + "@types/node-forge": "^1.3.2", + "@types/node-rsa": "^1.1.4", + "@types/psl": "^1.1.2", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "babel-jest": "^29.5.0", + "babel-preset-jest": "^29.5.0", + "eslint": "^8.0.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^18.0.0", + "eslint-plugin-import": "^2.29.1", + "jest": "^29.7.0", + "msw": "^1.2.2", + "ts-jest": "^29.2.5", + "typescript": "^5.2.2" + }, + "jest": { + "roots": [ + "" + ] + }, + "babel": { + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "current" + } + } + ], + "@babel/preset-typescript", + [ + "jest" + ] + ] + }, + "eslintConfig": { + "env": { + "browser": true, + "es2021": true, + "node": true + }, + "extends": [ + "airbnb-base", + "airbnb-typescript/base" + ], + "ignorePatterns": [ + "src/lib/**/*", + "tests/**/*", + "dist", + "node_modules" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module", + "project": "./tsconfig.json" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "max-len": [ + "error", + { + "code": 150 + } + ], + "import/prefer-default-export": "off", + "no-await-in-loop": "off", + "no-restricted-syntax": "off", + "no-plusplus": "off", + "no-bitwise": "off", + "no-console": "off", + "no-continue": "off", + "@typescript-eslint/no-use-before-define": "off", + "prefer-destructuring": "off" + } + } } \ No newline at end of file diff --git a/example/scripts/src/main.ts b/example/scripts/src/main.ts new file mode 100644 index 00000000..e69de29b diff --git a/example/scripts/tsconfig.json b/example/scripts/tsconfig.json new file mode 100644 index 00000000..de230a1d --- /dev/null +++ b/example/scripts/tsconfig.json @@ -0,0 +1,32 @@ +{ + "include": [ + "src/**/*" + ], + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "declaration": true, + "baseUrl": "./src", + "outDir": "dist", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "typeRoots": [ + "./node_modules/@types" + ], + "incremental": true + } +} \ No newline at end of file diff --git a/example/scripts/yarn.lock b/example/scripts/yarn.lock new file mode 100644 index 00000000..8ca6c370 --- /dev/null +++ b/example/scripts/yarn.lock @@ -0,0 +1,4849 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7" + integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== + dependencies: + "@babel/highlight" "^7.25.7" + picocolors "^1.0.0" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.7", "@babel/compat-data@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.8.tgz#0376e83df5ab0eb0da18885c0140041f0747a402" + integrity sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.22.5", "@babel/core@^7.23.9": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.8.tgz#a57137d2a51bbcffcfaeba43cb4dd33ae3e0e1c6" + integrity sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.25.7" + "@babel/generator" "^7.25.7" + "@babel/helper-compilation-targets" "^7.25.7" + "@babel/helper-module-transforms" "^7.25.7" + "@babel/helpers" "^7.25.7" + "@babel/parser" "^7.25.8" + "@babel/template" "^7.25.7" + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.8" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.7", "@babel/generator@^7.7.2": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56" + integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA== + dependencies: + "@babel/types" "^7.25.7" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz#63f02dbfa1f7cb75a9bdb832f300582f30bb8972" + integrity sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA== + dependencies: + "@babel/types" "^7.25.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz#d721650c1f595371e0a23ee816f1c3c488c0d622" + integrity sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg== + dependencies: + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz#11260ac3322dda0ef53edfae6e97b961449f5fa4" + integrity sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A== + dependencies: + "@babel/compat-data" "^7.25.7" + "@babel/helper-validator-option" "^7.25.7" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz#5d65074c76cae75607421c00d6bd517fe1892d6b" + integrity sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-member-expression-to-functions" "^7.25.7" + "@babel/helper-optimise-call-expression" "^7.25.7" + "@babel/helper-replace-supers" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + "@babel/traverse" "^7.25.7" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz#dcb464f0e2cdfe0c25cc2a0a59c37ab940ce894e" + integrity sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.7" + regexpu-core "^6.1.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-member-expression-to-functions@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz#541a33b071f0355a63a0fa4bdf9ac360116b8574" + integrity sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA== + dependencies: + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helper-module-imports@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472" + integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw== + dependencies: + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helper-module-transforms@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz#2ac9372c5e001b19bc62f1fe7d96a18cb0901d1a" + integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ== + dependencies: + "@babel/helper-module-imports" "^7.25.7" + "@babel/helper-simple-access" "^7.25.7" + "@babel/helper-validator-identifier" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/helper-optimise-call-expression@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz#1de1b99688e987af723eed44fa7fc0ee7b97d77a" + integrity sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng== + dependencies: + "@babel/types" "^7.25.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz#8ec5b21812d992e1ef88a9b068260537b6f0e36c" + integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw== + +"@babel/helper-remap-async-to-generator@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz#9efdc39df5f489bcd15533c912b6c723a0a65021" + integrity sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-wrap-function" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/helper-replace-supers@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz#38cfda3b6e990879c71d08d0fef9236b62bd75f5" + integrity sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.7" + "@babel/helper-optimise-call-expression" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/helper-simple-access@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz#5eb9f6a60c5d6b2e0f76057004f8dacbddfae1c0" + integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ== + dependencies: + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz#382831c91038b1a6d32643f5f49505b8442cb87c" + integrity sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA== + dependencies: + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helper-string-parser@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" + integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== + +"@babel/helper-validator-identifier@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" + integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== + +"@babel/helper-validator-option@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz#97d1d684448228b30b506d90cace495d6f492729" + integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ== + +"@babel/helper-wrap-function@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz#9f6021dd1c4fdf4ad515c809967fc4bac9a70fe7" + integrity sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg== + dependencies: + "@babel/template" "^7.25.7" + "@babel/traverse" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/helpers@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.7.tgz#091b52cb697a171fe0136ab62e54e407211f09c2" + integrity sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA== + dependencies: + "@babel/template" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/highlight@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5" + integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw== + dependencies: + "@babel/helper-validator-identifier" "^7.25.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.7", "@babel/parser@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2" + integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ== + dependencies: + "@babel/types" "^7.25.8" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz#93969ac50ef4d68b2504b01b758af714e4cbdd64" + integrity sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz#a338d611adb9dcd599b8b1efa200c88ebeffe046" + integrity sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz#c5f755e911dfac7ef6957300c0f9c4a8c18c06f4" + integrity sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz#3b7ea04492ded990978b6deaa1dfca120ad4455a" + integrity sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + "@babel/plugin-transform-optional-chaining" "^7.25.7" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz#9622b1d597a703aa3a921e6f58c9c2d9a028d2c5" + integrity sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-assertions@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz#8ce248f9f4ed4b7ed4cb2e0eb4ed9efd9f52921f" + integrity sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz#d78dd0499d30df19a598e63ab895e21b909bc43f" + integrity sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.25.7", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz#5352d398d11ea5e7ef330c854dea1dae0bf18165" + integrity sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.25.7", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz#bfc05b0cc31ebd8af09964650cee723bb228108b" + integrity sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz#1b9ed22e6890a0e9ff470371c73b8c749bcec386" + integrity sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-async-generator-functions@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz#3331de02f52cc1f2c75b396bec52188c85b0b1ec" + integrity sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-remap-async-to-generator" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/plugin-transform-async-to-generator@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz#a44c7323f8d4285a6c568dd43c5c361d6367ec52" + integrity sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg== + dependencies: + "@babel/helper-module-imports" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-remap-async-to-generator" "^7.25.7" + +"@babel/plugin-transform-block-scoped-functions@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz#e0b8843d5571719a2f1bf7e284117a3379fcc17c" + integrity sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-block-scoping@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz#6dab95e98adf780ceef1b1c3ab0e55cd20dd410a" + integrity sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-class-properties@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz#a389cfca7a10ac80e3ff4c75fca08bd097ad1523" + integrity sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-class-static-block@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz#a8af22028920fe404668031eceb4c3aadccb5262" + integrity sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-classes@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz#5103206cf80d02283bbbd044509ea3b65d0906bb" + integrity sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-compilation-targets" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-replace-supers" "^7.25.7" + "@babel/traverse" "^7.25.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz#7f621f0aa1354b5348a935ab12e3903842466f65" + integrity sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/template" "^7.25.7" + +"@babel/plugin-transform-destructuring@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz#f6f26a9feefb5aa41fd45b6f5838901b5333d560" + integrity sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-dotall-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz#9d775c4a3ff1aea64045300fcd4309b4a610ef02" + integrity sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-duplicate-keys@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz#fbba7d1155eab76bd4f2a038cbd5d65883bd7a93" + integrity sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz#102b31608dcc22c08fbca1894e104686029dc141" + integrity sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-dynamic-import@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz#f1edbe75b248cf44c70c8ca8ed3818a668753aaa" + integrity sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-exponentiation-operator@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz#5961a3a23a398faccd6cddb34a2182807d75fb5f" + integrity sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-export-namespace-from@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz#d1988c3019a380b417e0516418b02804d3858145" + integrity sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-for-of@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz#0acfea0f27aa290818b5b48a5a44b3f03fc13669" + integrity sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + +"@babel/plugin-transform-function-name@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz#7e394ccea3693902a8b50ded8b6ae1fa7b8519fd" + integrity sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ== + dependencies: + "@babel/helper-compilation-targets" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/plugin-transform-json-strings@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz#6fb3ec383a2ea92652289fdba653e3f9de722694" + integrity sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-literals@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz#70cbdc742f2cfdb1a63ea2cbd018d12a60b213c3" + integrity sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-logical-assignment-operators@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz#01868ff92daa9e525b4c7902aa51979082a05710" + integrity sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-member-expression-literals@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz#0a36c3fbd450cc9e6485c507f005fa3d1bc8fca5" + integrity sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-modules-amd@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz#bb4e543b5611f6c8c685a2fd485408713a3adf3d" + integrity sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA== + dependencies: + "@babel/helper-module-transforms" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-modules-commonjs@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz#173f0c791bb7407c092ce6d77ee90eb3f2d1d2fd" + integrity sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg== + dependencies: + "@babel/helper-module-transforms" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-simple-access" "^7.25.7" + +"@babel/plugin-transform-modules-systemjs@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz#8b14d319a177cc9c85ef8b0512afd429d9e2e60b" + integrity sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g== + dependencies: + "@babel/helper-module-transforms" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-validator-identifier" "^7.25.7" + "@babel/traverse" "^7.25.7" + +"@babel/plugin-transform-modules-umd@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz#00ee7a7e124289549381bfb0e24d87fd7f848367" + integrity sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw== + dependencies: + "@babel/helper-module-transforms" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz#a2f3f6d7f38693b462542951748f0a72a34d196d" + integrity sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-new-target@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz#52b2bde523b76c548749f38dc3054f1f45e82bc9" + integrity sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz#befb4900c130bd52fccf2b926314557987f1b552" + integrity sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-numeric-separator@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz#91e370486371637bd42161052f2602c701386891" + integrity sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-object-rest-spread@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz#0904ac16bcce41df4db12d915d6780f85c7fb04b" + integrity sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g== + dependencies: + "@babel/helper-compilation-targets" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/plugin-transform-parameters" "^7.25.7" + +"@babel/plugin-transform-object-super@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz#582a9cea8cf0a1e02732be5b5a703a38dedf5661" + integrity sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-replace-supers" "^7.25.7" + +"@babel/plugin-transform-optional-catch-binding@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz#2649b86a3bb202c6894ec81a6ddf41b94d8f3103" + integrity sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-optional-chaining@^7.25.7", "@babel/plugin-transform-optional-chaining@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz#f46283b78adcc5b6ab988a952f989e7dce70653f" + integrity sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + +"@babel/plugin-transform-parameters@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz#80c38b03ef580f6d6bffe1c5254bb35986859ac7" + integrity sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-private-methods@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz#c790a04f837b4bd61d6b0317b43aa11ff67dce80" + integrity sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-private-property-in-object@^7.25.8": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz#1234f856ce85e061f9688764194e51ea7577c434" + integrity sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-create-class-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-property-literals@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz#a8612b4ea4e10430f00012ecf0155662c7d6550d" + integrity sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-regenerator@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz#6eb006e6d26f627bc2f7844a9f19770721ad6f3e" + integrity sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz#dc56b25e02afaabef3ce0c5b06b0916e8523e995" + integrity sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-shorthand-properties@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz#92690a9c671915602d91533c278cc8f6bf12275f" + integrity sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-spread@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz#df83e899a9fc66284ee601a7b738568435b92998" + integrity sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + +"@babel/plugin-transform-sticky-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz#341c7002bef7f29037be7fb9684e374442dd0d17" + integrity sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-template-literals@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz#e566c581bb16d8541dd8701093bb3457adfce16b" + integrity sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-typeof-symbol@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz#debb1287182efd20488f126be343328c679b66eb" + integrity sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-typescript@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz#8fc7c3d28ddd36bce45b9b48594129d0e560cfbe" + integrity sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.7" + "@babel/helper-create-class-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" + "@babel/plugin-syntax-typescript" "^7.25.7" + +"@babel/plugin-transform-unicode-escapes@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz#973592b6d13a914794e1de8cf1383e50e0f87f81" + integrity sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-unicode-property-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz#25349197cce964b1343f74fa7cfdf791a1b1919e" + integrity sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-unicode-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz#f93a93441baf61f713b6d5552aaa856bfab34809" + integrity sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/plugin-transform-unicode-sets-regex@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz#d1b3295d29e0f8f4df76abc909ad1ebee919560c" + integrity sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + +"@babel/preset-env@^7.22.2": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.8.tgz#dc6b719627fb29cd9cccbbbe041802fd575b524c" + integrity sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg== + dependencies: + "@babel/compat-data" "^7.25.8" + "@babel/helper-compilation-targets" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-validator-option" "^7.25.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.7" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.7" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.25.7" + "@babel/plugin-syntax-import-attributes" "^7.25.7" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.25.7" + "@babel/plugin-transform-async-generator-functions" "^7.25.8" + "@babel/plugin-transform-async-to-generator" "^7.25.7" + "@babel/plugin-transform-block-scoped-functions" "^7.25.7" + "@babel/plugin-transform-block-scoping" "^7.25.7" + "@babel/plugin-transform-class-properties" "^7.25.7" + "@babel/plugin-transform-class-static-block" "^7.25.8" + "@babel/plugin-transform-classes" "^7.25.7" + "@babel/plugin-transform-computed-properties" "^7.25.7" + "@babel/plugin-transform-destructuring" "^7.25.7" + "@babel/plugin-transform-dotall-regex" "^7.25.7" + "@babel/plugin-transform-duplicate-keys" "^7.25.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.7" + "@babel/plugin-transform-dynamic-import" "^7.25.8" + "@babel/plugin-transform-exponentiation-operator" "^7.25.7" + "@babel/plugin-transform-export-namespace-from" "^7.25.8" + "@babel/plugin-transform-for-of" "^7.25.7" + "@babel/plugin-transform-function-name" "^7.25.7" + "@babel/plugin-transform-json-strings" "^7.25.8" + "@babel/plugin-transform-literals" "^7.25.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.8" + "@babel/plugin-transform-member-expression-literals" "^7.25.7" + "@babel/plugin-transform-modules-amd" "^7.25.7" + "@babel/plugin-transform-modules-commonjs" "^7.25.7" + "@babel/plugin-transform-modules-systemjs" "^7.25.7" + "@babel/plugin-transform-modules-umd" "^7.25.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.7" + "@babel/plugin-transform-new-target" "^7.25.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.8" + "@babel/plugin-transform-numeric-separator" "^7.25.8" + "@babel/plugin-transform-object-rest-spread" "^7.25.8" + "@babel/plugin-transform-object-super" "^7.25.7" + "@babel/plugin-transform-optional-catch-binding" "^7.25.8" + "@babel/plugin-transform-optional-chaining" "^7.25.8" + "@babel/plugin-transform-parameters" "^7.25.7" + "@babel/plugin-transform-private-methods" "^7.25.7" + "@babel/plugin-transform-private-property-in-object" "^7.25.8" + "@babel/plugin-transform-property-literals" "^7.25.7" + "@babel/plugin-transform-regenerator" "^7.25.7" + "@babel/plugin-transform-reserved-words" "^7.25.7" + "@babel/plugin-transform-shorthand-properties" "^7.25.7" + "@babel/plugin-transform-spread" "^7.25.7" + "@babel/plugin-transform-sticky-regex" "^7.25.7" + "@babel/plugin-transform-template-literals" "^7.25.7" + "@babel/plugin-transform-typeof-symbol" "^7.25.7" + "@babel/plugin-transform-unicode-escapes" "^7.25.7" + "@babel/plugin-transform-unicode-property-regex" "^7.25.7" + "@babel/plugin-transform-unicode-regex" "^7.25.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.7" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.6" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.38.1" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.21.5": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz#43c5b68eccb856ae5b52274b77b1c3c413cde1b7" + integrity sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-validator-option" "^7.25.7" + "@babel/plugin-syntax-jsx" "^7.25.7" + "@babel/plugin-transform-modules-commonjs" "^7.25.7" + "@babel/plugin-transform-typescript" "^7.25.7" + +"@babel/runtime@^7.8.4": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" + integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.25.7", "@babel/template@^7.3.3": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769" + integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA== + dependencies: + "@babel/code-frame" "^7.25.7" + "@babel/parser" "^7.25.7" + "@babel/types" "^7.25.7" + +"@babel/traverse@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8" + integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg== + dependencies: + "@babel/code-frame" "^7.25.7" + "@babel/generator" "^7.25.7" + "@babel/parser" "^7.25.7" + "@babel/template" "^7.25.7" + "@babel/types" "^7.25.7" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.7", "@babel/types@^7.25.8", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1" + integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg== + dependencies: + "@babel/helper-string-parser" "^7.25.7" + "@babel/helper-validator-identifier" "^7.25.7" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@mswjs/cookies@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" + integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== + dependencies: + "@types/set-cookie-parser" "^2.4.0" + set-cookie-parser "^2.4.6" + +"@mswjs/interceptors@^0.17.10": + version "0.17.10" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.10.tgz#857b41f30e2b92345ed9a4e2b1d0a08b8b6fcad4" + integrity sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw== + dependencies: + "@open-draft/until" "^1.0.3" + "@types/debug" "^4.1.7" + "@xmldom/xmldom" "^0.8.3" + debug "^4.3.3" + headers-polyfill "3.2.5" + outvariant "^1.2.1" + strict-event-emitter "^0.2.4" + web-encoding "^1.1.5" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@open-draft/until@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" + integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@types/addressparser@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/addressparser/-/addressparser-1.0.3.tgz#7e64c25e9776157b45cfca8c73942f71bdd9ee91" + integrity sha512-h5MPV28/nHAXi3+wxjt7ZWKGtL2O6Z784eVKQwLo85VSo2YcPViTLR+CGJbx2bzd6DuOthiJX2sn54vqWfBseA== + dependencies: + "@types/node" "*" + +"@types/atob@^2.1.2": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@types/atob/-/atob-2.1.4.tgz#50bb756a99bbdba6995f2d10a134d21a881323b3" + integrity sha512-FisOhG87cCFqzCgq6FUtSYsTMOHCB/p28zJbSN1QBo4ZGJfg9PEhMjdIV++NDeOnloUUe0Gz6jwBV+L1Ac00Mw== + +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/debug@^4.1.7": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.12": + version "29.5.13" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.13.tgz#8bc571659f401e6a719a7bf0dbcb8b78c71a8adc" + integrity sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/js-levenshtein@^1.1.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz#a6fd0bdc8255b274e5438e0bfb25f154492d1106" + integrity sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mocha@^10.0.1": + version "10.0.9" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.9.tgz#101e9da88d2c02e5ac8952982c23b224524d662a" + integrity sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node-forge@^1.3.2": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node-rsa@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/node-rsa/-/node-rsa-1.1.4.tgz#6d2e06f8ca3619550be4fd5c12db5f2267048e20" + integrity sha512-dB0ECel6JpMnq5ULvpUTunx3yNm8e/dIkv8Zu9p2c8me70xIRUUG3q+qXRwcSf9rN3oqamv4116iHy90dJGRpA== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@^22.7.2": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + dependencies: + undici-types "~6.19.2" + +"@types/psl@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/psl/-/psl-1.1.3.tgz#c1e9febd70e7df248ac9911cdd145454643aa28f" + integrity sha512-Iu174JHfLd7i/XkXY6VDrqSlPvTDQOtQI7wNAXKKOAADJ9TduRLkNdMgjGiMxSttUIZnomv81JAbAbC0DhggxA== + +"@types/set-cookie-parser@^2.4.0": + version "2.4.10" + resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz#ad3a807d6d921db9720621ea3374c5d92020bcbc" + integrity sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^7.0.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/type-utils" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@^7.0.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== + dependencies: + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + +"@typescript-eslint/type-utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== + dependencies: + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== + +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== + dependencies: + "@typescript-eslint/types" "7.18.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@xmldom/xmldom@^0.8.3": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlastindex@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +babel-jest@^29.5.0, babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.2" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.10.6: + version "0.10.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.2" + +babel-preset-current-node-syntax@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + +babel-preset-jest@^29.5.0, babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.23.3, browserslist@^4.24.0: + version "4.24.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" + integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== + dependencies: + caniuse-lite "^1.0.30001663" + electron-to-chromium "^1.5.28" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + +bs-logger@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001663: + version "1.0.30001668" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz#98e214455329f54bf7a4d70b49c9794f0fbedbed" + integrity sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^3.4.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +confusing-browser-globals@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +core-js-compat@^3.38.0, core-js-compat@^3.38.1: + version "3.38.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" + integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== + dependencies: + browserslist "^4.23.3" + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +ejs@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.5.28: + version "1.5.36" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz#ec41047f0e1446ec5dce78ed5970116533139b88" + integrity sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb-typescript@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz#b1646db4134858d704b1d2bee47e1d72c180315f" + integrity sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg== + dependencies: + eslint-config-airbnb-base "^15.0.0" + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.29.1: + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== + dependencies: + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.12.0" + hasown "^2.0.2" + is-core-module "^2.15.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" + semver "^6.3.1" + string.prototype.trimend "^1.0.8" + tsconfig-paths "^3.15.0" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.0.0: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +graphql@^16.8.1: + version "16.9.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" + integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +headers-polyfill@3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.2.5.tgz#6e67d392c9d113d37448fe45014e0afdd168faed" + integrity sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^8.2.0: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13, is-typed-array@^1.1.3: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2, jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +msw@^1.2.2: + version "1.3.4" + resolved "https://registry.yarnpkg.com/msw/-/msw-1.3.4.tgz#76ad0396a9c7fff07c6893ce4d3997787dc8fd55" + integrity sha512-XxA/VomMIYLlgpFS00eQanBWIAT9gto4wxrRt9y58WBXJs1I0lQYRIWk7nKcY/7X6DhkKukcDgPcyAvkEc1i7w== + dependencies: + "@mswjs/cookies" "^0.2.2" + "@mswjs/interceptors" "^0.17.10" + "@open-draft/until" "^1.0.3" + "@types/cookie" "^0.4.1" + "@types/js-levenshtein" "^1.1.1" + chalk "^4.1.1" + chokidar "^3.4.2" + cookie "^0.4.2" + graphql "^16.8.1" + headers-polyfill "3.2.5" + inquirer "^8.2.0" + is-node-process "^1.2.0" + js-levenshtein "^1.1.6" + node-fetch "^2.6.7" + outvariant "^1.4.0" + path-to-regexp "^6.2.0" + strict-event-emitter "^0.4.3" + type-fest "^2.19.0" + yargs "^17.3.1" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.5: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +outvariant@^1.2.1, outvariant@^1.4.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" + integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" + integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0, picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-is@^18.0.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.2" + +regexpu-core@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" + integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.11.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.1.tgz#ae55c74f646db0c8fcb922d4da635e33da405149" + integrity sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ== + dependencies: + jsesc "~3.0.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +set-cookie-parser@^2.4.6: + version "2.7.0" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz#ef5552b56dc01baae102acb5fc9fb8cd060c30f9" + integrity sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +strict-event-emitter@^0.2.4: + version "0.2.8" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" + integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== + dependencies: + events "^3.3.0" + +strict-event-emitter@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz#ff347c8162b3e931e3ff5f02cfce6772c3b07eb3" + integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-jest@^29.2.5: + version "29.2.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== + dependencies: + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.1.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@^5.2.2: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +update-browserslist-db@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.3: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +v8-to-istanbul@^9.0.1: + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web-encoding@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From c31af557f4e37e2e9f6f6a1c64c2c73114a2d441 Mon Sep 17 00:00:00 2001 From: SoraSuegami Date: Tue, 15 Oct 2024 19:43:24 +0900 Subject: [PATCH 119/121] Define some types in the script --- example/scripts/abis/EmailAuth.json | 1 + example/scripts/abis/EmitEmailCommand.json | 9289 ++++++++++++++++++++ example/scripts/package.json | 11 +- example/scripts/src/main.ts | 45 + example/scripts/src/types.ts | 26 + example/scripts/yarn.lock | 1407 ++- 6 files changed, 10756 insertions(+), 23 deletions(-) create mode 100644 example/scripts/abis/EmailAuth.json create mode 100644 example/scripts/abis/EmitEmailCommand.json create mode 100644 example/scripts/src/types.ts diff --git a/example/scripts/abis/EmailAuth.json b/example/scripts/abis/EmailAuth.json new file mode 100644 index 00000000..1e2c1a8c --- /dev/null +++ b/example/scripts/abis/EmailAuth.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"UPGRADE_INTERFACE_VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"accountSalt","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"authEmail","inputs":[{"name":"emailAuthMsg","type":"tuple","internalType":"struct EmailAuthMsg","components":[{"name":"templateId","type":"uint256","internalType":"uint256"},{"name":"commandParams","type":"bytes[]","internalType":"bytes[]"},{"name":"skippedCommandPrefix","type":"uint256","internalType":"uint256"},{"name":"proof","type":"tuple","internalType":"struct EmailProof","components":[{"name":"domainName","type":"string","internalType":"string"},{"name":"publicKeyHash","type":"bytes32","internalType":"bytes32"},{"name":"timestamp","type":"uint256","internalType":"uint256"},{"name":"maskedCommand","type":"string","internalType":"string"},{"name":"emailNullifier","type":"bytes32","internalType":"bytes32"},{"name":"accountSalt","type":"bytes32","internalType":"bytes32"},{"name":"isCodeExist","type":"bool","internalType":"bool"},{"name":"proof","type":"bytes","internalType":"bytes"}]}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"commandTemplates","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"controller","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"deleteCommandTemplate","inputs":[{"name":"_templateId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"dkimRegistryAddr","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getCommandTemplate","inputs":[{"name":"_templateId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string[]","internalType":"string[]"}],"stateMutability":"view"},{"type":"function","name":"initDKIMRegistry","inputs":[{"name":"_dkimRegistryAddr","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initVerifier","inputs":[{"name":"_verifierAddr","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[{"name":"_initialOwner","type":"address","internalType":"address"},{"name":"_accountSalt","type":"bytes32","internalType":"bytes32"},{"name":"_controller","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"insertCommandTemplate","inputs":[{"name":"_templateId","type":"uint256","internalType":"uint256"},{"name":"_commandTemplate","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"lastTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTimestampCheckEnabled","inputs":[{"name":"_enabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"timestampCheckEnabled","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateCommandTemplate","inputs":[{"name":"_templateId","type":"uint256","internalType":"uint256"},{"name":"_commandTemplate","type":"string[]","internalType":"string[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateDKIMRegistry","inputs":[{"name":"_dkimRegistryAddr","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateVerifier","inputs":[{"name":"_verifierAddr","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"usedNullifiers","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"verifierAddr","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"event","name":"CommandTemplateDeleted","inputs":[{"name":"templateId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"CommandTemplateInserted","inputs":[{"name":"templateId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"CommandTemplateUpdated","inputs":[{"name":"templateId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"DKIMRegistryUpdated","inputs":[{"name":"dkimRegistry","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EmailAuthed","inputs":[{"name":"emailNullifier","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"accountSalt","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"isCodeExist","type":"bool","indexed":false,"internalType":"bool"},{"name":"templateId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"TimestampCheckEnabled","inputs":[{"name":"enabled","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"VerifierUpdated","inputs":[{"name":"verifier","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967NonPayable","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"UUPSUnauthorizedCallContext","inputs":[]},{"type":"error","name":"UUPSUnsupportedProxiableUUID","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x60a060405230608052348015601357600080fd5b506080516130c961003d60003960008181611bd101528181611bfa0152611e1b01526130c96000f3fe6080604052600436106101965760003560e01c80636c74921e116100e1578063a500125c1161008a578063d26b3e6e11610064578063d26b3e6e146104db578063e453c0f3146104fb578063f2fde38b1461051b578063f77c47911461053b57600080fd5b8063a500125c14610452578063ad3cb1cc14610472578063ad3f5f9b146104bb57600080fd5b80638ff3730f116100bb5780638ff3730f146103e557806395e33c081461040557806397fc007c1461043257600080fd5b80636c74921e14610370578063715018a6146103865780638da5cb5b1461039b57600080fd5b80634141407c11610143578063557cf5ef1161011d578063557cf5ef14610305578063640e8b6914610325578063663ea2e21461034557600080fd5b80634141407c146102bd5780634f1ef286146102dd57806352d1902d146102f057600080fd5b8063206137aa11610174578063206137aa1461024157806324e33f11146102815780633e56f529146102a357600080fd5b8063091c16501461019b57806319d8ac61146101d15780631bc01b83146101f5575b600080fd5b3480156101a757600080fd5b506101bb6101b636600461251d565b610568565b6040516101c891906125ad565b60405180910390f35b3480156101dd57600080fd5b506101e760055481565b6040519081526020016101c8565b34801561020157600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c8565b34801561024d57600080fd5b5061027161025c3660046125c0565b60066020526000908152604090205460ff1681565b60405190151581526020016101c8565b34801561028d57600080fd5b506102a161029c366004612767565b610621565b005b3480156102af57600080fd5b506007546102719060ff1681565b3480156102c957600080fd5b506102a16102d8366004612853565b610788565b6102a16102eb36600461286e565b610927565b3480156102fc57600080fd5b506101e7610946565b34801561031157600080fd5b506102a1610320366004612853565b610975565b34801561033157600080fd5b506102a16103403660046125c0565b610b3a565b34801561035157600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661021c565b34801561037c57600080fd5b506101e760005481565b34801561039257600080fd5b506102a1610c41565b3480156103a757600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1661021c565b3480156103f157600080fd5b506102a1610400366004612767565b610c55565b34801561041157600080fd5b506104256104203660046125c0565b610db8565b6040516101c891906128bc565b34801561043e57600080fd5b506102a161044d366004612853565b610ef6565b34801561045e57600080fd5b506102a161046d366004612853565b610f61565b34801561047e57600080fd5b506101bb6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156104c757600080fd5b506102a16104d6366004612a32565b610fcc565b3480156104e757600080fd5b506102a16104f6366004612b5d565b611895565b34801561050757600080fd5b506102a1610516366004612b99565b611a89565b34801561052757600080fd5b506102a1610536366004612853565b611b55565b34801561054757600080fd5b5060035461021c9073ffffffffffffffffffffffffffffffffffffffff1681565b6004602052816000526040600020818154811061058457600080fd5b906000526020600020016000915091505080546105a090612bb6565b80601f01602080910402602001604051908101604052809291908181526020018280546105cc90612bb6565b80156106195780601f106105ee57610100808354040283529160200191610619565b820191906000526020600020905b8154815290600101906020018083116105fc57829003601f168201915b505050505081565b60035473ffffffffffffffffffffffffffffffffffffffff16331461068d5760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c6572000000000000000000000000000000000060448201526064015b60405180910390fd5b60008151116106de5760405162461bcd60e51b815260206004820152601960248201527f636f6d6d616e642074656d706c61746520697320656d707479000000000000006044820152606401610684565b6000828152600460205260409020546107395760405162461bcd60e51b815260206004820152601660248201527f74656d706c617465206964206e6f7420657869737473000000000000000000006044820152606401610684565b6000828152600460209081526040909120825161075892840190612446565b5060405182907fdc95812ca71c6147b64adc8089e8212c14080c611798d5b4a7b87a1c873a206d90600090a25050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146107ef5760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b73ffffffffffffffffffffffffffffffffffffffff81166108525760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207665726966696572206164647265737300000000000000006044820152606401610684565b60025473ffffffffffffffffffffffffffffffffffffffff16156108b85760405162461bcd60e51b815260206004820152601c60248201527f766572696669657220616c726561647920696e697469616c697a6564000000006044820152606401610684565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fd24015cc99cc1700cafca3042840a1d8ac1e3964fd2e0e37ea29c654056ee32790600090a250565b61092f611bb9565b61093882611cbd565b6109428282611cc5565b5050565b6000610950611e03565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b60035473ffffffffffffffffffffffffffffffffffffffff1633146109dc5760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b73ffffffffffffffffffffffffffffffffffffffff8116610a3f5760405162461bcd60e51b815260206004820152601d60248201527f696e76616c696420646b696d20726567697374727920616464726573730000006044820152606401610684565b60015473ffffffffffffffffffffffffffffffffffffffff1615610acb5760405162461bcd60e51b815260206004820152602160248201527f646b696d20726567697374727920616c726561647920696e697469616c697a6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610684565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f7dcb4f21aa9071293fb8d282306d5269b110fb7db13ebd4007d1cc52df66987190600090a250565b60035473ffffffffffffffffffffffffffffffffffffffff163314610ba15760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b600081815260046020526040902054610bfc5760405162461bcd60e51b815260206004820152601660248201527f74656d706c617465206964206e6f7420657869737473000000000000000000006044820152606401610684565b6000818152600460205260408120610c139161249c565b60405181907fd1df6b3b9269ea7ad12a1e9b67edf66ea65e4a308727c00f94ff7d1700e9640090600090a250565b610c49611e72565b610c536000611f00565b565b60035473ffffffffffffffffffffffffffffffffffffffff163314610cbc5760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b6000815111610d0d5760405162461bcd60e51b815260206004820152601960248201527f636f6d6d616e642074656d706c61746520697320656d707479000000000000006044820152606401610684565b60008281526004602052604090205415610d695760405162461bcd60e51b815260206004820152601a60248201527f74656d706c61746520696420616c7265616479206578697374730000000000006044820152606401610684565b60008281526004602090815260409091208251610d8892840190612446565b5060405182907fc1b747b5a151be511e4c17beca7d944cf64950b8deae15f8f3d4f879ed4bea6590600090a25050565b600081815260046020526040902054606090610e165760405162461bcd60e51b815260206004820152601660248201527f74656d706c617465206964206e6f7420657869737473000000000000000000006044820152606401610684565b600082815260046020908152604080832080548251818502810185019093528083529193909284015b82821015610eeb578382906000526020600020018054610e5e90612bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8a90612bb6565b8015610ed75780601f10610eac57610100808354040283529160200191610ed7565b820191906000526020600020905b815481529060010190602001808311610eba57829003601f168201915b505050505081526020019060010190610e3f565b505050509050919050565b610efe611e72565b73ffffffffffffffffffffffffffffffffffffffff81166108b85760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207665726966696572206164647265737300000000000000006044820152606401610684565b610f69611e72565b73ffffffffffffffffffffffffffffffffffffffff8116610acb5760405162461bcd60e51b815260206004820152601d60248201527f696e76616c696420646b696d20726567697374727920616464726573730000006044820152606401610684565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110335760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b8051600090815260046020908152604080832080548251818502810185019093528083529192909190849084015b8282101561110d57838290600052602060002001805461108090612bb6565b80601f01602080910402602001604051908101604052809291908181526020018280546110ac90612bb6565b80156110f95780601f106110ce576101008083540402835291602001916110f9565b820191906000526020600020905b8154815290600101906020018083116110dc57829003601f168201915b505050505081526020019060010190611061565b50505050905060008151116111645760405162461bcd60e51b815260206004820152601660248201527f74656d706c617465206964206e6f7420657869737473000000000000000000006044820152606401610684565b600154606083015180516020909101516040517fe7a7977a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9093169263e7a7977a926111c7929091600401612c09565b602060405180830381865afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112089190612c2b565b15156001146112595760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420646b696d207075626c6963206b65792068617368000000006044820152606401610684565b60608201516080015160009081526006602052604090205460ff16156112c15760405162461bcd60e51b815260206004820152601c60248201527f656d61696c206e756c6c696669657220616c72656164792075736564000000006044820152606401610684565b816060015160a001516000541461131a5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206163636f756e742073616c740000000000000000000000006044820152606401610684565b60075460ff1615806113325750606082015160400151155b806113465750600554826060015160400151115b6113925760405162461bcd60e51b815260206004820152601160248201527f696e76616c69642074696d657374616d700000000000000000000000000000006044820152606401610684565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639241b06e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114239190612c48565b82606001516060015151111561147b5760405162461bcd60e51b815260206004820152601d60248201527f696e76616c6964206d61736b656420636f6d6d616e64206c656e6774680000006044820152606401610684565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639241b06e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150c9190612c48565b8260400151106115845760405162461bcd60e51b815260206004820152602a60248201527f696e76616c69642073697a65206f662074686520736b697070656420636f6d6d60448201527f616e6420707265666978000000000000000000000000000000000000000000006064820152608401610684565b600061159c8360600151606001518460400151611f96565b60408051602081019091526000808252919250905b60038110156116dd5760208501516040517f4d69ffee00000000000000000000000000000000000000000000000000000000815273__$f4d9430cf243fdb92b3e972bc682ac2906$__91634d69ffee91611612919088908690600401612c61565b600060405180830381865af415801561162f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526116759190810190612d67565b915061168182846120e1565b6116dd57806002036116d55760405162461bcd60e51b815260206004820152600f60248201527f696e76616c696420636f6d6d616e6400000000000000000000000000000000006044820152606401610684565b6001016115b1565b5060025460608501516040517f9ecd831000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921691639ecd83109161173791600401612dd5565b602060405180830381865afa158015611754573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117789190612c2b565b15156001146117c95760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420656d61696c2070726f6f66000000000000000000000000006044820152606401610684565b606084015160800151600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560075460ff168015611822575060608401516040015115155b15611834576060840151604001516005555b606084015160a0810151608082015160c09092015186516040519293927f9f27709bbc2a611bc1af72b1bacf08b9776aa76e2d491ba740ad5625b2f6260492611887929015158252602082015260400190565b60405180910390a350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156118e05750825b905060008267ffffffffffffffff1660011480156118fd5750303b155b90508115801561190b575080155b15611942576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156119a35784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6119ac88612108565b6000879055600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556003805473ffffffffffffffffffffffffffffffffffffffff88167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790558315611a7f5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314611af05760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f65ee182e1dca6facd6369fe77c73620dceaa4d694dd6f200cfa7b92228c48edd9060200160405180910390a150565b611b5d611e72565b73ffffffffffffffffffffffffffffffffffffffff8116611bad576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610684565b611bb681611f00565b50565b3073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480611c8657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611c6d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610c53576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb6611e72565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611d4a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d4791810190612c48565b60015b611d98576040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610684565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611df4576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610684565b611dfe8383612119565b505050565b3073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610c53576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33611eb17f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610c53576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610684565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60608251821115611fe95760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206e756d626572206f662063686172616374657273000000006044820152606401610684565b82518390600090611ffb908590612ea7565b67ffffffffffffffff811115612013576120136125d9565b6040519080825280601f01601f19166020018201604052801561203d576020820181803683370190505b509050835b82518110156120d65782818151811061205d5761205d612ee1565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168261208f8784612ea7565b8151811061209f5761209f612ee1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612042565b509150505b92915050565b600081518351148015612101575081805190602001208380519060200120145b9392505050565b61211061217c565b611bb6816121e3565b612122826121eb565b60405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561217457611dfe82826122ba565b61094261233d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610c53576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b5d61217c565b8073ffffffffffffffffffffffffffffffffffffffff163b600003612254576040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610684565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606000808473ffffffffffffffffffffffffffffffffffffffff16846040516122e49190612f10565b600060405180830381855af49150503d806000811461231f576040519150601f19603f3d011682016040523d82523d6000602084013e612324565b606091505b5091509150612334858383612375565b95945050505050565b3415610c53576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608261238a5761238582612404565b612101565b81511580156123ae575073ffffffffffffffffffffffffffffffffffffffff84163b155b156123fd576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610684565b5092915050565b8051156124145780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82805482825590600052602060002090810192821561248c579160200282015b8281111561248c578251829061247c9082612f7a565b5091602001919060010190612466565b506124989291506124b6565b5090565b5080546000825590600052602060002090810190611bb691905b808211156124985760006124ca82826124d3565b506001016124b6565b5080546124df90612bb6565b6000825580601f106124ef575050565b601f016020900490600052602060002090810190611bb691905b808211156124985760008155600101612509565b6000806040838503121561253057600080fd5b50508035926020909101359150565b60005b8381101561255a578181015183820152602001612542565b50506000910152565b6000815180845261257b81602086016020860161253f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006121016020830184612563565b6000602082840312156125d257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff8111828210171561262c5761262c6125d9565b60405290565b6040516080810167ffffffffffffffff8111828210171561262c5761262c6125d9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561269c5761269c6125d9565b604052919050565b600067ffffffffffffffff8211156126be576126be6125d9565b5060051b60200190565b600067ffffffffffffffff8211156126e2576126e26125d9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261271f57600080fd5b8135602083016000612738612733846126c8565b612655565b905082815285838301111561274c57600080fd5b82826020830137600092810160200192909252509392505050565b6000806040838503121561277a57600080fd5b82359150602083013567ffffffffffffffff81111561279857600080fd5b8301601f810185136127a957600080fd5b80356127b7612733826126a4565b8082825260208201915060208360051b8501019250878311156127d957600080fd5b602084015b8381101561281b57803567ffffffffffffffff8111156127fd57600080fd5b61280c8a60208389010161270e565b845250602092830192016127de565b50809450505050509250929050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461284e57600080fd5b919050565b60006020828403121561286557600080fd5b6121018261282a565b6000806040838503121561288157600080fd5b61288a8361282a565b9150602083013567ffffffffffffffff8111156128a657600080fd5b6128b28582860161270e565b9150509250929050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015612933577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261291e858351612563565b945060209384019391909101906001016128e4565b50929695505050505050565b8015158114611bb657600080fd5b803561284e8161293f565b6000610100828403121561296b57600080fd5b612973612608565b9050813567ffffffffffffffff81111561298c57600080fd5b6129988482850161270e565b8252506020828101359082015260408083013590820152606082013567ffffffffffffffff8111156129c957600080fd5b6129d58482850161270e565b6060830152506080828101359082015260a080830135908201526129fb60c0830161294d565b60c082015260e082013567ffffffffffffffff811115612a1a57600080fd5b612a268482850161270e565b60e08301525092915050565b600060208284031215612a4457600080fd5b813567ffffffffffffffff811115612a5b57600080fd5b820160808185031215612a6d57600080fd5b612a75612632565b81358152602082013567ffffffffffffffff811115612a9357600080fd5b8201601f81018613612aa457600080fd5b8035612ab2612733826126a4565b8082825260208201915060208360051b850101925088831115612ad457600080fd5b602084015b83811015612b1657803567ffffffffffffffff811115612af857600080fd5b612b078b60208389010161270e565b84525060209283019201612ad9565b50602085015250505060408281013590820152606082013567ffffffffffffffff811115612b4357600080fd5b612b4f86828501612958565b606083015250949350505050565b600080600060608486031215612b7257600080fd5b612b7b8461282a565b925060208401359150612b906040850161282a565b90509250925092565b600060208284031215612bab57600080fd5b81356121018161293f565b600181811c90821680612bca57607f821691505b602082108103612c03577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b604081526000612c1c6040830185612563565b90508260208301529392505050565b600060208284031215612c3d57600080fd5b81516121018161293f565b600060208284031215612c5a57600080fd5b5051919050565b6000606082016060835280865180835260808501915060808160051b86010192506020880160005b82811015612cd8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80878603018452612cc3858351612563565b94506020938401939190910190600101612c89565b50505050828103602084015280855180835260208301915060208160051b8401016020880160005b83811015612d50577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552612d3a838351612563565b6020958601959093509190910190600101612d00565b505080945050505050826040830152949350505050565b600060208284031215612d7957600080fd5b815167ffffffffffffffff811115612d9057600080fd5b8201601f81018413612da157600080fd5b8051612daf612733826126c8565b818152856020838501011115612dc457600080fd5b61233482602083016020860161253f565b60208152600082516101006020840152612df3610120840182612563565b9050602084015160408401526040840151606084015260608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016080850152612e428282612563565b915050608084015160a084015260a084015160c084015260c0840151612e6c60e085018215159052565b5060e08401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016101008501526123348282612563565b818103818111156120db577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008251612f2281846020870161253f565b9190910192915050565b601f821115611dfe57806000526020600020601f840160051c81016020851015612f535750805b601f840160051c820191505b81811015612f735760008155600101612f5f565b5050505050565b815167ffffffffffffffff811115612f9457612f946125d9565b612fa881612fa28454612bb6565b84612f2c565b6020601f821160018114612ffa5760008315612fc45750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455612f73565b6000848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b828110156130485787850151825560209485019460019092019101613028565b508482101561308457868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220003154c84a4c001e7f68a2b8427040f7c97cbcba7daf690fd0cb7a8bea50b3e864736f6c634300081a0033","sourceMap":"1546:10970:23:-:0;;;1060:4:10;1017:48;;3122:16:23;;;;;;;;;;1546:10970;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{"node_modules/@zk-email/ether-email-auth-contracts/src/libraries/CommandUtils.sol":{"CommandUtils":[{"start":5668,"length":20}]}}},"deployedBytecode":{"object":"0x6080604052600436106101965760003560e01c80636c74921e116100e1578063a500125c1161008a578063d26b3e6e11610064578063d26b3e6e146104db578063e453c0f3146104fb578063f2fde38b1461051b578063f77c47911461053b57600080fd5b8063a500125c14610452578063ad3cb1cc14610472578063ad3f5f9b146104bb57600080fd5b80638ff3730f116100bb5780638ff3730f146103e557806395e33c081461040557806397fc007c1461043257600080fd5b80636c74921e14610370578063715018a6146103865780638da5cb5b1461039b57600080fd5b80634141407c11610143578063557cf5ef1161011d578063557cf5ef14610305578063640e8b6914610325578063663ea2e21461034557600080fd5b80634141407c146102bd5780634f1ef286146102dd57806352d1902d146102f057600080fd5b8063206137aa11610174578063206137aa1461024157806324e33f11146102815780633e56f529146102a357600080fd5b8063091c16501461019b57806319d8ac61146101d15780631bc01b83146101f5575b600080fd5b3480156101a757600080fd5b506101bb6101b636600461251d565b610568565b6040516101c891906125ad565b60405180910390f35b3480156101dd57600080fd5b506101e760055481565b6040519081526020016101c8565b34801561020157600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c8565b34801561024d57600080fd5b5061027161025c3660046125c0565b60066020526000908152604090205460ff1681565b60405190151581526020016101c8565b34801561028d57600080fd5b506102a161029c366004612767565b610621565b005b3480156102af57600080fd5b506007546102719060ff1681565b3480156102c957600080fd5b506102a16102d8366004612853565b610788565b6102a16102eb36600461286e565b610927565b3480156102fc57600080fd5b506101e7610946565b34801561031157600080fd5b506102a1610320366004612853565b610975565b34801561033157600080fd5b506102a16103403660046125c0565b610b3a565b34801561035157600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff1661021c565b34801561037c57600080fd5b506101e760005481565b34801561039257600080fd5b506102a1610c41565b3480156103a757600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1661021c565b3480156103f157600080fd5b506102a1610400366004612767565b610c55565b34801561041157600080fd5b506104256104203660046125c0565b610db8565b6040516101c891906128bc565b34801561043e57600080fd5b506102a161044d366004612853565b610ef6565b34801561045e57600080fd5b506102a161046d366004612853565b610f61565b34801561047e57600080fd5b506101bb6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156104c757600080fd5b506102a16104d6366004612a32565b610fcc565b3480156104e757600080fd5b506102a16104f6366004612b5d565b611895565b34801561050757600080fd5b506102a1610516366004612b99565b611a89565b34801561052757600080fd5b506102a1610536366004612853565b611b55565b34801561054757600080fd5b5060035461021c9073ffffffffffffffffffffffffffffffffffffffff1681565b6004602052816000526040600020818154811061058457600080fd5b906000526020600020016000915091505080546105a090612bb6565b80601f01602080910402602001604051908101604052809291908181526020018280546105cc90612bb6565b80156106195780601f106105ee57610100808354040283529160200191610619565b820191906000526020600020905b8154815290600101906020018083116105fc57829003601f168201915b505050505081565b60035473ffffffffffffffffffffffffffffffffffffffff16331461068d5760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c6572000000000000000000000000000000000060448201526064015b60405180910390fd5b60008151116106de5760405162461bcd60e51b815260206004820152601960248201527f636f6d6d616e642074656d706c61746520697320656d707479000000000000006044820152606401610684565b6000828152600460205260409020546107395760405162461bcd60e51b815260206004820152601660248201527f74656d706c617465206964206e6f7420657869737473000000000000000000006044820152606401610684565b6000828152600460209081526040909120825161075892840190612446565b5060405182907fdc95812ca71c6147b64adc8089e8212c14080c611798d5b4a7b87a1c873a206d90600090a25050565b60035473ffffffffffffffffffffffffffffffffffffffff1633146107ef5760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b73ffffffffffffffffffffffffffffffffffffffff81166108525760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207665726966696572206164647265737300000000000000006044820152606401610684565b60025473ffffffffffffffffffffffffffffffffffffffff16156108b85760405162461bcd60e51b815260206004820152601c60248201527f766572696669657220616c726561647920696e697469616c697a6564000000006044820152606401610684565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fd24015cc99cc1700cafca3042840a1d8ac1e3964fd2e0e37ea29c654056ee32790600090a250565b61092f611bb9565b61093882611cbd565b6109428282611cc5565b5050565b6000610950611e03565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b60035473ffffffffffffffffffffffffffffffffffffffff1633146109dc5760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b73ffffffffffffffffffffffffffffffffffffffff8116610a3f5760405162461bcd60e51b815260206004820152601d60248201527f696e76616c696420646b696d20726567697374727920616464726573730000006044820152606401610684565b60015473ffffffffffffffffffffffffffffffffffffffff1615610acb5760405162461bcd60e51b815260206004820152602160248201527f646b696d20726567697374727920616c726561647920696e697469616c697a6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610684565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f7dcb4f21aa9071293fb8d282306d5269b110fb7db13ebd4007d1cc52df66987190600090a250565b60035473ffffffffffffffffffffffffffffffffffffffff163314610ba15760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b600081815260046020526040902054610bfc5760405162461bcd60e51b815260206004820152601660248201527f74656d706c617465206964206e6f7420657869737473000000000000000000006044820152606401610684565b6000818152600460205260408120610c139161249c565b60405181907fd1df6b3b9269ea7ad12a1e9b67edf66ea65e4a308727c00f94ff7d1700e9640090600090a250565b610c49611e72565b610c536000611f00565b565b60035473ffffffffffffffffffffffffffffffffffffffff163314610cbc5760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b6000815111610d0d5760405162461bcd60e51b815260206004820152601960248201527f636f6d6d616e642074656d706c61746520697320656d707479000000000000006044820152606401610684565b60008281526004602052604090205415610d695760405162461bcd60e51b815260206004820152601a60248201527f74656d706c61746520696420616c7265616479206578697374730000000000006044820152606401610684565b60008281526004602090815260409091208251610d8892840190612446565b5060405182907fc1b747b5a151be511e4c17beca7d944cf64950b8deae15f8f3d4f879ed4bea6590600090a25050565b600081815260046020526040902054606090610e165760405162461bcd60e51b815260206004820152601660248201527f74656d706c617465206964206e6f7420657869737473000000000000000000006044820152606401610684565b600082815260046020908152604080832080548251818502810185019093528083529193909284015b82821015610eeb578382906000526020600020018054610e5e90612bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8a90612bb6565b8015610ed75780601f10610eac57610100808354040283529160200191610ed7565b820191906000526020600020905b815481529060010190602001808311610eba57829003601f168201915b505050505081526020019060010190610e3f565b505050509050919050565b610efe611e72565b73ffffffffffffffffffffffffffffffffffffffff81166108b85760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207665726966696572206164647265737300000000000000006044820152606401610684565b610f69611e72565b73ffffffffffffffffffffffffffffffffffffffff8116610acb5760405162461bcd60e51b815260206004820152601d60248201527f696e76616c696420646b696d20726567697374727920616464726573730000006044820152606401610684565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110335760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b8051600090815260046020908152604080832080548251818502810185019093528083529192909190849084015b8282101561110d57838290600052602060002001805461108090612bb6565b80601f01602080910402602001604051908101604052809291908181526020018280546110ac90612bb6565b80156110f95780601f106110ce576101008083540402835291602001916110f9565b820191906000526020600020905b8154815290600101906020018083116110dc57829003601f168201915b505050505081526020019060010190611061565b50505050905060008151116111645760405162461bcd60e51b815260206004820152601660248201527f74656d706c617465206964206e6f7420657869737473000000000000000000006044820152606401610684565b600154606083015180516020909101516040517fe7a7977a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9093169263e7a7977a926111c7929091600401612c09565b602060405180830381865afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112089190612c2b565b15156001146112595760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420646b696d207075626c6963206b65792068617368000000006044820152606401610684565b60608201516080015160009081526006602052604090205460ff16156112c15760405162461bcd60e51b815260206004820152601c60248201527f656d61696c206e756c6c696669657220616c72656164792075736564000000006044820152606401610684565b816060015160a001516000541461131a5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206163636f756e742073616c740000000000000000000000006044820152606401610684565b60075460ff1615806113325750606082015160400151155b806113465750600554826060015160400151115b6113925760405162461bcd60e51b815260206004820152601160248201527f696e76616c69642074696d657374616d700000000000000000000000000000006044820152606401610684565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639241b06e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114239190612c48565b82606001516060015151111561147b5760405162461bcd60e51b815260206004820152601d60248201527f696e76616c6964206d61736b656420636f6d6d616e64206c656e6774680000006044820152606401610684565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639241b06e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150c9190612c48565b8260400151106115845760405162461bcd60e51b815260206004820152602a60248201527f696e76616c69642073697a65206f662074686520736b697070656420636f6d6d60448201527f616e6420707265666978000000000000000000000000000000000000000000006064820152608401610684565b600061159c8360600151606001518460400151611f96565b60408051602081019091526000808252919250905b60038110156116dd5760208501516040517f4d69ffee00000000000000000000000000000000000000000000000000000000815273__$f4d9430cf243fdb92b3e972bc682ac2906$__91634d69ffee91611612919088908690600401612c61565b600060405180830381865af415801561162f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526116759190810190612d67565b915061168182846120e1565b6116dd57806002036116d55760405162461bcd60e51b815260206004820152600f60248201527f696e76616c696420636f6d6d616e6400000000000000000000000000000000006044820152606401610684565b6001016115b1565b5060025460608501516040517f9ecd831000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921691639ecd83109161173791600401612dd5565b602060405180830381865afa158015611754573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117789190612c2b565b15156001146117c95760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420656d61696c2070726f6f66000000000000000000000000006044820152606401610684565b606084015160800151600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560075460ff168015611822575060608401516040015115155b15611834576060840151604001516005555b606084015160a0810151608082015160c09092015186516040519293927f9f27709bbc2a611bc1af72b1bacf08b9776aa76e2d491ba740ad5625b2f6260492611887929015158252602082015260400190565b60405180910390a350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156118e05750825b905060008267ffffffffffffffff1660011480156118fd5750303b155b90508115801561190b575080155b15611942576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156119a35784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6119ac88612108565b6000879055600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556003805473ffffffffffffffffffffffffffffffffffffffff88167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790558315611a7f5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314611af05760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c7920636f6e74726f6c6c657200000000000000000000000000000000006044820152606401610684565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f65ee182e1dca6facd6369fe77c73620dceaa4d694dd6f200cfa7b92228c48edd9060200160405180910390a150565b611b5d611e72565b73ffffffffffffffffffffffffffffffffffffffff8116611bad576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610684565b611bb681611f00565b50565b3073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480611c8657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611c6d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610c53576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb6611e72565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611d4a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d4791810190612c48565b60015b611d98576040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610684565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611df4576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610684565b611dfe8383612119565b505050565b3073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610c53576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33611eb17f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610c53576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610684565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60608251821115611fe95760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206e756d626572206f662063686172616374657273000000006044820152606401610684565b82518390600090611ffb908590612ea7565b67ffffffffffffffff811115612013576120136125d9565b6040519080825280601f01601f19166020018201604052801561203d576020820181803683370190505b509050835b82518110156120d65782818151811061205d5761205d612ee1565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168261208f8784612ea7565b8151811061209f5761209f612ee1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612042565b509150505b92915050565b600081518351148015612101575081805190602001208380519060200120145b9392505050565b61211061217c565b611bb6816121e3565b612122826121eb565b60405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561217457611dfe82826122ba565b61094261233d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610c53576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b5d61217c565b8073ffffffffffffffffffffffffffffffffffffffff163b600003612254576040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610684565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606000808473ffffffffffffffffffffffffffffffffffffffff16846040516122e49190612f10565b600060405180830381855af49150503d806000811461231f576040519150601f19603f3d011682016040523d82523d6000602084013e612324565b606091505b5091509150612334858383612375565b95945050505050565b3415610c53576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608261238a5761238582612404565b612101565b81511580156123ae575073ffffffffffffffffffffffffffffffffffffffff84163b155b156123fd576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610684565b5092915050565b8051156124145780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82805482825590600052602060002090810192821561248c579160200282015b8281111561248c578251829061247c9082612f7a565b5091602001919060010190612466565b506124989291506124b6565b5090565b5080546000825590600052602060002090810190611bb691905b808211156124985760006124ca82826124d3565b506001016124b6565b5080546124df90612bb6565b6000825580601f106124ef575050565b601f016020900490600052602060002090810190611bb691905b808211156124985760008155600101612509565b6000806040838503121561253057600080fd5b50508035926020909101359150565b60005b8381101561255a578181015183820152602001612542565b50506000910152565b6000815180845261257b81602086016020860161253f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006121016020830184612563565b6000602082840312156125d257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff8111828210171561262c5761262c6125d9565b60405290565b6040516080810167ffffffffffffffff8111828210171561262c5761262c6125d9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561269c5761269c6125d9565b604052919050565b600067ffffffffffffffff8211156126be576126be6125d9565b5060051b60200190565b600067ffffffffffffffff8211156126e2576126e26125d9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261271f57600080fd5b8135602083016000612738612733846126c8565b612655565b905082815285838301111561274c57600080fd5b82826020830137600092810160200192909252509392505050565b6000806040838503121561277a57600080fd5b82359150602083013567ffffffffffffffff81111561279857600080fd5b8301601f810185136127a957600080fd5b80356127b7612733826126a4565b8082825260208201915060208360051b8501019250878311156127d957600080fd5b602084015b8381101561281b57803567ffffffffffffffff8111156127fd57600080fd5b61280c8a60208389010161270e565b845250602092830192016127de565b50809450505050509250929050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461284e57600080fd5b919050565b60006020828403121561286557600080fd5b6121018261282a565b6000806040838503121561288157600080fd5b61288a8361282a565b9150602083013567ffffffffffffffff8111156128a657600080fd5b6128b28582860161270e565b9150509250929050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015612933577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261291e858351612563565b945060209384019391909101906001016128e4565b50929695505050505050565b8015158114611bb657600080fd5b803561284e8161293f565b6000610100828403121561296b57600080fd5b612973612608565b9050813567ffffffffffffffff81111561298c57600080fd5b6129988482850161270e565b8252506020828101359082015260408083013590820152606082013567ffffffffffffffff8111156129c957600080fd5b6129d58482850161270e565b6060830152506080828101359082015260a080830135908201526129fb60c0830161294d565b60c082015260e082013567ffffffffffffffff811115612a1a57600080fd5b612a268482850161270e565b60e08301525092915050565b600060208284031215612a4457600080fd5b813567ffffffffffffffff811115612a5b57600080fd5b820160808185031215612a6d57600080fd5b612a75612632565b81358152602082013567ffffffffffffffff811115612a9357600080fd5b8201601f81018613612aa457600080fd5b8035612ab2612733826126a4565b8082825260208201915060208360051b850101925088831115612ad457600080fd5b602084015b83811015612b1657803567ffffffffffffffff811115612af857600080fd5b612b078b60208389010161270e565b84525060209283019201612ad9565b50602085015250505060408281013590820152606082013567ffffffffffffffff811115612b4357600080fd5b612b4f86828501612958565b606083015250949350505050565b600080600060608486031215612b7257600080fd5b612b7b8461282a565b925060208401359150612b906040850161282a565b90509250925092565b600060208284031215612bab57600080fd5b81356121018161293f565b600181811c90821680612bca57607f821691505b602082108103612c03577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b604081526000612c1c6040830185612563565b90508260208301529392505050565b600060208284031215612c3d57600080fd5b81516121018161293f565b600060208284031215612c5a57600080fd5b5051919050565b6000606082016060835280865180835260808501915060808160051b86010192506020880160005b82811015612cd8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80878603018452612cc3858351612563565b94506020938401939190910190600101612c89565b50505050828103602084015280855180835260208301915060208160051b8401016020880160005b83811015612d50577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552612d3a838351612563565b6020958601959093509190910190600101612d00565b505080945050505050826040830152949350505050565b600060208284031215612d7957600080fd5b815167ffffffffffffffff811115612d9057600080fd5b8201601f81018413612da157600080fd5b8051612daf612733826126c8565b818152856020838501011115612dc457600080fd5b61233482602083016020860161253f565b60208152600082516101006020840152612df3610120840182612563565b9050602084015160408401526040840151606084015260608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016080850152612e428282612563565b915050608084015160a084015260a084015160c084015260c0840151612e6c60e085018215159052565b5060e08401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016101008501526123348282612563565b818103818111156120db577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008251612f2281846020870161253f565b9190910192915050565b601f821115611dfe57806000526020600020601f840160051c81016020851015612f535750805b601f840160051c820191505b81811015612f735760008155600101612f5f565b5050505050565b815167ffffffffffffffff811115612f9457612f946125d9565b612fa881612fa28454612bb6565b84612f2c565b6020601f821160018114612ffa5760008315612fc45750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455612f73565b6000848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b828110156130485787850151825560209485019460019092019101613028565b508482101561308457868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220003154c84a4c001e7f68a2b8427040f7c97cbcba7daf690fd0cb7a8bea50b3e864736f6c634300081a0033","sourceMap":"1546:10970:23:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2117:49;;;;;;;;;;-1:-1:-1;2117:49:23;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2266:25;;;;;;;;;;;;;;;;;;;1326::29;;;1314:2;1299:18;2266:25:23;1180:177:29;3875:95:23;;;;;;;;;;-1:-1:-1;3958:4:23;;;;3875:95;;;1538:42:29;1526:55;;;1508:74;;1496:2;1481:18;3875:95:23;1362:226:29;2360:46:23;;;;;;;;;;-1:-1:-1;2360:46:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2085:14:29;;2078:22;2060:41;;2048:2;2033:18;2360:46:23;1920:187:29;7558:436:23;;;;;;;;;;-1:-1:-1;7558:436:23;;;;;:::i;:::-;;:::i;:::-;;2473:33;;;;;;;;;;-1:-1:-1;2473:33:23;;;;;;;;4905:353;;;;;;;;;;-1:-1:-1;4905:353:23;;;;;:::i;:::-;;:::i;3892:214:10:-;;;;;;:::i;:::-;;:::i;3439:134::-;;;;;;;;;;;;;:::i;4348:418:23:-;;;;;;;;;;-1:-1:-1;4348:418:23;;;;;:::i;:::-;;:::i;8213:293::-;;;;;;;;;;-1:-1:-1;8213:293:23;;;;;:::i;:::-;;:::i;4100:95::-;;;;;;;;;;-1:-1:-1;4179:8:23;;;;4100:95;;1711:26;;;;;;;;;;;;;;;;3155:101:0;;;;;;;;;;;;;:::i;2441:144::-;;;;;;;;;;-1:-1:-1;1313:22:0;2570:8;;;2441:144;;6830:442:23;;;;;;;;;;-1:-1:-1;6830:442:23;;;;;:::i;:::-;;:::i;6289:270::-;;;;;;;;;;-1:-1:-1;6289:270:23;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5848:234::-;;;;;;;;;;-1:-1:-1;5848:234:23;;;;;:::i;:::-;;:::i;5411:298::-;;;;;;;;;;-1:-1:-1;5411:298:23;;;;;:::i;:::-;;:::i;1708:58:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8847:2588:23;;;;;;;;;;-1:-1:-1;8847:2588:23;;;;;:::i;:::-;;:::i;3446:289::-;;;;;;;;;;-1:-1:-1;3446:289:23;;;;;:::i;:::-;;:::i;11646:166::-;;;;;;;;;;-1:-1:-1;11646:166:23;;;;;:::i;:::-;;:::i;3405:215:0:-;;;;;;;;;;-1:-1:-1;3405:215:0;;;;;:::i;:::-;;:::i;2009:25:23:-;;;;;;;;;;-1:-1:-1;2009:25:23;;;;;;;;2117:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7558:436::-;3068:10;;;;3054;:24;3046:52;;;;-1:-1:-1;;;3046:52:23;;11902:2:29;3046:52:23;;;11884:21:29;11941:2;11921:18;;;11914:30;11980:17;11960:18;;;11953:45;12015:18;;3046:52:23;;;;;;;;;7729:1:::1;7703:16;:23;:27;7695:65;;;::::0;-1:-1:-1;;;7695:65:23;;12246:2:29;7695:65:23::1;::::0;::::1;12228:21:29::0;12285:2;12265:18;;;12258:30;12324:27;12304:18;;;12297:55;12369:18;;7695:65:23::1;12044:349:29::0;7695:65:23::1;7830:1;7791:29:::0;;;:16:::1;:29;::::0;;;;:36;7770:109:::1;;;::::0;-1:-1:-1;;;7770:109:23;;12600:2:29;7770:109:23::1;::::0;::::1;12582:21:29::0;12639:2;12619:18;;;12612:30;12678:24;12658:18;;;12651:52;12720:18;;7770:109:23::1;12398:346:29::0;7770:109:23::1;7889:29;::::0;;;:16:::1;:29;::::0;;;;;;;:48;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;7952:35:23::1;::::0;7975:11;;7952:35:::1;::::0;;;::::1;7558:436:::0;;:::o;4905:353::-;3068:10;;;;3054;:24;3046:52;;;;-1:-1:-1;;;3046:52:23;;11902:2:29;3046:52:23;;;11884:21:29;11941:2;11921:18;;;11914:30;11980:17;11960:18;;;11953:45;12015:18;;3046:52:23;11700:339:29;3046:52:23;4990:27:::1;::::0;::::1;4982:64;;;::::0;-1:-1:-1;;;4982:64:23;;12951:2:29;4982:64:23::1;::::0;::::1;12933:21:29::0;12990:2;12970:18;;;12963:30;13029:26;13009:18;;;13002:54;13073:18;;4982:64:23::1;12749:348:29::0;4982:64:23::1;5085:8;::::0;5077:31:::1;5085:8;5077:31:::0;5056:106:::1;;;::::0;-1:-1:-1;;;5056:106:23;;13304:2:29;5056:106:23::1;::::0;::::1;13286:21:29::0;13343:2;13323:18;;;13316:30;13382;13362:18;;;13355:58;13430:18;;5056:106:23::1;13102:352:29::0;5056:106:23::1;5172:8;:34:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;5221:30:::1;::::0;::::1;::::0;-1:-1:-1;;5221:30:23::1;4905:353:::0;:::o;3892:214:10:-;2542:13;:11;:13::i;:::-;4007:36:::1;4025:17;4007;:36::i;:::-;4053:46;4075:17;4094:4;4053:21;:46::i;:::-;3892:214:::0;;:::o;3439:134::-;3508:7;2813:20;:18;:20::i;:::-;-1:-1:-1;1327:66:7::1;3439:134:10::0;:::o;4348:418:23:-;3068:10;;;;3054;:24;3046:52;;;;-1:-1:-1;;;3046:52:23;;11902:2:29;3046:52:23;;;11884:21:29;11941:2;11921:18;;;11914:30;11980:17;11960:18;;;11953:45;12015:18;;3046:52:23;11700:339:29;3046:52:23;4454:31:::1;::::0;::::1;4433:107;;;::::0;-1:-1:-1;;;4433:107:23;;13661:2:29;4433:107:23::1;::::0;::::1;13643:21:29::0;13700:2;13680:18;;;13673:30;13739:31;13719:18;;;13712:59;13788:18;;4433:107:23::1;13459:353:29::0;4433:107:23::1;4579:4;::::0;4571:27:::1;4579:4;4571:27:::0;4550:107:::1;;;::::0;-1:-1:-1;;;4550:107:23;;14019:2:29;4550:107:23::1;::::0;::::1;14001:21:29::0;14058:2;14038:18;;;14031:30;14097:34;14077:18;;;14070:62;14168:3;14148:18;;;14141:31;14189:19;;4550:107:23::1;13817:397:29::0;4550:107:23::1;4667:4;:39:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;4721:38:::1;::::0;::::1;::::0;-1:-1:-1;;4721:38:23::1;4348:418:::0;:::o;8213:293::-;3068:10;;;;3054;:24;3046:52;;;;-1:-1:-1;;;3046:52:23;;11902:2:29;3046:52:23;;;11884:21:29;11941:2;11921:18;;;11914:30;11980:17;11960:18;;;11953:45;12015:18;;3046:52:23;11700:339:29;3046:52:23;8354:1:::1;8315:29:::0;;;:16:::1;:29;::::0;;;;:36;8294:109:::1;;;::::0;-1:-1:-1;;;8294:109:23;;12600:2:29;8294:109:23::1;::::0;::::1;12582:21:29::0;12639:2;12619:18;;;12612:30;12678:24;12658:18;;;12651:52;12720:18;;8294:109:23::1;12398:346:29::0;8294:109:23::1;8420:29;::::0;;;:16:::1;:29;::::0;;;;8413:36:::1;::::0;::::1;:::i;:::-;8464:35;::::0;8487:11;;8464:35:::1;::::0;;;::::1;8213:293:::0;:::o;3155:101:0:-;2334:13;:11;:13::i;:::-;3219:30:::1;3246:1;3219:18;:30::i;:::-;3155:101::o:0;6830:442:23:-;3068:10;;;;3054;:24;3046:52;;;;-1:-1:-1;;;3046:52:23;;11902:2:29;3046:52:23;;;11884:21:29;11941:2;11921:18;;;11914:30;11980:17;11960:18;;;11953:45;12015:18;;3046:52:23;11700:339:29;3046:52:23;7001:1:::1;6975:16;:23;:27;6967:65;;;::::0;-1:-1:-1;;;6967:65:23;;12246:2:29;6967:65:23::1;::::0;::::1;12228:21:29::0;12285:2;12265:18;;;12258:30;12324:27;12304:18;;;12297:55;12369:18;;6967:65:23::1;12044:349:29::0;6967:65:23::1;7063:29;::::0;;;:16:::1;:29;::::0;;;;:36;:41;7042:114:::1;;;::::0;-1:-1:-1;;;7042:114:23;;14421:2:29;7042:114:23::1;::::0;::::1;14403:21:29::0;14460:2;14440:18;;;14433:30;14499:28;14479:18;;;14472:56;14545:18;;7042:114:23::1;14219:350:29::0;7042:114:23::1;7166:29;::::0;;;:16:::1;:29;::::0;;;;;;;:48;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;7229:36:23::1;::::0;7253:11;;7229:36:::1;::::0;;;::::1;6830:442:::0;;:::o;6289:270::-;6457:1;6418:29;;;:16;:29;;;;;:36;6370:15;;6397:109;;;;-1:-1:-1;;;6397:109:23;;12600:2:29;6397:109:23;;;12582:21:29;12639:2;12619:18;;;12612:30;12678:24;12658:18;;;12651:52;12720:18;;6397:109:23;12398:346:29;6397:109:23;6523:29;;;;:16;:29;;;;;;;;6516:36;;;;;;;;;;;;;;;;;;;6523:29;;6516:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6289:270;;;:::o;5848:234::-;2334:13:0;:11;:13::i;:::-;5930:27:23::1;::::0;::::1;5922:64;;;::::0;-1:-1:-1;;;5922:64:23;;12951:2:29;5922:64:23::1;::::0;::::1;12933:21:29::0;12990:2;12970:18;;;12963:30;13029:26;13009:18;;;13002:54;13073:18;;5922:64:23::1;12749:348:29::0;5411:298:23;2334:13:0;:11;:13::i;:::-;5514:31:23::1;::::0;::::1;5493:107;;;::::0;-1:-1:-1;;;5493:107:23;;13661:2:29;5493:107:23::1;::::0;::::1;13643:21:29::0;13700:2;13680:18;;;13673:30;13739:31;13719:18;;;13712:59;13788:18;;5493:107:23::1;13459:353:29::0;8847:2588:23;3068:10;;;;3054;:24;3046:52;;;;-1:-1:-1;;;3046:52:23;;11902:2:29;3046:52:23;;;11884:21:29;11941:2;11921:18;;;11914:30;11980:17;11960:18;;;11953:45;12015:18;;3046:52:23;11700:339:29;3046:52:23;8976:23;;8932:24:::1;8959:41:::0;;;:16:::1;:41;::::0;;;;;;;8932:68;;;;;;::::1;::::0;;;;;;;;;;;;8959:41;;8932:68;:24;;:68;::::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9036:1;9018:8;:15;:19;9010:54;;;::::0;-1:-1:-1;;;9010:54:23;;12600:2:29;9010:54:23::1;::::0;::::1;12582:21:29::0;12639:2;12619:18;;;12612:30;12678:24;12658:18;;;12651:52;12720:18;;9010:54:23::1;12398:346:29::0;9010:54:23::1;9095:4;::::0;9142:18:::1;::::0;::::1;::::0;:29;;9189:32:::1;::::0;;::::1;::::0;9095:140:::1;::::0;;;;:4:::1;::::0;;::::1;::::0;:29:::1;::::0;:140:::1;::::0;9142:29;;9095:140:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:148;;9239:4;9095:148;9074:223;;;::::0;-1:-1:-1;;;9074:223:23;;15322:2:29;9074:223:23::1;::::0;::::1;15304:21:29::0;15361:2;15341:18;;;15334:30;15400;15380:18;;;15373:58;15448:18;;9074:223:23::1;15120:352:29::0;9074:223:23::1;9343:18;::::0;::::1;::::0;:33:::1;;::::0;9328:49:::1;::::0;;;:14:::1;:49;::::0;;;;;::::1;;:58;9307:133;;;::::0;-1:-1:-1;;;9307:133:23;;15679:2:29;9307:133:23::1;::::0;::::1;15661:21:29::0;15718:2;15698:18;;;15691:30;15757;15737:18;;;15730:58;15805:18;;9307:133:23::1;15477:352:29::0;9307:133:23::1;9486:12;:18;;;:30;;;9471:11;;:45;9450:112;;;::::0;-1:-1:-1;;;9450:112:23;;16036:2:29;9450:112:23::1;::::0;::::1;16018:21:29::0;16075:2;16055:18;;;16048:30;16114:22;16094:18;;;16087:50;16154:18;;9450:112:23::1;15834:344:29::0;9450:112:23::1;9593:21;::::0;::::1;;:30;::::0;:83:::1;;-1:-1:-1::0;9643:18:23::1;::::0;::::1;::::0;:28:::1;;::::0;:33;9593:83:::1;:147;;;;9727:13;;9696:12;:18;;;:28;;;:44;9593:147;9572:211;;;::::0;-1:-1:-1;;;9572:211:23;;16385:2:29;9572:211:23::1;::::0;::::1;16367:21:29::0;16424:2;16404:18;;;16397:30;16463:19;16443:18;;;16436:47;16500:18;;9572:211:23::1;16183:341:29::0;9572:211:23::1;9880:8;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9820:12;:18;;;:32;;;9814:46;:90;;9793:166;;;::::0;-1:-1:-1;;;9793:166:23;;16920:2:29;9793:166:23::1;::::0;::::1;16902:21:29::0;16959:2;16939:18;;;16932:30;16998:31;16978:18;;;16971:59;17047:18;;9793:166:23::1;16718:353:29::0;9793:166:23::1;10026:8;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9990:12;:33;;;:60;9969:149;;;::::0;-1:-1:-1;;;9969:149:23;;17278:2:29;9969:149:23::1;::::0;::::1;17260:21:29::0;17317:2;17297:18;;;17290:30;17356:34;17336:18;;;17329:62;17427:12;17407:18;;;17400:40;17457:19;;9969:149:23::1;17076:406:29::0;9969:149:23::1;10229:34;10266:115;10292:12;:18;;;:32;;;10338:12;:33;;;10266:12;:115::i;:::-;10391:34;::::0;;::::1;::::0;::::1;::::0;;;:29:::1;:34:::0;;;10229:152;;-1:-1:-1;10391:34:23;10435:447:::1;10474:1;10461:10;:14;10435:447;;;10576:26;::::0;::::1;::::0;10523:147:::1;::::0;;;;:12:::1;::::0;:35:::1;::::0;:147:::1;::::0;10576:26;10620:8;;10646:10;;10523:147:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;10505:165;;10688:52;10702:15;10719:20;10688:13;:52::i;:::-;10760:5;10684:96;10797:10;10811:1;10797:15:::0;10793:79:::1;;10832:25;::::0;-1:-1:-1;;;10832:25:23;;20057:2:29;10832:25:23::1;::::0;::::1;20039:21:29::0;20096:2;20076:18;;;20069:30;20135:17;20115:18;;;20108:45;20170:18;;10832:25:23::1;19855:339:29::0;10793:79:23::1;10477:12;;10435:447;;;-1:-1:-1::0;10913:8:23::1;::::0;10939:18:::1;::::0;::::1;::::0;10913:45:::1;::::0;;;;:8:::1;::::0;;::::1;::::0;:25:::1;::::0;:45:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;10962:4;10913:53;10892:119;;;::::0;-1:-1:-1;;;10892:119:23;;21613:2:29;10892:119:23::1;::::0;::::1;21595:21:29::0;21652:2;21632:18;;;21625:30;21691:21;21671:18;;;21664:49;21730:18;;10892:119:23::1;21411:343:29::0;10892:119:23::1;11037:18;::::0;::::1;::::0;:33:::1;;::::0;11022:49:::1;::::0;;;:14:::1;:49;::::0;;;;:56;;;::::1;11074:4;11022:56;::::0;;11092:21:::1;::::0;11022:56:::1;11092:21;:58:::0;::::1;;;-1:-1:-1::0;11117:18:23::1;::::0;::::1;::::0;:28:::1;;::::0;:33;::::1;11092:58;11088:133;;;11182:18;::::0;::::1;::::0;:28:::1;;::::0;11166:13:::1;:44:::0;11088:133:::1;11307:18;::::0;::::1;::::0;:30:::1;::::0;::::1;::::0;11260:33:::1;::::0;::::1;::::0;11351:30:::1;::::0;;::::1;::::0;11395:23;;11235:193:::1;::::0;11307:30;;11260:33;11235:193:::1;::::0;::::1;::::0;11351:30;21952:14:29;21945:22;21927:41;;21999:2;21984:18;;21977:34;21915:2;21900:18;;21759:258;11235:193:23::1;;;;;;;;8922:2513;;;8847:2588:::0;:::o;3446:289::-;8870:21:1;4302:15;;;;;;;4301:16;;4348:14;;4158:30;4726:16;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;:16;;4805:1;4790:16;:50;;;;-1:-1:-1;4818:4:1;4810:25;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;;;;;;;;;;;;;4851:91;4951:18;;;;4968:1;4951:18;;;4979:67;;;;5013:22;;;;;;;;4979:67;3591:29:23::1;3606:13;3591:14;:29::i;:::-;3630:11;:26:::0;;;3666:21:::1;:28:::0;;;::::1;3690:4;3666:28;::::0;;3704:10:::1;:24:::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;5066:101:1;;;;5100:23;;;;;;5142:14;;-1:-1:-1;22175:50:29;;5142:14:1;;22163:2:29;22148:18;5142:14:1;;;;;;;5066:101;4092:1081;;;;;3446:289:23;;;:::o;11646:166::-;3068:10;;;;3054;:24;3046:52;;;;-1:-1:-1;;;3046:52:23;;11902:2:29;3046:52:23;;;11884:21:29;11941:2;11921:18;;;11914:30;11980:17;11960:18;;;11953:45;12015:18;;3046:52:23;11700:339:29;3046:52:23;11727:21:::1;:32:::0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;11774:31:::1;::::0;2060:41:29;;;11774:31:23::1;::::0;2048:2:29;2033:18;11774:31:23::1;;;;;;;11646:166:::0;:::o;3405:215:0:-;2334:13;:11;:13::i;:::-;3489:22:::1;::::0;::::1;3485:91;;3534:31;::::0;::::1;::::0;;3562:1:::1;3534:31;::::0;::::1;1508:74:29::0;1481:18;;3534:31:0::1;1362:226:29::0;3485:91:0::1;3585:28;3604:8;3585:18;:28::i;:::-;3405:215:::0;:::o;4333:312:10:-;4413:4;4405:23;4422:6;4405:23;;;:120;;;4519:6;4483:42;;:32;1327:66:7;2035:53;;;;1957:138;4483:32:10;:42;;;;4405:120;4388:251;;;4599:29;;;;;;;;;;;;;;11943:98:23;2334:13:0;:11;:13::i;5786:538:10:-;5903:17;5885:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5885:52:10;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;5881:437;;6247:60;;;;;1538:42:29;1526:55;;6247:60:10;;;1508:74:29;1481:18;;6247:60:10;1362:226:29;5881:437:10;1327:66:7;5979:40:10;;5975:120;;6046:34;;;;;;;;1326:25:29;;;1299:18;;6046:34:10;1180:177:29;5975:120:10;6108:54;6138:17;6157:4;6108:29;:54::i;:::-;5938:235;5786:538;;:::o;4762:213::-;4836:4;4828:23;4845:6;4828:23;;4824:145;;4929:29;;;;;;;;;;;;;;2658:162:0;966:10:2;2717:7:0;1313:22;2570:8;;;;2441:144;2717:7;:23;;;2713:101;;2763:40;;;;;966:10:2;2763:40:0;;;1508:74:29;1481:18;;2763:40:0;1362:226:29;3774:248:0;1313:22;3923:8;;3941:19;;;3923:8;3941:19;;;;;;;;3975:40;;3923:8;;;;;3975:40;;3847:24;;3975:40;3837:185;;3774:248;:::o;12047:467:23:-;12147:13;12198:3;12192:17;12180:8;:29;;12172:70;;;;-1:-1:-1;;;12172:70:23;;22627:2:29;12172:70:23;;;22609:21:29;22666:2;22646:18;;;22639:30;22705;22685:18;;;22678:58;22753:18;;12172:70:23;22425:352:29;12172:70:23;12329:15;;12283:3;;12253:21;;12329:26;;12347:8;;12329:26;:::i;:::-;12319:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12319:37:23;-1:-1:-1;12297:59:23;-1:-1:-1;12381:8:23;12367:109;12395:8;:15;12391:1;:19;12367:109;;;12454:8;12463:1;12454:11;;;;;;;;:::i;:::-;;;;;;;12431:6;12438:12;12442:8;12438:1;:12;:::i;:::-;12431:20;;;;;;;;:::i;:::-;;;;:34;;;;;;;;;;-1:-1:-1;12412:3:23;;12367:109;;;-1:-1:-1;12500:6:23;-1:-1:-1;;12047:467:23;;;;;:::o;2914:182:18:-;2986:4;3034:1;3028:15;3015:1;3009:15;:34;:80;;;;;3086:1;3070:19;;;;;;3063:1;3047:19;;;;;;:42;3009:80;3002:87;2914:182;-1:-1:-1;;;2914:182:18:o;1847:127:0:-;6931:20:1;:18;:20::i;:::-;1929:38:0::1;1954:12;1929:24;:38::i;2779:335:7:-:0;2870:37;2889:17;2870:18;:37::i;:::-;2922:27;;;;;;;;;;;2964:11;;:15;2960:148;;2995:53;3024:17;3043:4;2995:28;:53::i;2960:148::-;3079:18;:16;:18::i;7084:141:1:-;8870:21;8560:40;;;;;;7146:73;;7191:17;;;;;;;;;;;;;;1980:235:0;6931:20:1;:18;:20::i;2186:281:7:-;2263:17;:29;;;2296:1;2263:34;2259:119;;2320:47;;;;;1538:42:29;1526:55;;2320:47:7;;;1508:74:29;1481:18;;2320:47:7;1362:226:29;2259:119:7;1327:66;2387:73;;;;;;;;;;;;;;;2186:281::o;4106:253:14:-;4189:12;4214;4228:23;4255:6;:19;;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4213:67;;;;4297:55;4324:6;4332:7;4341:10;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:14:o;6598:122:7:-;6648:9;:13;6644:70;;6684:19;;;;;;;;;;;;;;4625:582:14;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;5071:18:14;;;;:23;5045:49;5041:119;;;5121:24;;;;;1538:42:29;1526:55;;5121:24:14;;;1508:74:29;1481:18;;5121:24:14;1362:226:29;5041:119:14;-1:-1:-1;5180:10:14;4625:582;-1:-1:-1;;4625:582:14:o;5743:516::-;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:346:29;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;204:23:29;;;324:2;309:18;;;296:32;;-1:-1:-1;14:346:29:o;365:250::-;450:1;460:113;474:6;471:1;468:13;460:113;;;550:11;;;544:18;531:11;;;524:39;496:2;489:10;460:113;;;-1:-1:-1;;607:1:29;589:16;;582:27;365:250::o;620:330::-;662:3;700:5;694:12;727:6;722:3;715:19;743:76;812:6;805:4;800:3;796:14;789:4;782:5;778:16;743:76;:::i;:::-;864:2;852:15;869:66;848:88;839:98;;;;939:4;835:109;;620:330;-1:-1:-1;;620:330:29:o;955:220::-;1104:2;1093:9;1086:21;1067:4;1124:45;1165:2;1154:9;1150:18;1142:6;1124:45;:::i;1593:226::-;1652:6;1705:2;1693:9;1684:7;1680:23;1676:32;1673:52;;;1721:1;1718;1711:12;1673:52;-1:-1:-1;1766:23:29;;1593:226;-1:-1:-1;1593:226:29:o;2112:184::-;2164:77;2161:1;2154:88;2261:4;2258:1;2251:15;2285:4;2282:1;2275:15;2301:255;2373:2;2367:9;2415:6;2403:19;;2452:18;2437:34;;2473:22;;;2434:62;2431:88;;;2499:18;;:::i;:::-;2535:2;2528:22;2301:255;:::o;2561:253::-;2633:2;2627:9;2675:4;2663:17;;2710:18;2695:34;;2731:22;;;2692:62;2689:88;;;2757:18;;:::i;2819:334::-;2890:2;2884:9;2946:2;2936:13;;2951:66;2932:86;2920:99;;3049:18;3034:34;;3070:22;;;3031:62;3028:88;;;3096:18;;:::i;:::-;3132:2;3125:22;2819:334;;-1:-1:-1;2819:334:29:o;3158:182::-;3217:4;3250:18;3242:6;3239:30;3236:56;;;3272:18;;:::i;:::-;-1:-1:-1;3317:1:29;3313:14;3329:4;3309:25;;3158:182::o;3345:246::-;3394:4;3427:18;3419:6;3416:30;3413:56;;;3449:18;;:::i;:::-;-1:-1:-1;3506:2:29;3494:15;3511:66;3490:88;3580:4;3486:99;;3345:246::o;3596:518::-;3639:5;3692:3;3685:4;3677:6;3673:17;3669:27;3659:55;;3710:1;3707;3700:12;3659:55;3750:6;3737:20;3789:4;3781:6;3777:17;3818:1;3839:53;3855:36;3884:6;3855:36;:::i;:::-;3839:53;:::i;:::-;3828:64;;3917:6;3908:7;3901:23;3957:3;3948:6;3943:3;3939:16;3936:25;3933:45;;;3974:1;3971;3964:12;3933:45;4025:6;4020:3;4013:4;4004:7;4000:18;3987:45;4081:1;4052:20;;;4074:4;4048:31;4041:42;;;;-1:-1:-1;4056:7:29;3596:518;-1:-1:-1;;;3596:518:29:o;4119:1166::-;4222:6;4230;4283:2;4271:9;4262:7;4258:23;4254:32;4251:52;;;4299:1;4296;4289:12;4251:52;4344:23;;;-1:-1:-1;4442:2:29;4427:18;;4414:32;4469:18;4458:30;;4455:50;;;4501:1;4498;4491:12;4455:50;4524:22;;4577:4;4569:13;;4565:27;-1:-1:-1;4555:55:29;;4606:1;4603;4596:12;4555:55;4646:2;4633:16;4669:63;4685:46;4724:6;4685:46;:::i;4669:63::-;4754:3;4778:6;4773:3;4766:19;4810:2;4805:3;4801:12;4794:19;;4865:2;4855:6;4852:1;4848:14;4844:2;4840:23;4836:32;4822:46;;4891:7;4883:6;4880:19;4877:39;;;4912:1;4909;4902:12;4877:39;4944:2;4940;4936:11;4956:299;4972:6;4967:3;4964:15;4956:299;;;5058:3;5045:17;5094:18;5081:11;5078:35;5075:55;;;5126:1;5123;5116:12;5075:55;5155:57;5204:7;5199:2;5185:11;5181:2;5177:20;5173:29;5155:57;:::i;:::-;5143:70;;-1:-1:-1;5242:2:29;5233:12;;;;4989;4956:299;;;4960:3;5274:5;5264:15;;;;;;4119:1166;;;;;:::o;5290:196::-;5358:20;;5418:42;5407:54;;5397:65;;5387:93;;5476:1;5473;5466:12;5387:93;5290:196;;;:::o;5491:186::-;5550:6;5603:2;5591:9;5582:7;5578:23;5574:32;5571:52;;;5619:1;5616;5609:12;5571:52;5642:29;5661:9;5642:29;:::i;5682:395::-;5759:6;5767;5820:2;5808:9;5799:7;5795:23;5791:32;5788:52;;;5836:1;5833;5826:12;5788:52;5859:29;5878:9;5859:29;:::i;:::-;5849:39;;5939:2;5928:9;5924:18;5911:32;5966:18;5958:6;5955:30;5952:50;;;5998:1;5995;5988:12;5952:50;6021;6063:7;6054:6;6043:9;6039:22;6021:50;:::i;:::-;6011:60;;;5682:395;;;;;:::o;6495:841::-;6657:4;6705:2;6694:9;6690:18;6735:2;6724:9;6717:21;6758:6;6793;6787:13;6824:6;6816;6809:22;6862:2;6851:9;6847:18;6840:25;;6924:2;6914:6;6911:1;6907:14;6896:9;6892:30;6888:39;6874:53;;6962:2;6954:6;6950:15;6983:1;6993:314;7007:6;7004:1;7001:13;6993:314;;;7096:66;7084:9;7076:6;7072:22;7068:95;7063:3;7056:108;7187:40;7220:6;7211;7205:13;7187:40;:::i;:::-;7177:50;-1:-1:-1;7262:2:29;7285:12;;;;7250:15;;;;;7029:1;7022:9;6993:314;;;-1:-1:-1;7324:6:29;;6495:841;-1:-1:-1;;;;;;6495:841:29:o;7341:118::-;7427:5;7420:13;7413:21;7406:5;7403:32;7393:60;;7449:1;7446;7439:12;7464:128;7529:20;;7558:28;7529:20;7558:28;:::i;7597:1292::-;7654:5;7702:6;7690:9;7685:3;7681:19;7677:32;7674:52;;;7722:1;7719;7712:12;7674:52;7744:22;;:::i;:::-;7735:31;;7802:9;7789:23;7835:18;7827:6;7824:30;7821:50;;;7867:1;7864;7857:12;7821:50;7894:46;7936:3;7927:6;7916:9;7912:22;7894:46;:::i;:::-;7880:61;;-1:-1:-1;8014:2:29;7999:18;;;7986:32;8034:14;;;8027:31;8131:2;8116:18;;;8103:32;8151:14;;;8144:31;8228:2;8213:18;;8200:32;8257:18;8244:32;;8241:52;;;8289:1;8286;8279:12;8241:52;8325:48;8369:3;8358:8;8347:9;8343:24;8325:48;:::i;:::-;8320:2;8309:14;;8302:72;-1:-1:-1;8447:3:29;8432:19;;;8419:33;8468:15;;;8461:32;8566:3;8551:19;;;8538:33;8587:15;;;8580:32;8645:36;8676:3;8661:19;;8645:36;:::i;:::-;8639:3;8632:5;8628:15;8621:61;8735:3;8724:9;8720:19;8707:33;8765:18;8755:8;8752:32;8749:52;;;8797:1;8794;8787:12;8749:52;8834:48;8878:3;8867:8;8856:9;8852:24;8834:48;:::i;:::-;8828:3;8821:5;8817:15;8810:73;;7597:1292;;;;:::o;8894:1734::-;8983:6;9036:2;9024:9;9015:7;9011:23;9007:32;9004:52;;;9052:1;9049;9042:12;9004:52;9092:9;9079:23;9125:18;9117:6;9114:30;9111:50;;;9157:1;9154;9147:12;9111:50;9180:22;;9236:4;9218:16;;;9214:27;9211:47;;;9254:1;9251;9244:12;9211:47;9280:22;;:::i;:::-;9347:16;;9372:22;;9440:2;9432:11;;9419:25;9469:18;9456:32;;9453:52;;;9501:1;9498;9491:12;9453:52;9524:17;;9572:4;9564:13;;9560:27;-1:-1:-1;9550:55:29;;9601:1;9598;9591:12;9550:55;9641:2;9628:16;9664:63;9680:46;9719:6;9680:46;:::i;9664:63::-;9749:3;9773:6;9768:3;9761:19;9805:2;9800:3;9796:12;9789:19;;9860:2;9850:6;9847:1;9843:14;9839:2;9835:23;9831:32;9817:46;;9886:7;9878:6;9875:19;9872:39;;;9907:1;9904;9897:12;9872:39;9939:2;9935;9931:11;9951:299;9967:6;9962:3;9959:15;9951:299;;;10053:3;10040:17;10089:18;10076:11;10073:35;10070:55;;;10121:1;10118;10111:12;10070:55;10150:57;10199:7;10194:2;10180:11;10176:2;10172:20;10168:29;10150:57;:::i;:::-;10138:70;;-1:-1:-1;10237:2:29;10228:12;;;;9984;9951:299;;;-1:-1:-1;10277:2:29;10266:14;;10259:29;-1:-1:-1;;;10354:2:29;10346:11;;;10333:25;10374:14;;;10367:31;10444:2;10436:11;;10423:25;10473:18;10460:32;;10457:52;;;10505:1;10502;10495:12;10457:52;10541:56;10589:7;10578:8;10574:2;10570:17;10541:56;:::i;:::-;10536:2;10525:14;;10518:80;-1:-1:-1;10529:5:29;8894:1734;-1:-1:-1;;;;8894:1734:29:o;10633:374::-;10710:6;10718;10726;10779:2;10767:9;10758:7;10754:23;10750:32;10747:52;;;10795:1;10792;10785:12;10747:52;10818:29;10837:9;10818:29;:::i;:::-;10808:39;-1:-1:-1;10916:2:29;10901:18;;10888:32;;-1:-1:-1;10963:38:29;10997:2;10982:18;;10963:38;:::i;:::-;10953:48;;10633:374;;;;;:::o;11012:241::-;11068:6;11121:2;11109:9;11100:7;11096:23;11092:32;11089:52;;;11137:1;11134;11127:12;11089:52;11176:9;11163:23;11195:28;11217:5;11195:28;:::i;11258:437::-;11337:1;11333:12;;;;11380;;;11401:61;;11455:4;11447:6;11443:17;11433:27;;11401:61;11508:2;11500:6;11497:14;11477:18;11474:38;11471:218;;11545:77;11542:1;11535:88;11646:4;11643:1;11636:15;11674:4;11671:1;11664:15;11471:218;;11258:437;;;:::o;14574:291::-;14751:2;14740:9;14733:21;14714:4;14771:45;14812:2;14801:9;14797:18;14789:6;14771:45;:::i;:::-;14763:53;;14852:6;14847:2;14836:9;14832:18;14825:34;14574:291;;;;;:::o;14870:245::-;14937:6;14990:2;14978:9;14969:7;14965:23;14961:32;14958:52;;;15006:1;15003;14996:12;14958:52;15038:9;15032:16;15057:28;15079:5;15057:28;:::i;16529:184::-;16599:6;16652:2;16640:9;16631:7;16627:23;16623:32;16620:52;;;16668:1;16665;16658:12;16620:52;-1:-1:-1;16691:16:29;;16529:184;-1:-1:-1;16529:184:29:o;17487:1689::-;17781:4;17829:2;17818:9;17814:18;17859:2;17848:9;17841:21;17882:6;17917;17911:13;17948:6;17940;17933:22;17986:3;17975:9;17971:19;17964:26;;18049:3;18039:6;18036:1;18032:14;18021:9;18017:30;18013:40;17999:54;;18088:4;18080:6;18076:17;18111:1;18121:318;18135:6;18132:1;18129:13;18121:318;;;18224:66;18212:9;18204:6;18200:22;18196:95;18191:3;18184:108;18315:40;18348:6;18339;18333:13;18315:40;:::i;:::-;18305:50;-1:-1:-1;18390:4:29;18415:14;;;;18378:17;;;;;18157:1;18150:9;18121:318;;;18125:3;;;;18489:9;18481:6;18477:22;18470:4;18459:9;18455:20;18448:52;18522:6;18559;18553:13;18590:8;18582:6;18575:24;18629:4;18621:6;18617:17;18608:26;;18692:4;18680:8;18677:1;18673:16;18665:6;18661:29;18657:40;18734:4;18726:6;18722:17;18759:1;18769:335;18785:8;18780:3;18777:17;18769:335;;;18879:66;18870:6;18862;18858:19;18854:92;18847:5;18840:107;18970:42;19005:6;18994:8;18988:15;18970:42;:::i;:::-;19051:4;19078:16;;;;18960:52;;-1:-1:-1;19037:19:29;;;;;18813:1;18804:11;18769:335;;;18773:3;;19121:6;19113:14;;;;;;19163:6;19158:2;19147:9;19143:18;19136:34;17487:1689;;;;;;:::o;19181:669::-;19261:6;19314:2;19302:9;19293:7;19289:23;19285:32;19282:52;;;19330:1;19327;19320:12;19282:52;19363:9;19357:16;19396:18;19388:6;19385:30;19382:50;;;19428:1;19425;19418:12;19382:50;19451:22;;19504:4;19496:13;;19492:27;-1:-1:-1;19482:55:29;;19533:1;19530;19523:12;19482:55;19566:2;19560:9;19591:53;19607:36;19636:6;19607:36;:::i;19591:53::-;19667:6;19660:5;19653:21;19715:7;19710:2;19701:6;19697:2;19693:15;19689:24;19686:37;19683:57;;;19736:1;19733;19726:12;19683:57;19749:71;19813:6;19808:2;19801:5;19797:14;19792:2;19788;19784:11;19749:71;:::i;20199:1207::-;20384:2;20373:9;20366:21;20347:4;20422:6;20416:13;20465:6;20460:2;20449:9;20445:18;20438:34;20495:52;20542:3;20531:9;20527:19;20513:12;20495:52;:::i;:::-;20481:66;;20601:2;20593:6;20589:15;20583:22;20578:2;20567:9;20563:18;20556:50;20660:2;20652:6;20648:15;20642:22;20637:2;20626:9;20622:18;20615:50;20714:2;20706:6;20702:15;20696:22;20783:66;20771:9;20763:6;20759:22;20755:95;20749:3;20738:9;20734:19;20727:124;20874:41;20908:6;20892:14;20874:41;:::i;:::-;20860:55;;;20970:3;20962:6;20958:16;20952:23;20946:3;20935:9;20931:19;20924:52;21031:3;21023:6;21019:16;21013:23;21007:3;20996:9;20992:19;20985:52;21086:3;21078:6;21074:16;21068:23;21100:52;21147:3;21136:9;21132:19;21116:14;1894:13;1887:21;1875:34;;1824:91;21100:52;;21201:3;21193:6;21189:16;21183:23;21274:66;21262:9;21254:6;21250:22;21246:95;21237:6;21226:9;21222:22;21215:127;21359:41;21393:6;21377:14;21359:41;:::i;22782:282::-;22849:9;;;22870:11;;;22867:191;;;22914:77;22911:1;22904:88;23015:4;23012:1;23005:15;23043:4;23040:1;23033:15;23069:184;23121:77;23118:1;23111:88;23218:4;23215:1;23208:15;23242:4;23239:1;23232:15;23258:287;23387:3;23425:6;23419:13;23441:66;23500:6;23495:3;23488:4;23480:6;23476:17;23441:66;:::i;:::-;23523:16;;;;;23258:287;-1:-1:-1;;23258:287:29:o;23676:518::-;23778:2;23773:3;23770:11;23767:421;;;23814:5;23811:1;23804:16;23858:4;23855:1;23845:18;23928:2;23916:10;23912:19;23909:1;23905:27;23899:4;23895:38;23964:4;23952:10;23949:20;23946:47;;;-1:-1:-1;23987:4:29;23946:47;24042:2;24037:3;24033:12;24030:1;24026:20;24020:4;24016:31;24006:41;;24097:81;24115:2;24108:5;24105:13;24097:81;;;24174:1;24160:16;;24141:1;24130:13;24097:81;;;24101:3;;23676:518;;;:::o;24430:1418::-;24556:3;24550:10;24583:18;24575:6;24572:30;24569:56;;;24605:18;;:::i;:::-;24634:97;24724:6;24684:38;24716:4;24710:11;24684:38;:::i;:::-;24678:4;24634:97;:::i;:::-;24780:4;24811:2;24800:14;;24828:1;24823:768;;;;25635:1;25652:6;25649:89;;;-1:-1:-1;25704:19:29;;;25698:26;25649:89;24336:66;24327:1;24323:11;;;24319:84;24315:89;24305:100;24411:1;24407:11;;;24302:117;25751:81;;24793:1049;;24823:768;23623:1;23616:14;;;23660:4;23647:18;;24871:66;24859:79;;;25036:222;25050:7;25047:1;25044:14;25036:222;;;25132:19;;;25126:26;25111:42;;25239:4;25224:20;;;;25192:1;25180:14;;;;25066:12;25036:222;;;25040:3;25286:6;25277:7;25274:19;25271:261;;;25347:19;;;25341:26;25448:66;25430:1;25426:14;;;25442:3;25422:24;25418:97;25414:102;25399:118;25384:134;;25271:261;-1:-1:-1;;;;25578:1:29;25562:14;;;25558:22;25545:36;;-1:-1:-1;24430:1418:29:o","linkReferences":{"node_modules/@zk-email/ether-email-auth-contracts/src/libraries/CommandUtils.sol":{"CommandUtils":[{"start":5607,"length":20}]}},"immutableReferences":{"1192":[{"start":7121,"length":32},{"start":7162,"length":32},{"start":7707,"length":32}]}},"methodIdentifiers":{"UPGRADE_INTERFACE_VERSION()":"ad3cb1cc","accountSalt()":"6c74921e","authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))":"ad3f5f9b","commandTemplates(uint256,uint256)":"091c1650","controller()":"f77c4791","deleteCommandTemplate(uint256)":"640e8b69","dkimRegistryAddr()":"1bc01b83","getCommandTemplate(uint256)":"95e33c08","initDKIMRegistry(address)":"557cf5ef","initVerifier(address)":"4141407c","initialize(address,bytes32,address)":"d26b3e6e","insertCommandTemplate(uint256,string[])":"8ff3730f","lastTimestamp()":"19d8ac61","owner()":"8da5cb5b","proxiableUUID()":"52d1902d","renounceOwnership()":"715018a6","setTimestampCheckEnabled(bool)":"e453c0f3","timestampCheckEnabled()":"3e56f529","transferOwnership(address)":"f2fde38b","updateCommandTemplate(uint256,string[])":"24e33f11","updateDKIMRegistry(address)":"a500125c","updateVerifier(address)":"97fc007c","upgradeToAndCall(address,bytes)":"4f1ef286","usedNullifiers(bytes32)":"206137aa","verifierAddr()":"663ea2e2"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"templateId\",\"type\":\"uint256\"}],\"name\":\"CommandTemplateDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"templateId\",\"type\":\"uint256\"}],\"name\":\"CommandTemplateInserted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"templateId\",\"type\":\"uint256\"}],\"name\":\"CommandTemplateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dkimRegistry\",\"type\":\"address\"}],\"name\":\"DKIMRegistryUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"emailNullifier\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"accountSalt\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isCodeExist\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"templateId\",\"type\":\"uint256\"}],\"name\":\"EmailAuthed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"TimestampCheckEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"VerifierUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accountSalt\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"templateId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"commandParams\",\"type\":\"bytes[]\"},{\"internalType\":\"uint256\",\"name\":\"skippedCommandPrefix\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"domainName\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"publicKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"maskedCommand\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"emailNullifier\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"accountSalt\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"isCodeExist\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"internalType\":\"struct EmailProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct EmailAuthMsg\",\"name\":\"emailAuthMsg\",\"type\":\"tuple\"}],\"name\":\"authEmail\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"commandTemplates\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_templateId\",\"type\":\"uint256\"}],\"name\":\"deleteCommandTemplate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dkimRegistryAddr\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_templateId\",\"type\":\"uint256\"}],\"name\":\"getCommandTemplate\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_dkimRegistryAddr\",\"type\":\"address\"}],\"name\":\"initDKIMRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_verifierAddr\",\"type\":\"address\"}],\"name\":\"initVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_initialOwner\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_accountSalt\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_controller\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_templateId\",\"type\":\"uint256\"},{\"internalType\":\"string[]\",\"name\":\"_commandTemplate\",\"type\":\"string[]\"}],\"name\":\"insertCommandTemplate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_enabled\",\"type\":\"bool\"}],\"name\":\"setTimestampCheckEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timestampCheckEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_templateId\",\"type\":\"uint256\"},{\"internalType\":\"string[]\",\"name\":\"_commandTemplate\",\"type\":\"string[]\"}],\"name\":\"updateCommandTemplate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_dkimRegistryAddr\",\"type\":\"address\"}],\"name\":\"updateDKIMRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_verifierAddr\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"usedNullifiers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifierAddr\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Inherits from OwnableUpgradeable and UUPSUpgradeable for upgradeability and ownership management.\",\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))\":{\"details\":\"This function can only be called by the controller contract.\",\"params\":{\"emailAuthMsg\":\"The email auth message containing all necessary information for authentication and authorization.\"}},\"deleteCommandTemplate(uint256)\":{\"details\":\"This function can only be called by the owner of the contract.\",\"params\":{\"_templateId\":\"The ID of the command template to be deleted.\"}},\"dkimRegistryAddr()\":{\"returns\":{\"_0\":\"address The address of the DKIM registry contract.\"}},\"getCommandTemplate(uint256)\":{\"params\":{\"_templateId\":\"The ID of the command template to be retrieved.\"},\"returns\":{\"_0\":\"string[] The command template as an array of strings.\"}},\"initDKIMRegistry(address)\":{\"params\":{\"_dkimRegistryAddr\":\"The address of the DKIM registry contract.\"}},\"initVerifier(address)\":{\"params\":{\"_verifierAddr\":\"The address of the verifier contract.\"}},\"initialize(address,bytes32,address)\":{\"params\":{\"_accountSalt\":\"The account salt to derive CREATE2 address of this contract.\",\"_controller\":\"The address of the controller contract.\",\"_initialOwner\":\"The address of the initial owner.\"}},\"insertCommandTemplate(uint256,string[])\":{\"details\":\"This function can only be called by the owner of the contract.\",\"params\":{\"_commandTemplate\":\"The command template as an array of strings.\",\"_templateId\":\"The ID for the new command template.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setTimestampCheckEnabled(bool)\":{\"details\":\"This function can only be called by the contract owner.\",\"params\":{\"_enabled\":\"Boolean flag to enable or disable the timestamp check.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateCommandTemplate(uint256,string[])\":{\"details\":\"This function can only be called by the controller contract.\",\"params\":{\"_commandTemplate\":\"The new command template as an array of strings.\",\"_templateId\":\"The ID of the template to update.\"}},\"updateDKIMRegistry(address)\":{\"params\":{\"_dkimRegistryAddr\":\"The new address of the DKIM registry contract.\"}},\"updateVerifier(address)\":{\"params\":{\"_verifierAddr\":\"The new address of the verifier contract.\"}},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"verifierAddr()\":{\"returns\":{\"_0\":\"address The Address of the verifier contract.\"}}},\"title\":\"Email Authentication/Authorization Contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"accountSalt()\":{\"notice\":\"The CREATE2 salt of this contract defined as a hash of an email address and an account code.\"},\"authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))\":{\"notice\":\"Authenticate the email sender and authorize the message in the email command based on the provided email auth message.\"},\"commandTemplates(uint256,uint256)\":{\"notice\":\"A mapping of the supported command templates associated with its ID.\"},\"controller()\":{\"notice\":\"An address of a controller contract, defining the command templates supported by this contract.\"},\"deleteCommandTemplate(uint256)\":{\"notice\":\"Deletes an existing command template by its ID.\"},\"dkimRegistryAddr()\":{\"notice\":\"Returns the address of the DKIM registry contract.\"},\"getCommandTemplate(uint256)\":{\"notice\":\"Retrieves a command template by its ID.\"},\"initDKIMRegistry(address)\":{\"notice\":\"Initializes the address of the DKIM registry contract.\"},\"initVerifier(address)\":{\"notice\":\"Initializes the address of the verifier contract.\"},\"initialize(address,bytes32,address)\":{\"notice\":\"Initialize the contract with an initial owner and an account salt.\"},\"insertCommandTemplate(uint256,string[])\":{\"notice\":\"Inserts a new command template.\"},\"lastTimestamp()\":{\"notice\":\"A mapping of the hash of the authorized message associated with its `emailNullifier`.\"},\"setTimestampCheckEnabled(bool)\":{\"notice\":\"Enables or disables the timestamp check.\"},\"timestampCheckEnabled()\":{\"notice\":\"A boolean whether timestamp check is enabled or not.\"},\"updateCommandTemplate(uint256,string[])\":{\"notice\":\"Updates an existing command template by its ID.\"},\"updateDKIMRegistry(address)\":{\"notice\":\"Updates the address of the DKIM registry contract.\"},\"updateVerifier(address)\":{\"notice\":\"Updates the address of the verifier contract.\"},\"usedNullifiers(bytes32)\":{\"notice\":\"The latest `timestamp` in the verified `EmailAuthMsg`.\"},\"verifierAddr()\":{\"notice\":\"Returns the address of the verifier contract.\"}},\"notice\":\"This contract provides functionalities for the authentication of the email sender and the authentication of the message in the command part of the email body using DKIM and custom verification logic.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol\":\"EmailAuth\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":20000},\"remappings\":[\":@matterlabs/=node_modules/@matterlabs/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@uniswap/=node_modules/@uniswap/\",\":@zk-email/=node_modules/@zk-email/\",\":accountabstraction/=node_modules/accountabstraction/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":solady/=node_modules/solady/src/\"]},\"sources\":{\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"node_modules/@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9\",\"dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v\"]},\"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f\",\"dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt\"]},\"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a\",\"dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE\"]},\"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"node_modules/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd\",\"dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229\",\"dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850\",\"dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c\",\"dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453\",\"dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875\",\"dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc\",\"dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT\"]},\"node_modules/@zk-email/contracts/DKIMRegistry.sol\":{\"keccak256\":\"0x7dc85d2f80b81b60fab94575a0769f3ce6300bf4e8a2e5dddcd2a8c2aa9a6983\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7fff6d3157e54d256ca746845297e71b121e20959ca1932e95fc30def82bc809\",\"dweb:/ipfs/QmYvXA2dhqAXVqbC9mxnjFXBgNLqC1KKfdnDs1YSEqiKn3\"]},\"node_modules/@zk-email/contracts/interfaces/IDKIMRegistry.sol\":{\"keccak256\":\"0x85ee536632227f79e208f364bb0fa8fdf6c046baa048e158d0817b8d1fce615d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a64d541d2d914ce7e6a13605fbdfb64abfa43dc9f7e2e1865948e2e0ed0f4b6\",\"dweb:/ipfs/Qmc1yJHdkXMdR2nbkFhgCruuYnA76zV6784qbiFaN7xU5V\"]},\"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol\":{\"keccak256\":\"0x602fbb2c2639092b4730b2ab0c414358126695284014bb805777fbd12c8ceb92\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://602cb58ce5c0eb3a76bf75ec403b851c13318e5646cff56422839257d6ae4125\",\"dweb:/ipfs/QmVUCjPuUpx9auD7eNzXVNsFaifW9e9n2uBYzJqWwWHqum\"]},\"node_modules/@zk-email/ether-email-auth-contracts/src/interfaces/IGroth16Verifier.sol\":{\"keccak256\":\"0x3c3405cf20adfb69d760b204d1570c328f93b64f2caaf5e54f4a0ced6d2e2fcc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1a82f3d9a2a0cec1ef294758f555004bab93792213fe313ecf4542c36501c5c1\",\"dweb:/ipfs/QmcNnmvzMBaezF9CpDueah69UvxQNhBLw6S3aoGoVm9tLg\"]},\"node_modules/@zk-email/ether-email-auth-contracts/src/libraries/CommandUtils.sol\":{\"keccak256\":\"0xe5a54b706f91c1e02f408260f6f7c0dbe18697a3eb71394037813816a5bb7cd6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://12dcc386468bf001a99b38618af06ec993ccb11c8621731481d92f8934c8ebf3\",\"dweb:/ipfs/QmQCddXesydvzPkr1QDMbKPbS6JBHqSe34RncTARP3ByRz\"]},\"node_modules/@zk-email/ether-email-auth-contracts/src/libraries/DecimalUtils.sol\":{\"keccak256\":\"0x80b98721a7070856b3f000e61a54317ff441564ba5967c8a255c04a450747201\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://830b971ed21fd3ac7c944afda51db3401658f9788d6e8eb2e49d849edf0c3467\",\"dweb:/ipfs/QmQn1xgS48uTT4k8xCLeQ2oRm9CSDdkAkg11Q2FV6KppMU\"]},\"node_modules/@zk-email/ether-email-auth-contracts/src/utils/Verifier.sol\":{\"keccak256\":\"0xd93cd575c0ffaf3ae142a6450a0c295db4d21033a66ba77667193366b88e0b02\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b353b8d8a3ab7fdffd35a3c19216353960b13309da18842d79dc8d53ba9b3a23\",\"dweb:/ipfs/QmauaENbuVPZ7CRcfJkiKLPr8f5ecwAVDgNFjvL7eV5jyH\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"type":"error","name":"ERC1967InvalidImplementation"},{"inputs":[],"type":"error","name":"ERC1967NonPayable"},{"inputs":[],"type":"error","name":"FailedInnerCall"},{"inputs":[],"type":"error","name":"InvalidInitialization"},{"inputs":[],"type":"error","name":"NotInitializing"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"OwnableInvalidOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"OwnableUnauthorizedAccount"},{"inputs":[],"type":"error","name":"UUPSUnauthorizedCallContext"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"type":"error","name":"UUPSUnsupportedProxiableUUID"},{"inputs":[{"internalType":"uint256","name":"templateId","type":"uint256","indexed":true}],"type":"event","name":"CommandTemplateDeleted","anonymous":false},{"inputs":[{"internalType":"uint256","name":"templateId","type":"uint256","indexed":true}],"type":"event","name":"CommandTemplateInserted","anonymous":false},{"inputs":[{"internalType":"uint256","name":"templateId","type":"uint256","indexed":true}],"type":"event","name":"CommandTemplateUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"dkimRegistry","type":"address","indexed":true}],"type":"event","name":"DKIMRegistryUpdated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"emailNullifier","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"accountSalt","type":"bytes32","indexed":true},{"internalType":"bool","name":"isCodeExist","type":"bool","indexed":false},{"internalType":"uint256","name":"templateId","type":"uint256","indexed":false}],"type":"event","name":"EmailAuthed","anonymous":false},{"inputs":[{"internalType":"uint64","name":"version","type":"uint64","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool","indexed":false}],"type":"event","name":"TimestampCheckEnabled","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[{"internalType":"address","name":"verifier","type":"address","indexed":true}],"type":"event","name":"VerifierUpdated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"accountSalt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"struct EmailAuthMsg","name":"emailAuthMsg","type":"tuple","components":[{"internalType":"uint256","name":"templateId","type":"uint256"},{"internalType":"bytes[]","name":"commandParams","type":"bytes[]"},{"internalType":"uint256","name":"skippedCommandPrefix","type":"uint256"},{"internalType":"struct EmailProof","name":"proof","type":"tuple","components":[{"internalType":"string","name":"domainName","type":"string"},{"internalType":"bytes32","name":"publicKeyHash","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"string","name":"maskedCommand","type":"string"},{"internalType":"bytes32","name":"emailNullifier","type":"bytes32"},{"internalType":"bytes32","name":"accountSalt","type":"bytes32"},{"internalType":"bool","name":"isCodeExist","type":"bool"},{"internalType":"bytes","name":"proof","type":"bytes"}]}]}],"stateMutability":"nonpayable","type":"function","name":"authEmail"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"commandTemplates","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"deleteCommandTemplate"},{"inputs":[],"stateMutability":"view","type":"function","name":"dkimRegistryAddr","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getCommandTemplate","outputs":[{"internalType":"string[]","name":"","type":"string[]"}]},{"inputs":[{"internalType":"address","name":"_dkimRegistryAddr","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initDKIMRegistry"},{"inputs":[{"internalType":"address","name":"_verifierAddr","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initVerifier"},{"inputs":[{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"bytes32","name":"_accountSalt","type":"bytes32"},{"internalType":"address","name":"_controller","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"string[]","name":"_commandTemplate","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"insertCommandTemplate"},{"inputs":[],"stateMutability":"view","type":"function","name":"lastTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setTimestampCheckEnabled"},{"inputs":[],"stateMutability":"view","type":"function","name":"timestampCheckEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"uint256","name":"_templateId","type":"uint256"},{"internalType":"string[]","name":"_commandTemplate","type":"string[]"}],"stateMutability":"nonpayable","type":"function","name":"updateCommandTemplate"},{"inputs":[{"internalType":"address","name":"_dkimRegistryAddr","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"updateDKIMRegistry"},{"inputs":[{"internalType":"address","name":"_verifierAddr","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"updateVerifier"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"usedNullifiers","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"verifierAddr","outputs":[{"internalType":"address","name":"","type":"address"}]}],"devdoc":{"kind":"dev","methods":{"authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))":{"details":"This function can only be called by the controller contract.","params":{"emailAuthMsg":"The email auth message containing all necessary information for authentication and authorization."}},"deleteCommandTemplate(uint256)":{"details":"This function can only be called by the owner of the contract.","params":{"_templateId":"The ID of the command template to be deleted."}},"dkimRegistryAddr()":{"returns":{"_0":"address The address of the DKIM registry contract."}},"getCommandTemplate(uint256)":{"params":{"_templateId":"The ID of the command template to be retrieved."},"returns":{"_0":"string[] The command template as an array of strings."}},"initDKIMRegistry(address)":{"params":{"_dkimRegistryAddr":"The address of the DKIM registry contract."}},"initVerifier(address)":{"params":{"_verifierAddr":"The address of the verifier contract."}},"initialize(address,bytes32,address)":{"params":{"_accountSalt":"The account salt to derive CREATE2 address of this contract.","_controller":"The address of the controller contract.","_initialOwner":"The address of the initial owner."}},"insertCommandTemplate(uint256,string[])":{"details":"This function can only be called by the owner of the contract.","params":{"_commandTemplate":"The command template as an array of strings.","_templateId":"The ID for the new command template."}},"owner()":{"details":"Returns the address of the current owner."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"setTimestampCheckEnabled(bool)":{"details":"This function can only be called by the contract owner.","params":{"_enabled":"Boolean flag to enable or disable the timestamp check."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"updateCommandTemplate(uint256,string[])":{"details":"This function can only be called by the controller contract.","params":{"_commandTemplate":"The new command template as an array of strings.","_templateId":"The ID of the template to update."}},"updateDKIMRegistry(address)":{"params":{"_dkimRegistryAddr":"The new address of the DKIM registry contract."}},"updateVerifier(address)":{"params":{"_verifierAddr":"The new address of the verifier contract."}},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"verifierAddr()":{"returns":{"_0":"address The Address of the verifier contract."}}},"version":1},"userdoc":{"kind":"user","methods":{"accountSalt()":{"notice":"The CREATE2 salt of this contract defined as a hash of an email address and an account code."},"authEmail((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)))":{"notice":"Authenticate the email sender and authorize the message in the email command based on the provided email auth message."},"commandTemplates(uint256,uint256)":{"notice":"A mapping of the supported command templates associated with its ID."},"controller()":{"notice":"An address of a controller contract, defining the command templates supported by this contract."},"deleteCommandTemplate(uint256)":{"notice":"Deletes an existing command template by its ID."},"dkimRegistryAddr()":{"notice":"Returns the address of the DKIM registry contract."},"getCommandTemplate(uint256)":{"notice":"Retrieves a command template by its ID."},"initDKIMRegistry(address)":{"notice":"Initializes the address of the DKIM registry contract."},"initVerifier(address)":{"notice":"Initializes the address of the verifier contract."},"initialize(address,bytes32,address)":{"notice":"Initialize the contract with an initial owner and an account salt."},"insertCommandTemplate(uint256,string[])":{"notice":"Inserts a new command template."},"lastTimestamp()":{"notice":"A mapping of the hash of the authorized message associated with its `emailNullifier`."},"setTimestampCheckEnabled(bool)":{"notice":"Enables or disables the timestamp check."},"timestampCheckEnabled()":{"notice":"A boolean whether timestamp check is enabled or not."},"updateCommandTemplate(uint256,string[])":{"notice":"Updates an existing command template by its ID."},"updateDKIMRegistry(address)":{"notice":"Updates the address of the DKIM registry contract."},"updateVerifier(address)":{"notice":"Updates the address of the verifier contract."},"usedNullifiers(bytes32)":{"notice":"The latest `timestamp` in the verified `EmailAuthMsg`."},"verifierAddr()":{"notice":"Returns the address of the verifier contract."}},"version":1}},"settings":{"remappings":["@matterlabs/=node_modules/@matterlabs/","@openzeppelin/=node_modules/@openzeppelin/","@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@uniswap/=node_modules/@uniswap/","@zk-email/=node_modules/@zk-email/","accountabstraction/=node_modules/accountabstraction/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","solady/=node_modules/solady/src/"],"optimizer":{"enabled":true,"runs":20000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol":"EmailAuth"},"evmVersion":"paris","libraries":{}},"sources":{"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"keccak256":"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a","urls":["bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6","dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397","urls":["bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9","dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"],"license":"MIT"},"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"],"license":"MIT"},"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7","urls":["bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f","dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7","urls":["bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd","dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol":{"keccak256":"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80","urls":["bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229","dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS"],"license":"MIT"},"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70","urls":["bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c","dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq"],"license":"MIT"},"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2","urls":["bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850","dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792","urls":["bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453","dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d","urls":["bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875","dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72","urls":["bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc","dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT"],"license":"MIT"},"node_modules/@zk-email/contracts/DKIMRegistry.sol":{"keccak256":"0x7dc85d2f80b81b60fab94575a0769f3ce6300bf4e8a2e5dddcd2a8c2aa9a6983","urls":["bzz-raw://7fff6d3157e54d256ca746845297e71b121e20959ca1932e95fc30def82bc809","dweb:/ipfs/QmYvXA2dhqAXVqbC9mxnjFXBgNLqC1KKfdnDs1YSEqiKn3"],"license":"MIT"},"node_modules/@zk-email/contracts/interfaces/IDKIMRegistry.sol":{"keccak256":"0x85ee536632227f79e208f364bb0fa8fdf6c046baa048e158d0817b8d1fce615d","urls":["bzz-raw://4a64d541d2d914ce7e6a13605fbdfb64abfa43dc9f7e2e1865948e2e0ed0f4b6","dweb:/ipfs/Qmc1yJHdkXMdR2nbkFhgCruuYnA76zV6784qbiFaN7xU5V"],"license":"MIT"},"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol":{"keccak256":"0x602fbb2c2639092b4730b2ab0c414358126695284014bb805777fbd12c8ceb92","urls":["bzz-raw://602cb58ce5c0eb3a76bf75ec403b851c13318e5646cff56422839257d6ae4125","dweb:/ipfs/QmVUCjPuUpx9auD7eNzXVNsFaifW9e9n2uBYzJqWwWHqum"],"license":"MIT"},"node_modules/@zk-email/ether-email-auth-contracts/src/interfaces/IGroth16Verifier.sol":{"keccak256":"0x3c3405cf20adfb69d760b204d1570c328f93b64f2caaf5e54f4a0ced6d2e2fcc","urls":["bzz-raw://1a82f3d9a2a0cec1ef294758f555004bab93792213fe313ecf4542c36501c5c1","dweb:/ipfs/QmcNnmvzMBaezF9CpDueah69UvxQNhBLw6S3aoGoVm9tLg"],"license":"MIT"},"node_modules/@zk-email/ether-email-auth-contracts/src/libraries/CommandUtils.sol":{"keccak256":"0xe5a54b706f91c1e02f408260f6f7c0dbe18697a3eb71394037813816a5bb7cd6","urls":["bzz-raw://12dcc386468bf001a99b38618af06ec993ccb11c8621731481d92f8934c8ebf3","dweb:/ipfs/QmQCddXesydvzPkr1QDMbKPbS6JBHqSe34RncTARP3ByRz"],"license":"MIT"},"node_modules/@zk-email/ether-email-auth-contracts/src/libraries/DecimalUtils.sol":{"keccak256":"0x80b98721a7070856b3f000e61a54317ff441564ba5967c8a255c04a450747201","urls":["bzz-raw://830b971ed21fd3ac7c944afda51db3401658f9788d6e8eb2e49d849edf0c3467","dweb:/ipfs/QmQn1xgS48uTT4k8xCLeQ2oRm9CSDdkAkg11Q2FV6KppMU"],"license":"MIT"},"node_modules/@zk-email/ether-email-auth-contracts/src/utils/Verifier.sol":{"keccak256":"0xd93cd575c0ffaf3ae142a6450a0c295db4d21033a66ba77667193366b88e0b02","urls":["bzz-raw://b353b8d8a3ab7fdffd35a3c19216353960b13309da18842d79dc8d53ba9b3a23","dweb:/ipfs/QmauaENbuVPZ7CRcfJkiKLPr8f5ecwAVDgNFjvL7eV5jyH"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":4094,"contract":"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol:EmailAuth","label":"accountSalt","offset":0,"slot":"0","type":"t_bytes32"},{"astId":4098,"contract":"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol:EmailAuth","label":"dkim","offset":0,"slot":"1","type":"t_contract(IDKIMRegistry)4054"},{"astId":4102,"contract":"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol:EmailAuth","label":"verifier","offset":0,"slot":"2","type":"t_contract(Verifier)6081"},{"astId":4105,"contract":"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol:EmailAuth","label":"controller","offset":0,"slot":"3","type":"t_address"},{"astId":4111,"contract":"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol:EmailAuth","label":"commandTemplates","offset":0,"slot":"4","type":"t_mapping(t_uint256,t_array(t_string_storage)dyn_storage)"},{"astId":4114,"contract":"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol:EmailAuth","label":"lastTimestamp","offset":0,"slot":"5","type":"t_uint256"},{"astId":4119,"contract":"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol:EmailAuth","label":"usedNullifiers","offset":0,"slot":"6","type":"t_mapping(t_bytes32,t_bool)"},{"astId":4122,"contract":"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol:EmailAuth","label":"timestampCheckEnabled","offset":0,"slot":"7","type":"t_bool"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_array(t_string_storage)dyn_storage":{"encoding":"dynamic_array","label":"string[]","numberOfBytes":"32","base":"t_string_storage"},"t_bool":{"encoding":"inplace","label":"bool","numberOfBytes":"1"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_contract(IDKIMRegistry)4054":{"encoding":"inplace","label":"contract IDKIMRegistry","numberOfBytes":"20"},"t_contract(Verifier)6081":{"encoding":"inplace","label":"contract Verifier","numberOfBytes":"20"},"t_mapping(t_bytes32,t_bool)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => bool)","numberOfBytes":"32","value":"t_bool"},"t_mapping(t_uint256,t_array(t_string_storage)dyn_storage)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => string[])","numberOfBytes":"32","value":"t_array(t_string_storage)dyn_storage"},"t_string_storage":{"encoding":"bytes","label":"string","numberOfBytes":"32"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"ast":{"absolutePath":"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol","id":4802,"exportedSymbols":{"CommandUtils":[5427],"EmailAuth":[4801],"EmailAuthMsg":[4086],"EmailProof":[5684],"IDKIMRegistry":[4054],"OwnableUpgradeable":[194],"Strings":[2712],"UUPSUpgradeable":[1342],"Verifier":[6081]},"nodeType":"SourceUnit","src":"32:12485:23","nodes":[{"id":4056,"nodeType":"PragmaDirective","src":"32:24:23","nodes":[],"literals":["solidity","^","0.8",".12"]},{"id":4058,"nodeType":"ImportDirective","src":"58:48:23","nodes":[],"absolutePath":"node_modules/@zk-email/ether-email-auth-contracts/src/utils/Verifier.sol","file":"./utils/Verifier.sol","nameLocation":"-1:-1:-1","scope":4802,"sourceUnit":6082,"symbolAliases":[{"foreign":{"id":4057,"name":"EmailProof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5684,"src":"66:10:23","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":4060,"nodeType":"ImportDirective","src":"107:67:23","nodes":[],"absolutePath":"node_modules/@zk-email/contracts/DKIMRegistry.sol","file":"@zk-email/contracts/DKIMRegistry.sol","nameLocation":"-1:-1:-1","scope":4802,"sourceUnit":4043,"symbolAliases":[{"foreign":{"id":4059,"name":"IDKIMRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4054,"src":"115:13:23","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":4062,"nodeType":"ImportDirective","src":"175:46:23","nodes":[],"absolutePath":"node_modules/@zk-email/ether-email-auth-contracts/src/utils/Verifier.sol","file":"./utils/Verifier.sol","nameLocation":"-1:-1:-1","scope":4802,"sourceUnit":6082,"symbolAliases":[{"foreign":{"id":4061,"name":"Verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6081,"src":"183:8:23","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":4064,"nodeType":"ImportDirective","src":"222:58:23","nodes":[],"absolutePath":"node_modules/@zk-email/ether-email-auth-contracts/src/libraries/CommandUtils.sol","file":"./libraries/CommandUtils.sol","nameLocation":"-1:-1:-1","scope":4802,"sourceUnit":5428,"symbolAliases":[{"foreign":{"id":4063,"name":"CommandUtils","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5427,"src":"230:12:23","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":4066,"nodeType":"ImportDirective","src":"281:66:23","nodes":[],"absolutePath":"node_modules/@openzeppelin/contracts/utils/Strings.sol","file":"@openzeppelin/contracts/utils/Strings.sol","nameLocation":"-1:-1:-1","scope":4802,"sourceUnit":2713,"symbolAliases":[{"foreign":{"id":4065,"name":"Strings","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"289:7:23","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":4068,"nodeType":"ImportDirective","src":"348:88:23","nodes":[],"absolutePath":"node_modules/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol","file":"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol","nameLocation":"-1:-1:-1","scope":4802,"sourceUnit":1343,"symbolAliases":[{"foreign":{"id":4067,"name":"UUPSUpgradeable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1342,"src":"356:15:23","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":4070,"nodeType":"ImportDirective","src":"437:101:23","nodes":[],"absolutePath":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","file":"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","nameLocation":"-1:-1:-1","scope":4802,"sourceUnit":195,"symbolAliases":[{"foreign":{"id":4069,"name":"OwnableUpgradeable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":194,"src":"445:18:23","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":4086,"nodeType":"StructDefinition","src":"615:555:23","nodes":[],"canonicalName":"EmailAuthMsg","documentation":{"id":4071,"nodeType":"StructuredDocumentation","src":"540:75:23","text":"@notice Struct to hold the email authentication/authorization message."},"members":[{"constant":false,"id":4074,"mutability":"mutable","name":"templateId","nameLocation":"744:10:23","nodeType":"VariableDeclaration","scope":4086,"src":"739:15:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4073,"name":"uint","nodeType":"ElementaryTypeName","src":"739:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4078,"mutability":"mutable","name":"commandParams","nameLocation":"900:13:23","nodeType":"VariableDeclaration","scope":4086,"src":"892:21:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_storage_$dyn_storage_ptr","typeString":"bytes[]"},"typeName":{"baseType":{"id":4076,"name":"bytes","nodeType":"ElementaryTypeName","src":"892:5:23","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"id":4077,"nodeType":"ArrayTypeName","src":"892:7:23","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_storage_$dyn_storage_ptr","typeString":"bytes[]"}},"visibility":"internal"},{"constant":false,"id":4081,"mutability":"mutable","name":"skippedCommandPrefix","nameLocation":"984:20:23","nodeType":"VariableDeclaration","scope":4086,"src":"979:25:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4080,"name":"uint","nodeType":"ElementaryTypeName","src":"979:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4085,"mutability":"mutable","name":"proof","nameLocation":"1162:5:23","nodeType":"VariableDeclaration","scope":4086,"src":"1151:16:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_storage_ptr","typeString":"struct EmailProof"},"typeName":{"id":4084,"nodeType":"UserDefinedTypeName","pathNode":{"id":4083,"name":"EmailProof","nameLocations":["1151:10:23"],"nodeType":"IdentifierPath","referencedDeclaration":5684,"src":"1151:10:23"},"referencedDeclaration":5684,"src":"1151:10:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_storage_ptr","typeString":"struct EmailProof"}},"visibility":"internal"}],"name":"EmailAuthMsg","nameLocation":"622:12:23","scope":4802,"visibility":"public"},{"id":4801,"nodeType":"ContractDefinition","src":"1546:10970:23","nodes":[{"id":4094,"nodeType":"VariableDeclaration","src":"1711:26:23","nodes":[],"constant":false,"documentation":{"id":4092,"nodeType":"StructuredDocumentation","src":"1610:96:23","text":"The CREATE2 salt of this contract defined as a hash of an email address and an account code."},"functionSelector":"6c74921e","mutability":"mutable","name":"accountSalt","nameLocation":"1726:11:23","scope":4801,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4093,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1711:7:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"public"},{"id":4098,"nodeType":"VariableDeclaration","src":"1794:27:23","nodes":[],"constant":false,"documentation":{"id":4095,"nodeType":"StructuredDocumentation","src":"1743:46:23","text":"An instance of the DKIM registry contract."},"mutability":"mutable","name":"dkim","nameLocation":"1817:4:23","scope":4801,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"},"typeName":{"id":4097,"nodeType":"UserDefinedTypeName","pathNode":{"id":4096,"name":"IDKIMRegistry","nameLocations":["1794:13:23"],"nodeType":"IdentifierPath","referencedDeclaration":4054,"src":"1794:13:23"},"referencedDeclaration":4054,"src":"1794:13:23","typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}},"visibility":"internal"},{"id":4102,"nodeType":"VariableDeclaration","src":"1873:26:23","nodes":[],"constant":false,"documentation":{"id":4099,"nodeType":"StructuredDocumentation","src":"1827:41:23","text":"An instance of the Verifier contract."},"mutability":"mutable","name":"verifier","nameLocation":"1891:8:23","scope":4801,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"},"typeName":{"id":4101,"nodeType":"UserDefinedTypeName","pathNode":{"id":4100,"name":"Verifier","nameLocations":["1873:8:23"],"nodeType":"IdentifierPath","referencedDeclaration":6081,"src":"1873:8:23"},"referencedDeclaration":6081,"src":"1873:8:23","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}},"visibility":"internal"},{"id":4105,"nodeType":"VariableDeclaration","src":"2009:25:23","nodes":[],"constant":false,"documentation":{"id":4103,"nodeType":"StructuredDocumentation","src":"1905:99:23","text":"An address of a controller contract, defining the command templates supported by this contract."},"functionSelector":"f77c4791","mutability":"mutable","name":"controller","nameLocation":"2024:10:23","scope":4801,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4104,"name":"address","nodeType":"ElementaryTypeName","src":"2009:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":4111,"nodeType":"VariableDeclaration","src":"2117:49:23","nodes":[],"constant":false,"documentation":{"id":4106,"nodeType":"StructuredDocumentation","src":"2040:72:23","text":"A mapping of the supported command templates associated with its ID."},"functionSelector":"091c1650","mutability":"mutable","name":"commandTemplates","nameLocation":"2150:16:23","scope":4801,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string[])"},"typeName":{"id":4110,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":4107,"name":"uint","nodeType":"ElementaryTypeName","src":"2125:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Mapping","src":"2117:25:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string[])"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"baseType":{"id":4108,"name":"string","nodeType":"ElementaryTypeName","src":"2133:6:23","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":4109,"nodeType":"ArrayTypeName","src":"2133:8:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}}},"visibility":"public"},{"id":4114,"nodeType":"VariableDeclaration","src":"2266:25:23","nodes":[],"constant":false,"documentation":{"id":4112,"nodeType":"StructuredDocumentation","src":"2172:89:23","text":"A mapping of the hash of the authorized message associated with its `emailNullifier`."},"functionSelector":"19d8ac61","mutability":"mutable","name":"lastTimestamp","nameLocation":"2278:13:23","scope":4801,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4113,"name":"uint","nodeType":"ElementaryTypeName","src":"2266:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":4119,"nodeType":"VariableDeclaration","src":"2360:46:23","nodes":[],"constant":false,"documentation":{"id":4115,"nodeType":"StructuredDocumentation","src":"2297:58:23","text":"The latest `timestamp` in the verified `EmailAuthMsg`."},"functionSelector":"206137aa","mutability":"mutable","name":"usedNullifiers","nameLocation":"2392:14:23","scope":4801,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"},"typeName":{"id":4118,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":4116,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2368:7:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"2360:24:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":4117,"name":"bool","nodeType":"ElementaryTypeName","src":"2379:4:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}},"visibility":"public"},{"id":4122,"nodeType":"VariableDeclaration","src":"2473:33:23","nodes":[],"constant":false,"documentation":{"id":4120,"nodeType":"StructuredDocumentation","src":"2412:56:23","text":"A boolean whether timestamp check is enabled or not."},"functionSelector":"3e56f529","mutability":"mutable","name":"timestampCheckEnabled","nameLocation":"2485:21:23","scope":4801,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4121,"name":"bool","nodeType":"ElementaryTypeName","src":"2473:4:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"public"},{"id":4126,"nodeType":"EventDefinition","src":"2513:56:23","nodes":[],"anonymous":false,"eventSelector":"7dcb4f21aa9071293fb8d282306d5269b110fb7db13ebd4007d1cc52df669871","name":"DKIMRegistryUpdated","nameLocation":"2519:19:23","parameters":{"id":4125,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4124,"indexed":true,"mutability":"mutable","name":"dkimRegistry","nameLocation":"2555:12:23","nodeType":"VariableDeclaration","scope":4126,"src":"2539:28:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4123,"name":"address","nodeType":"ElementaryTypeName","src":"2539:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2538:30:23"}},{"id":4130,"nodeType":"EventDefinition","src":"2574:48:23","nodes":[],"anonymous":false,"eventSelector":"d24015cc99cc1700cafca3042840a1d8ac1e3964fd2e0e37ea29c654056ee327","name":"VerifierUpdated","nameLocation":"2580:15:23","parameters":{"id":4129,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4128,"indexed":true,"mutability":"mutable","name":"verifier","nameLocation":"2612:8:23","nodeType":"VariableDeclaration","scope":4130,"src":"2596:24:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4127,"name":"address","nodeType":"ElementaryTypeName","src":"2596:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2595:26:23"}},{"id":4134,"nodeType":"EventDefinition","src":"2627:55:23","nodes":[],"anonymous":false,"eventSelector":"c1b747b5a151be511e4c17beca7d944cf64950b8deae15f8f3d4f879ed4bea65","name":"CommandTemplateInserted","nameLocation":"2633:23:23","parameters":{"id":4133,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4132,"indexed":true,"mutability":"mutable","name":"templateId","nameLocation":"2670:10:23","nodeType":"VariableDeclaration","scope":4134,"src":"2657:23:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4131,"name":"uint","nodeType":"ElementaryTypeName","src":"2657:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2656:25:23"}},{"id":4138,"nodeType":"EventDefinition","src":"2687:54:23","nodes":[],"anonymous":false,"eventSelector":"dc95812ca71c6147b64adc8089e8212c14080c611798d5b4a7b87a1c873a206d","name":"CommandTemplateUpdated","nameLocation":"2693:22:23","parameters":{"id":4137,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4136,"indexed":true,"mutability":"mutable","name":"templateId","nameLocation":"2729:10:23","nodeType":"VariableDeclaration","scope":4138,"src":"2716:23:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4135,"name":"uint","nodeType":"ElementaryTypeName","src":"2716:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2715:25:23"}},{"id":4142,"nodeType":"EventDefinition","src":"2746:54:23","nodes":[],"anonymous":false,"eventSelector":"d1df6b3b9269ea7ad12a1e9b67edf66ea65e4a308727c00f94ff7d1700e96400","name":"CommandTemplateDeleted","nameLocation":"2752:22:23","parameters":{"id":4141,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4140,"indexed":true,"mutability":"mutable","name":"templateId","nameLocation":"2788:10:23","nodeType":"VariableDeclaration","scope":4142,"src":"2775:23:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4139,"name":"uint","nodeType":"ElementaryTypeName","src":"2775:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2774:25:23"}},{"id":4152,"nodeType":"EventDefinition","src":"2805:152:23","nodes":[],"anonymous":false,"eventSelector":"9f27709bbc2a611bc1af72b1bacf08b9776aa76e2d491ba740ad5625b2f62604","name":"EmailAuthed","nameLocation":"2811:11:23","parameters":{"id":4151,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4144,"indexed":true,"mutability":"mutable","name":"emailNullifier","nameLocation":"2848:14:23","nodeType":"VariableDeclaration","scope":4152,"src":"2832:30:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4143,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2832:7:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":4146,"indexed":true,"mutability":"mutable","name":"accountSalt","nameLocation":"2888:11:23","nodeType":"VariableDeclaration","scope":4152,"src":"2872:27:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4145,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2872:7:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":4148,"indexed":false,"mutability":"mutable","name":"isCodeExist","nameLocation":"2914:11:23","nodeType":"VariableDeclaration","scope":4152,"src":"2909:16:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4147,"name":"bool","nodeType":"ElementaryTypeName","src":"2909:4:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"},{"constant":false,"id":4150,"indexed":false,"mutability":"mutable","name":"templateId","nameLocation":"2940:10:23","nodeType":"VariableDeclaration","scope":4152,"src":"2935:15:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4149,"name":"uint","nodeType":"ElementaryTypeName","src":"2935:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2822:134:23"}},{"id":4156,"nodeType":"EventDefinition","src":"2962:42:23","nodes":[],"anonymous":false,"eventSelector":"65ee182e1dca6facd6369fe77c73620dceaa4d694dd6f200cfa7b92228c48edd","name":"TimestampCheckEnabled","nameLocation":"2968:21:23","parameters":{"id":4155,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4154,"indexed":false,"mutability":"mutable","name":"enabled","nameLocation":"2995:7:23","nodeType":"VariableDeclaration","scope":4156,"src":"2990:12:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4153,"name":"bool","nodeType":"ElementaryTypeName","src":"2990:4:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2989:14:23"}},{"id":4168,"nodeType":"ModifierDefinition","src":"3010:106:23","nodes":[],"body":{"id":4167,"nodeType":"Block","src":"3036:80:23","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4162,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":4159,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3054:3:23","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":4160,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3058:6:23","memberName":"sender","nodeType":"MemberAccess","src":"3054:10:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":4161,"name":"controller","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4105,"src":"3068:10:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3054:24:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6f6e6c7920636f6e74726f6c6c6572","id":4163,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3080:17:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_6d2ec6361b48afd812942ef598ad771a3bf64e44d7c051c331d5517294248cc7","typeString":"literal_string \"only controller\""},"value":"only controller"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_6d2ec6361b48afd812942ef598ad771a3bf64e44d7c051c331d5517294248cc7","typeString":"literal_string \"only controller\""}],"id":4158,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"3046:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4164,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3046:52:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4165,"nodeType":"ExpressionStatement","src":"3046:52:23"},{"id":4166,"nodeType":"PlaceholderStatement","src":"3108:1:23"}]},"name":"onlyController","nameLocation":"3019:14:23","parameters":{"id":4157,"nodeType":"ParameterList","parameters":[],"src":"3033:2:23"},"virtual":false,"visibility":"internal"},{"id":4172,"nodeType":"FunctionDefinition","src":"3122:16:23","nodes":[],"body":{"id":4171,"nodeType":"Block","src":"3136:2:23","nodes":[],"statements":[]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":4169,"nodeType":"ParameterList","parameters":[],"src":"3133:2:23"},"returnParameters":{"id":4170,"nodeType":"ParameterList","parameters":[],"src":"3136:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4201,"nodeType":"FunctionDefinition","src":"3446:289:23","nodes":[],"body":{"id":4200,"nodeType":"Block","src":"3581:154:23","nodes":[],"statements":[{"expression":{"arguments":[{"id":4185,"name":"_initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4175,"src":"3606:13:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":4184,"name":"__Ownable_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54,"src":"3591:14:23","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":4186,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3591:29:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4187,"nodeType":"ExpressionStatement","src":"3591:29:23"},{"expression":{"id":4190,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4188,"name":"accountSalt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4094,"src":"3630:11:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":4189,"name":"_accountSalt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4177,"src":"3644:12:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"3630:26:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":4191,"nodeType":"ExpressionStatement","src":"3630:26:23"},{"expression":{"id":4194,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4192,"name":"timestampCheckEnabled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4122,"src":"3666:21:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":4193,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3690:4:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"3666:28:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4195,"nodeType":"ExpressionStatement","src":"3666:28:23"},{"expression":{"id":4198,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4196,"name":"controller","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4105,"src":"3704:10:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":4197,"name":"_controller","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4179,"src":"3717:11:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3704:24:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":4199,"nodeType":"ExpressionStatement","src":"3704:24:23"}]},"documentation":{"id":4173,"nodeType":"StructuredDocumentation","src":"3144:297:23","text":"@notice Initialize the contract with an initial owner and an account salt.\n @param _initialOwner The address of the initial owner.\n @param _accountSalt The account salt to derive CREATE2 address of this contract.\n @param _controller The address of the controller contract."},"functionSelector":"d26b3e6e","implemented":true,"kind":"function","modifiers":[{"id":4182,"kind":"modifierInvocation","modifierName":{"id":4181,"name":"initializer","nameLocations":["3569:11:23"],"nodeType":"IdentifierPath","referencedDeclaration":302,"src":"3569:11:23"},"nodeType":"ModifierInvocation","src":"3569:11:23"}],"name":"initialize","nameLocation":"3455:10:23","parameters":{"id":4180,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4175,"mutability":"mutable","name":"_initialOwner","nameLocation":"3483:13:23","nodeType":"VariableDeclaration","scope":4201,"src":"3475:21:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4174,"name":"address","nodeType":"ElementaryTypeName","src":"3475:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":4177,"mutability":"mutable","name":"_accountSalt","nameLocation":"3514:12:23","nodeType":"VariableDeclaration","scope":4201,"src":"3506:20:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":4176,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3506:7:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":4179,"mutability":"mutable","name":"_controller","nameLocation":"3544:11:23","nodeType":"VariableDeclaration","scope":4201,"src":"3536:19:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4178,"name":"address","nodeType":"ElementaryTypeName","src":"3536:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3465:96:23"},"returnParameters":{"id":4183,"nodeType":"ParameterList","parameters":[],"src":"3581:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4213,"nodeType":"FunctionDefinition","src":"3875:95:23","nodes":[],"body":{"id":4212,"nodeType":"Block","src":"3933:37:23","nodes":[],"statements":[{"expression":{"arguments":[{"id":4209,"name":"dkim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4098,"src":"3958:4:23","typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}],"id":4208,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3950:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4207,"name":"address","nodeType":"ElementaryTypeName","src":"3950:7:23","typeDescriptions":{}}},"id":4210,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3950:13:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":4206,"id":4211,"nodeType":"Return","src":"3943:20:23"}]},"documentation":{"id":4202,"nodeType":"StructuredDocumentation","src":"3741:129:23","text":"@notice Returns the address of the DKIM registry contract.\n @return address The address of the DKIM registry contract."},"functionSelector":"1bc01b83","implemented":true,"kind":"function","modifiers":[],"name":"dkimRegistryAddr","nameLocation":"3884:16:23","parameters":{"id":4203,"nodeType":"ParameterList","parameters":[],"src":"3900:2:23"},"returnParameters":{"id":4206,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4205,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4213,"src":"3924:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4204,"name":"address","nodeType":"ElementaryTypeName","src":"3924:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3923:9:23"},"scope":4801,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":4225,"nodeType":"FunctionDefinition","src":"4100:95:23","nodes":[],"body":{"id":4224,"nodeType":"Block","src":"4154:41:23","nodes":[],"statements":[{"expression":{"arguments":[{"id":4221,"name":"verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4102,"src":"4179:8:23","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}],"id":4220,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4171:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4219,"name":"address","nodeType":"ElementaryTypeName","src":"4171:7:23","typeDescriptions":{}}},"id":4222,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4171:17:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"functionReturnParameters":4218,"id":4223,"nodeType":"Return","src":"4164:24:23"}]},"documentation":{"id":4214,"nodeType":"StructuredDocumentation","src":"3976:119:23","text":"@notice Returns the address of the verifier contract.\n @return address The Address of the verifier contract."},"functionSelector":"663ea2e2","implemented":true,"kind":"function","modifiers":[],"name":"verifierAddr","nameLocation":"4109:12:23","parameters":{"id":4215,"nodeType":"ParameterList","parameters":[],"src":"4121:2:23"},"returnParameters":{"id":4218,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4217,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4225,"src":"4145:7:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4216,"name":"address","nodeType":"ElementaryTypeName","src":"4145:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4144:9:23"},"scope":4801,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":4267,"nodeType":"FunctionDefinition","src":"4348:418:23","nodes":[],"body":{"id":4266,"nodeType":"Block","src":"4423:343:23","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4239,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4234,"name":"_dkimRegistryAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4228,"src":"4454:17:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":4237,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4483:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4236,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4475:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4235,"name":"address","nodeType":"ElementaryTypeName","src":"4475:7:23","typeDescriptions":{}}},"id":4238,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4475:10:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4454:31:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c696420646b696d2072656769737472792061646472657373","id":4240,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4499:31:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_97a35679d625debbefd008329e1f8e8a30458c6f6a20bd947beb9b6deaa0c500","typeString":"literal_string \"invalid dkim registry address\""},"value":"invalid dkim registry address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_97a35679d625debbefd008329e1f8e8a30458c6f6a20bd947beb9b6deaa0c500","typeString":"literal_string \"invalid dkim registry address\""}],"id":4233,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"4433:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4433:107:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4242,"nodeType":"ExpressionStatement","src":"4433:107:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4252,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":4246,"name":"dkim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4098,"src":"4579:4:23","typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}],"id":4245,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4571:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4244,"name":"address","nodeType":"ElementaryTypeName","src":"4571:7:23","typeDescriptions":{}}},"id":4247,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4571:13:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":4250,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4596:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4249,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4588:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4248,"name":"address","nodeType":"ElementaryTypeName","src":"4588:7:23","typeDescriptions":{}}},"id":4251,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4588:10:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4571:27:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"646b696d20726567697374727920616c726561647920696e697469616c697a6564","id":4253,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4612:35:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_541f5821ae40adf0b56d1f22fc65b4e090d51b2d0e4310dff6743422dc57266e","typeString":"literal_string \"dkim registry already initialized\""},"value":"dkim registry already initialized"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_541f5821ae40adf0b56d1f22fc65b4e090d51b2d0e4310dff6743422dc57266e","typeString":"literal_string \"dkim registry already initialized\""}],"id":4243,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"4550:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4254,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4550:107:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4255,"nodeType":"ExpressionStatement","src":"4550:107:23"},{"expression":{"id":4260,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4256,"name":"dkim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4098,"src":"4667:4:23","typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":4258,"name":"_dkimRegistryAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4228,"src":"4688:17:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":4257,"name":"IDKIMRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4054,"src":"4674:13:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IDKIMRegistry_$4054_$","typeString":"type(contract IDKIMRegistry)"}},"id":4259,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4674:32:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}},"src":"4667:39:23","typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}},"id":4261,"nodeType":"ExpressionStatement","src":"4667:39:23"},{"eventCall":{"arguments":[{"id":4263,"name":"_dkimRegistryAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4228,"src":"4741:17:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":4262,"name":"DKIMRegistryUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4126,"src":"4721:19:23","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":4264,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4721:38:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4265,"nodeType":"EmitStatement","src":"4716:43:23"}]},"documentation":{"id":4226,"nodeType":"StructuredDocumentation","src":"4201:142:23","text":"@notice Initializes the address of the DKIM registry contract.\n @param _dkimRegistryAddr The address of the DKIM registry contract."},"functionSelector":"557cf5ef","implemented":true,"kind":"function","modifiers":[{"id":4231,"kind":"modifierInvocation","modifierName":{"id":4230,"name":"onlyController","nameLocations":["4408:14:23"],"nodeType":"IdentifierPath","referencedDeclaration":4168,"src":"4408:14:23"},"nodeType":"ModifierInvocation","src":"4408:14:23"}],"name":"initDKIMRegistry","nameLocation":"4357:16:23","parameters":{"id":4229,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4228,"mutability":"mutable","name":"_dkimRegistryAddr","nameLocation":"4382:17:23","nodeType":"VariableDeclaration","scope":4267,"src":"4374:25:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4227,"name":"address","nodeType":"ElementaryTypeName","src":"4374:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4373:27:23"},"returnParameters":{"id":4232,"nodeType":"ParameterList","parameters":[],"src":"4423:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4309,"nodeType":"FunctionDefinition","src":"4905:353:23","nodes":[],"body":{"id":4308,"nodeType":"Block","src":"4972:286:23","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4281,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4276,"name":"_verifierAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4270,"src":"4990:13:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":4279,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5015:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4278,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5007:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4277,"name":"address","nodeType":"ElementaryTypeName","src":"5007:7:23","typeDescriptions":{}}},"id":4280,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5007:10:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4990:27:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c69642076657269666965722061646472657373","id":4282,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5019:26:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_b48d11607cae82df5c6cac26ca81a8e33463fc4198a67f34f69e81345252d4a2","typeString":"literal_string \"invalid verifier address\""},"value":"invalid verifier address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b48d11607cae82df5c6cac26ca81a8e33463fc4198a67f34f69e81345252d4a2","typeString":"literal_string \"invalid verifier address\""}],"id":4275,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"4982:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4283,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4982:64:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4284,"nodeType":"ExpressionStatement","src":"4982:64:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4294,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":4288,"name":"verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4102,"src":"5085:8:23","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}],"id":4287,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5077:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4286,"name":"address","nodeType":"ElementaryTypeName","src":"5077:7:23","typeDescriptions":{}}},"id":4289,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5077:17:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":4292,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5106:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4291,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5098:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4290,"name":"address","nodeType":"ElementaryTypeName","src":"5098:7:23","typeDescriptions":{}}},"id":4293,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5098:10:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5077:31:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"766572696669657220616c726561647920696e697469616c697a6564","id":4295,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5122:30:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_917a1f02f57f400b74203430b1934dbe942213e4676d1a3b443c3db2f8e814e7","typeString":"literal_string \"verifier already initialized\""},"value":"verifier already initialized"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_917a1f02f57f400b74203430b1934dbe942213e4676d1a3b443c3db2f8e814e7","typeString":"literal_string \"verifier already initialized\""}],"id":4285,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"5056:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4296,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5056:106:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4297,"nodeType":"ExpressionStatement","src":"5056:106:23"},{"expression":{"id":4302,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4298,"name":"verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4102,"src":"5172:8:23","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":4300,"name":"_verifierAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4270,"src":"5192:13:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":4299,"name":"Verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6081,"src":"5183:8:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Verifier_$6081_$","typeString":"type(contract Verifier)"}},"id":4301,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5183:23:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}},"src":"5172:34:23","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}},"id":4303,"nodeType":"ExpressionStatement","src":"5172:34:23"},{"eventCall":{"arguments":[{"id":4305,"name":"_verifierAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4270,"src":"5237:13:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":4304,"name":"VerifierUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4130,"src":"5221:15:23","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":4306,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5221:30:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4307,"nodeType":"EmitStatement","src":"5216:35:23"}]},"documentation":{"id":4268,"nodeType":"StructuredDocumentation","src":"4772:128:23","text":"@notice Initializes the address of the verifier contract.\n @param _verifierAddr The address of the verifier contract."},"functionSelector":"4141407c","implemented":true,"kind":"function","modifiers":[{"id":4273,"kind":"modifierInvocation","modifierName":{"id":4272,"name":"onlyController","nameLocations":["4957:14:23"],"nodeType":"IdentifierPath","referencedDeclaration":4168,"src":"4957:14:23"},"nodeType":"ModifierInvocation","src":"4957:14:23"}],"name":"initVerifier","nameLocation":"4914:12:23","parameters":{"id":4271,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4270,"mutability":"mutable","name":"_verifierAddr","nameLocation":"4935:13:23","nodeType":"VariableDeclaration","scope":4309,"src":"4927:21:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4269,"name":"address","nodeType":"ElementaryTypeName","src":"4927:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4926:23:23"},"returnParameters":{"id":4274,"nodeType":"ParameterList","parameters":[],"src":"4972:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4338,"nodeType":"FunctionDefinition","src":"5411:298:23","nodes":[],"body":{"id":4337,"nodeType":"Block","src":"5483:226:23","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4323,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4318,"name":"_dkimRegistryAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4312,"src":"5514:17:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":4321,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5543:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4320,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5535:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4319,"name":"address","nodeType":"ElementaryTypeName","src":"5535:7:23","typeDescriptions":{}}},"id":4322,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5535:10:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5514:31:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c696420646b696d2072656769737472792061646472657373","id":4324,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5559:31:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_97a35679d625debbefd008329e1f8e8a30458c6f6a20bd947beb9b6deaa0c500","typeString":"literal_string \"invalid dkim registry address\""},"value":"invalid dkim registry address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_97a35679d625debbefd008329e1f8e8a30458c6f6a20bd947beb9b6deaa0c500","typeString":"literal_string \"invalid dkim registry address\""}],"id":4317,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"5493:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5493:107:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4326,"nodeType":"ExpressionStatement","src":"5493:107:23"},{"expression":{"id":4331,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4327,"name":"dkim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4098,"src":"5610:4:23","typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":4329,"name":"_dkimRegistryAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4312,"src":"5631:17:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":4328,"name":"IDKIMRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4054,"src":"5617:13:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_IDKIMRegistry_$4054_$","typeString":"type(contract IDKIMRegistry)"}},"id":4330,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5617:32:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}},"src":"5610:39:23","typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}},"id":4332,"nodeType":"ExpressionStatement","src":"5610:39:23"},{"eventCall":{"arguments":[{"id":4334,"name":"_dkimRegistryAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4312,"src":"5684:17:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":4333,"name":"DKIMRegistryUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4126,"src":"5664:19:23","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":4335,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5664:38:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4336,"nodeType":"EmitStatement","src":"5659:43:23"}]},"documentation":{"id":4310,"nodeType":"StructuredDocumentation","src":"5264:142:23","text":"@notice Updates the address of the DKIM registry contract.\n @param _dkimRegistryAddr The new address of the DKIM registry contract."},"functionSelector":"a500125c","implemented":true,"kind":"function","modifiers":[{"id":4315,"kind":"modifierInvocation","modifierName":{"id":4314,"name":"onlyOwner","nameLocations":["5473:9:23"],"nodeType":"IdentifierPath","referencedDeclaration":89,"src":"5473:9:23"},"nodeType":"ModifierInvocation","src":"5473:9:23"}],"name":"updateDKIMRegistry","nameLocation":"5420:18:23","parameters":{"id":4313,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4312,"mutability":"mutable","name":"_dkimRegistryAddr","nameLocation":"5447:17:23","nodeType":"VariableDeclaration","scope":4338,"src":"5439:25:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4311,"name":"address","nodeType":"ElementaryTypeName","src":"5439:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5438:27:23"},"returnParameters":{"id":4316,"nodeType":"ParameterList","parameters":[],"src":"5483:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4367,"nodeType":"FunctionDefinition","src":"5848:234:23","nodes":[],"body":{"id":4366,"nodeType":"Block","src":"5912:170:23","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":4352,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4347,"name":"_verifierAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4341,"src":"5930:13:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":4350,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5955:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":4349,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5947:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":4348,"name":"address","nodeType":"ElementaryTypeName","src":"5947:7:23","typeDescriptions":{}}},"id":4351,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5947:10:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5930:27:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c69642076657269666965722061646472657373","id":4353,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5959:26:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_b48d11607cae82df5c6cac26ca81a8e33463fc4198a67f34f69e81345252d4a2","typeString":"literal_string \"invalid verifier address\""},"value":"invalid verifier address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b48d11607cae82df5c6cac26ca81a8e33463fc4198a67f34f69e81345252d4a2","typeString":"literal_string \"invalid verifier address\""}],"id":4346,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"5922:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4354,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5922:64:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4355,"nodeType":"ExpressionStatement","src":"5922:64:23"},{"expression":{"id":4360,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4356,"name":"verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4102,"src":"5996:8:23","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":4358,"name":"_verifierAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4341,"src":"6016:13:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":4357,"name":"Verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":6081,"src":"6007:8:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Verifier_$6081_$","typeString":"type(contract Verifier)"}},"id":4359,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6007:23:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}},"src":"5996:34:23","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}},"id":4361,"nodeType":"ExpressionStatement","src":"5996:34:23"},{"eventCall":{"arguments":[{"id":4363,"name":"_verifierAddr","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4341,"src":"6061:13:23","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":4362,"name":"VerifierUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4130,"src":"6045:15:23","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":4364,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6045:30:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4365,"nodeType":"EmitStatement","src":"6040:35:23"}]},"documentation":{"id":4339,"nodeType":"StructuredDocumentation","src":"5715:128:23","text":"@notice Updates the address of the verifier contract.\n @param _verifierAddr The new address of the verifier contract."},"functionSelector":"97fc007c","implemented":true,"kind":"function","modifiers":[{"id":4344,"kind":"modifierInvocation","modifierName":{"id":4343,"name":"onlyOwner","nameLocations":["5902:9:23"],"nodeType":"IdentifierPath","referencedDeclaration":89,"src":"5902:9:23"},"nodeType":"ModifierInvocation","src":"5902:9:23"}],"name":"updateVerifier","nameLocation":"5857:14:23","parameters":{"id":4342,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4341,"mutability":"mutable","name":"_verifierAddr","nameLocation":"5880:13:23","nodeType":"VariableDeclaration","scope":4367,"src":"5872:21:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4340,"name":"address","nodeType":"ElementaryTypeName","src":"5872:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"5871:23:23"},"returnParameters":{"id":4345,"nodeType":"ParameterList","parameters":[],"src":"5912:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4391,"nodeType":"FunctionDefinition","src":"6289:270:23","nodes":[],"body":{"id":4390,"nodeType":"Block","src":"6387:172:23","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4382,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":4377,"name":"commandTemplates","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4111,"src":"6418:16:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string storage ref[] storage ref)"}},"id":4379,"indexExpression":{"id":4378,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4370,"src":"6435:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6418:29:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"id":4380,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6448:6:23","memberName":"length","nodeType":"MemberAccess","src":"6418:36:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4381,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6457:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6418:40:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"74656d706c617465206964206e6f7420657869737473","id":4383,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6472:24:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_ace0b41ca22959af6b66ca83559ea534e1c12c39d4c57bd15dad801b3a7a4b2f","typeString":"literal_string \"template id not exists\""},"value":"template id not exists"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ace0b41ca22959af6b66ca83559ea534e1c12c39d4c57bd15dad801b3a7a4b2f","typeString":"literal_string \"template id not exists\""}],"id":4376,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"6397:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4384,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6397:109:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4385,"nodeType":"ExpressionStatement","src":"6397:109:23"},{"expression":{"baseExpression":{"id":4386,"name":"commandTemplates","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4111,"src":"6523:16:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string storage ref[] storage ref)"}},"id":4388,"indexExpression":{"id":4387,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4370,"src":"6540:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"6523:29:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"functionReturnParameters":4375,"id":4389,"nodeType":"Return","src":"6516:36:23"}]},"documentation":{"id":4368,"nodeType":"StructuredDocumentation","src":"6088:196:23","text":"@notice Retrieves a command template by its ID.\n @param _templateId The ID of the command template to be retrieved.\n @return string[] The command template as an array of strings."},"functionSelector":"95e33c08","implemented":true,"kind":"function","modifiers":[],"name":"getCommandTemplate","nameLocation":"6298:18:23","parameters":{"id":4371,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4370,"mutability":"mutable","name":"_templateId","nameLocation":"6331:11:23","nodeType":"VariableDeclaration","scope":4391,"src":"6326:16:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4369,"name":"uint","nodeType":"ElementaryTypeName","src":"6326:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6316:32:23"},"returnParameters":{"id":4375,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4374,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4391,"src":"6370:15:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":4372,"name":"string","nodeType":"ElementaryTypeName","src":"6370:6:23","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":4373,"nodeType":"ArrayTypeName","src":"6370:8:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"6369:17:23"},"scope":4801,"stateMutability":"view","virtual":false,"visibility":"public"},{"id":4431,"nodeType":"FunctionDefinition","src":"6830:442:23","nodes":[],"body":{"id":4430,"nodeType":"Block","src":"6957:315:23","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4406,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":4403,"name":"_commandTemplate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4397,"src":"6975:16:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":4404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"6992:6:23","memberName":"length","nodeType":"MemberAccess","src":"6975:23:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4405,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7001:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"6975:27:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"636f6d6d616e642074656d706c61746520697320656d707479","id":4407,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7004:27:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_f4dbb10cef8d9dc6fbf06b4880115a1773afde9fea8ca015f782e86a1de68243","typeString":"literal_string \"command template is empty\""},"value":"command template is empty"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f4dbb10cef8d9dc6fbf06b4880115a1773afde9fea8ca015f782e86a1de68243","typeString":"literal_string \"command template is empty\""}],"id":4402,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"6967:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4408,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6967:65:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4409,"nodeType":"ExpressionStatement","src":"6967:65:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4416,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":4411,"name":"commandTemplates","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4111,"src":"7063:16:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string storage ref[] storage ref)"}},"id":4413,"indexExpression":{"id":4412,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4394,"src":"7080:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7063:29:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"id":4414,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7093:6:23","memberName":"length","nodeType":"MemberAccess","src":"7063:36:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":4415,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7103:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7063:41:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"74656d706c61746520696420616c726561647920657869737473","id":4417,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7118:28:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_4a9aea92dffb986abf0d1b580d478cbc49f57606ac0c793ba504969910a5c96d","typeString":"literal_string \"template id already exists\""},"value":"template id already exists"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_4a9aea92dffb986abf0d1b580d478cbc49f57606ac0c793ba504969910a5c96d","typeString":"literal_string \"template id already exists\""}],"id":4410,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"7042:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4418,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7042:114:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4419,"nodeType":"ExpressionStatement","src":"7042:114:23"},{"expression":{"id":4424,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":4420,"name":"commandTemplates","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4111,"src":"7166:16:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string storage ref[] storage ref)"}},"id":4422,"indexExpression":{"id":4421,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4394,"src":"7183:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7166:29:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":4423,"name":"_commandTemplate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4397,"src":"7198:16:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"src":"7166:48:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"id":4425,"nodeType":"ExpressionStatement","src":"7166:48:23"},{"eventCall":{"arguments":[{"id":4427,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4394,"src":"7253:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4426,"name":"CommandTemplateInserted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4134,"src":"7229:23:23","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":4428,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7229:36:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4429,"nodeType":"EmitStatement","src":"7224:41:23"}]},"documentation":{"id":4392,"nodeType":"StructuredDocumentation","src":"6565:260:23","text":"@notice Inserts a new command template.\n @dev This function can only be called by the owner of the contract.\n @param _templateId The ID for the new command template.\n @param _commandTemplate The command template as an array of strings."},"functionSelector":"8ff3730f","implemented":true,"kind":"function","modifiers":[{"id":4400,"kind":"modifierInvocation","modifierName":{"id":4399,"name":"onlyController","nameLocations":["6942:14:23"],"nodeType":"IdentifierPath","referencedDeclaration":4168,"src":"6942:14:23"},"nodeType":"ModifierInvocation","src":"6942:14:23"}],"name":"insertCommandTemplate","nameLocation":"6839:21:23","parameters":{"id":4398,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4394,"mutability":"mutable","name":"_templateId","nameLocation":"6875:11:23","nodeType":"VariableDeclaration","scope":4431,"src":"6870:16:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4393,"name":"uint","nodeType":"ElementaryTypeName","src":"6870:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4397,"mutability":"mutable","name":"_commandTemplate","nameLocation":"6912:16:23","nodeType":"VariableDeclaration","scope":4431,"src":"6896:32:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":4395,"name":"string","nodeType":"ElementaryTypeName","src":"6896:6:23","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":4396,"nodeType":"ArrayTypeName","src":"6896:8:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"6860:74:23"},"returnParameters":{"id":4401,"nodeType":"ParameterList","parameters":[],"src":"6957:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4471,"nodeType":"FunctionDefinition","src":"7558:436:23","nodes":[],"body":{"id":4470,"nodeType":"Block","src":"7685:309:23","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4446,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":4443,"name":"_commandTemplate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4437,"src":"7703:16:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":4444,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7720:6:23","memberName":"length","nodeType":"MemberAccess","src":"7703:23:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4445,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7729:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7703:27:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"636f6d6d616e642074656d706c61746520697320656d707479","id":4447,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7732:27:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_f4dbb10cef8d9dc6fbf06b4880115a1773afde9fea8ca015f782e86a1de68243","typeString":"literal_string \"command template is empty\""},"value":"command template is empty"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f4dbb10cef8d9dc6fbf06b4880115a1773afde9fea8ca015f782e86a1de68243","typeString":"literal_string \"command template is empty\""}],"id":4442,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"7695:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4448,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7695:65:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4449,"nodeType":"ExpressionStatement","src":"7695:65:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4456,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":4451,"name":"commandTemplates","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4111,"src":"7791:16:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string storage ref[] storage ref)"}},"id":4453,"indexExpression":{"id":4452,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4434,"src":"7808:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7791:29:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"id":4454,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7821:6:23","memberName":"length","nodeType":"MemberAccess","src":"7791:36:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4455,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7830:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7791:40:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"74656d706c617465206964206e6f7420657869737473","id":4457,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7845:24:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_ace0b41ca22959af6b66ca83559ea534e1c12c39d4c57bd15dad801b3a7a4b2f","typeString":"literal_string \"template id not exists\""},"value":"template id not exists"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ace0b41ca22959af6b66ca83559ea534e1c12c39d4c57bd15dad801b3a7a4b2f","typeString":"literal_string \"template id not exists\""}],"id":4450,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"7770:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4458,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7770:109:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4459,"nodeType":"ExpressionStatement","src":"7770:109:23"},{"expression":{"id":4464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":4460,"name":"commandTemplates","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4111,"src":"7889:16:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string storage ref[] storage ref)"}},"id":4462,"indexExpression":{"id":4461,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4434,"src":"7906:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7889:29:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":4463,"name":"_commandTemplate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4437,"src":"7921:16:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"src":"7889:48:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"id":4465,"nodeType":"ExpressionStatement","src":"7889:48:23"},{"eventCall":{"arguments":[{"id":4467,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4434,"src":"7975:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4466,"name":"CommandTemplateUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4138,"src":"7952:22:23","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":4468,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"7952:35:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4469,"nodeType":"EmitStatement","src":"7947:40:23"}]},"documentation":{"id":4432,"nodeType":"StructuredDocumentation","src":"7278:275:23","text":"@notice Updates an existing command template by its ID.\n @dev This function can only be called by the controller contract.\n @param _templateId The ID of the template to update.\n @param _commandTemplate The new command template as an array of strings."},"functionSelector":"24e33f11","implemented":true,"kind":"function","modifiers":[{"id":4440,"kind":"modifierInvocation","modifierName":{"id":4439,"name":"onlyController","nameLocations":["7670:14:23"],"nodeType":"IdentifierPath","referencedDeclaration":4168,"src":"7670:14:23"},"nodeType":"ModifierInvocation","src":"7670:14:23"}],"name":"updateCommandTemplate","nameLocation":"7567:21:23","parameters":{"id":4438,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4434,"mutability":"mutable","name":"_templateId","nameLocation":"7603:11:23","nodeType":"VariableDeclaration","scope":4471,"src":"7598:16:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4433,"name":"uint","nodeType":"ElementaryTypeName","src":"7598:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":4437,"mutability":"mutable","name":"_commandTemplate","nameLocation":"7640:16:23","nodeType":"VariableDeclaration","scope":4471,"src":"7624:32:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":4435,"name":"string","nodeType":"ElementaryTypeName","src":"7624:6:23","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":4436,"nodeType":"ArrayTypeName","src":"7624:8:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"7588:74:23"},"returnParameters":{"id":4441,"nodeType":"ParameterList","parameters":[],"src":"7685:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4499,"nodeType":"FunctionDefinition","src":"8213:293:23","nodes":[],"body":{"id":4498,"nodeType":"Block","src":"8284:222:23","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4485,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"baseExpression":{"id":4480,"name":"commandTemplates","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4111,"src":"8315:16:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string storage ref[] storage ref)"}},"id":4482,"indexExpression":{"id":4481,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4474,"src":"8332:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8315:29:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"id":4483,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8345:6:23","memberName":"length","nodeType":"MemberAccess","src":"8315:36:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4484,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8354:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8315:40:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"74656d706c617465206964206e6f7420657869737473","id":4486,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8369:24:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_ace0b41ca22959af6b66ca83559ea534e1c12c39d4c57bd15dad801b3a7a4b2f","typeString":"literal_string \"template id not exists\""},"value":"template id not exists"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ace0b41ca22959af6b66ca83559ea534e1c12c39d4c57bd15dad801b3a7a4b2f","typeString":"literal_string \"template id not exists\""}],"id":4479,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"8294:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4487,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8294:109:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4488,"nodeType":"ExpressionStatement","src":"8294:109:23"},{"expression":{"id":4492,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"delete","prefix":true,"src":"8413:36:23","subExpression":{"baseExpression":{"id":4489,"name":"commandTemplates","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4111,"src":"8420:16:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string storage ref[] storage ref)"}},"id":4491,"indexExpression":{"id":4490,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4474,"src":"8437:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8420:29:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4493,"nodeType":"ExpressionStatement","src":"8413:36:23"},{"eventCall":{"arguments":[{"id":4495,"name":"_templateId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4474,"src":"8487:11:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4494,"name":"CommandTemplateDeleted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4142,"src":"8464:22:23","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$returns$__$","typeString":"function (uint256)"}},"id":4496,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8464:35:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4497,"nodeType":"EmitStatement","src":"8459:40:23"}]},"documentation":{"id":4472,"nodeType":"StructuredDocumentation","src":"8000:208:23","text":"@notice Deletes an existing command template by its ID.\n @dev This function can only be called by the owner of the contract.\n @param _templateId The ID of the command template to be deleted."},"functionSelector":"640e8b69","implemented":true,"kind":"function","modifiers":[{"id":4477,"kind":"modifierInvocation","modifierName":{"id":4476,"name":"onlyController","nameLocations":["8269:14:23"],"nodeType":"IdentifierPath","referencedDeclaration":4168,"src":"8269:14:23"},"nodeType":"ModifierInvocation","src":"8269:14:23"}],"name":"deleteCommandTemplate","nameLocation":"8222:21:23","parameters":{"id":4475,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4474,"mutability":"mutable","name":"_templateId","nameLocation":"8249:11:23","nodeType":"VariableDeclaration","scope":4499,"src":"8244:16:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4473,"name":"uint","nodeType":"ElementaryTypeName","src":"8244:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8243:18:23"},"returnParameters":{"id":4478,"nodeType":"ParameterList","parameters":[],"src":"8284:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4707,"nodeType":"FunctionDefinition","src":"8847:2588:23","nodes":[],"body":{"id":4706,"nodeType":"Block","src":"8922:2513:23","nodes":[],"statements":[{"assignments":[4512],"declarations":[{"constant":false,"id":4512,"mutability":"mutable","name":"template","nameLocation":"8948:8:23","nodeType":"VariableDeclaration","scope":4706,"src":"8932:24:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":4510,"name":"string","nodeType":"ElementaryTypeName","src":"8932:6:23","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":4511,"nodeType":"ArrayTypeName","src":"8932:8:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"id":4517,"initialValue":{"baseExpression":{"id":4513,"name":"commandTemplates","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4111,"src":"8959:16:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_array$_t_string_storage_$dyn_storage_$","typeString":"mapping(uint256 => string storage ref[] storage ref)"}},"id":4516,"indexExpression":{"expression":{"id":4514,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"8976:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4515,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"8989:10:23","memberName":"templateId","nodeType":"MemberAccess","referencedDeclaration":4074,"src":"8976:23:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8959:41:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage","typeString":"string storage ref[] storage ref"}},"nodeType":"VariableDeclarationStatement","src":"8932:68:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4522,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":4519,"name":"template","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4512,"src":"9018:8:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":4520,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9027:6:23","memberName":"length","nodeType":"MemberAccess","src":"9018:15:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":4521,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9036:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9018:19:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"74656d706c617465206964206e6f7420657869737473","id":4523,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9039:24:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_ace0b41ca22959af6b66ca83559ea534e1c12c39d4c57bd15dad801b3a7a4b2f","typeString":"literal_string \"template id not exists\""},"value":"template id not exists"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ace0b41ca22959af6b66ca83559ea534e1c12c39d4c57bd15dad801b3a7a4b2f","typeString":"literal_string \"template id not exists\""}],"id":4518,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"9010:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4524,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9010:54:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4525,"nodeType":"ExpressionStatement","src":"9010:54:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":4537,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"expression":{"id":4529,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"9142:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4530,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9155:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"9142:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4531,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9161:10:23","memberName":"domainName","nodeType":"MemberAccess","referencedDeclaration":5669,"src":"9142:29:23","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"expression":{"expression":{"id":4532,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"9189:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4533,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9202:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"9189:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4534,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9208:13:23","memberName":"publicKeyHash","nodeType":"MemberAccess","referencedDeclaration":5671,"src":"9189:32:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":4527,"name":"dkim","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4098,"src":"9095:4:23","typeDescriptions":{"typeIdentifier":"t_contract$_IDKIMRegistry_$4054","typeString":"contract IDKIMRegistry"}},"id":4528,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9100:24:23","memberName":"isDKIMPublicKeyHashValid","nodeType":"MemberAccess","referencedDeclaration":4053,"src":"9095:29:23","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$_t_bytes32_$returns$_t_bool_$","typeString":"function (string memory,bytes32) view external returns (bool)"}},"id":4535,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9095:140:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"74727565","id":4536,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"9239:4:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"9095:148:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c696420646b696d207075626c6963206b65792068617368","id":4538,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9257:30:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_25ea480cc2aa38843a189edf4b75e3f74c2a3e907d445d16b99c93ba0ad2fc8d","typeString":"literal_string \"invalid dkim public key hash\""},"value":"invalid dkim public key hash"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_25ea480cc2aa38843a189edf4b75e3f74c2a3e907d445d16b99c93ba0ad2fc8d","typeString":"literal_string \"invalid dkim public key hash\""}],"id":4526,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"9074:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4539,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9074:223:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4540,"nodeType":"ExpressionStatement","src":"9074:223:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":4548,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":4542,"name":"usedNullifiers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4119,"src":"9328:14:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"}},"id":4546,"indexExpression":{"expression":{"expression":{"id":4543,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"9343:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4544,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9356:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"9343:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4545,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9362:14:23","memberName":"emailNullifier","nodeType":"MemberAccess","referencedDeclaration":5677,"src":"9343:33:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9328:49:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"66616c7365","id":4547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"9381:5:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"9328:58:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"656d61696c206e756c6c696669657220616c72656164792075736564","id":4549,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9400:30:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_d2074ae2f3cfb9818405fbf30f2ceaa45f9c2789db669491847f4d5769819601","typeString":"literal_string \"email nullifier already used\""},"value":"email nullifier already used"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_d2074ae2f3cfb9818405fbf30f2ceaa45f9c2789db669491847f4d5769819601","typeString":"literal_string \"email nullifier already used\""}],"id":4541,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"9307:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4550,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9307:133:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4551,"nodeType":"ExpressionStatement","src":"9307:133:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":4557,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4553,"name":"accountSalt","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4094,"src":"9471:11:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"expression":{"id":4554,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"9486:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4555,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9499:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"9486:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4556,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9505:11:23","memberName":"accountSalt","nodeType":"MemberAccess","referencedDeclaration":5679,"src":"9486:30:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"9471:45:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c6964206163636f756e742073616c74","id":4558,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9530:22:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_2ad99f7cb8a75bcb4cb550387b5319d8e19a60765b25418af88136d640e2d148","typeString":"literal_string \"invalid account salt\""},"value":"invalid account salt"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_2ad99f7cb8a75bcb4cb550387b5319d8e19a60765b25418af88136d640e2d148","typeString":"literal_string \"invalid account salt\""}],"id":4552,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"9450:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4559,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9450:112:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4560,"nodeType":"ExpressionStatement","src":"9450:112:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":4576,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":4570,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":4564,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4562,"name":"timestampCheckEnabled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4122,"src":"9593:21:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"66616c7365","id":4563,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"9618:5:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"src":"9593:30:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":4565,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"9643:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4566,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9656:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"9643:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4567,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9662:9:23","memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":5673,"src":"9643:28:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":4568,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9675:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"9643:33:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"9593:83:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4575,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":4571,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"9696:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4572,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9709:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"9696:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4573,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9715:9:23","memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":5673,"src":"9696:28:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"id":4574,"name":"lastTimestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4114,"src":"9727:13:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9696:44:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"9593:147:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c69642074696d657374616d70","id":4577,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9754:19:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_3a07df7939b5ccbd3c356d849b8deaf4b43e0de6adbd96a0feb242ccf507b152","typeString":"literal_string \"invalid timestamp\""},"value":"invalid timestamp"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3a07df7939b5ccbd3c356d849b8deaf4b43e0de6adbd96a0feb242ccf507b152","typeString":"literal_string \"invalid timestamp\""}],"id":4561,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"9572:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4578,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9572:211:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4579,"nodeType":"ExpressionStatement","src":"9572:211:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4591,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"arguments":[{"expression":{"expression":{"id":4583,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"9820:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4584,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9833:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"9820:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4585,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"9839:13:23","memberName":"maskedCommand","nodeType":"MemberAccess","referencedDeclaration":5675,"src":"9820:32:23","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":4582,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9814:5:23","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":4581,"name":"bytes","nodeType":"ElementaryTypeName","src":"9814:5:23","typeDescriptions":{}}},"id":4586,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9814:39:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":4587,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"9854:6:23","memberName":"length","nodeType":"MemberAccess","src":"9814:46:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":4588,"name":"verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4102,"src":"9880:8:23","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}},"id":4589,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"9889:13:23","memberName":"COMMAND_BYTES","nodeType":"MemberAccess","referencedDeclaration":5703,"src":"9880:22:23","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":4590,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9880:24:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9814:90:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c6964206d61736b656420636f6d6d616e64206c656e677468","id":4592,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9918:31:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_ebdfc3f3506075f570a3cafe10030bef72c1de936cc09c6baa8361c090e5f91d","typeString":"literal_string \"invalid masked command length\""},"value":"invalid masked command length"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ebdfc3f3506075f570a3cafe10030bef72c1de936cc09c6baa8361c090e5f91d","typeString":"literal_string \"invalid masked command length\""}],"id":4580,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"9793:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4593,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9793:166:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4594,"nodeType":"ExpressionStatement","src":"9793:166:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4601,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":4596,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"9990:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4597,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"10003:20:23","memberName":"skippedCommandPrefix","nodeType":"MemberAccess","referencedDeclaration":4081,"src":"9990:33:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":4598,"name":"verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4102,"src":"10026:8:23","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}},"id":4599,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"10035:13:23","memberName":"COMMAND_BYTES","nodeType":"MemberAccess","referencedDeclaration":5703,"src":"10026:22:23","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":4600,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10026:24:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9990:60:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c69642073697a65206f662074686520736b697070656420636f6d6d616e6420707265666978","id":4602,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10064:44:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_706b9e2d5d01e859d31a14349a995b252a3e0e02ce16cf579e2138d747dfec4a","typeString":"literal_string \"invalid size of the skipped command prefix\""},"value":"invalid size of the skipped command prefix"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_706b9e2d5d01e859d31a14349a995b252a3e0e02ce16cf579e2138d747dfec4a","typeString":"literal_string \"invalid size of the skipped command prefix\""}],"id":4595,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"9969:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4603,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"9969:149:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4604,"nodeType":"ExpressionStatement","src":"9969:149:23"},{"assignments":[4606],"declarations":[{"constant":false,"id":4606,"mutability":"mutable","name":"trimmedMaskedCommand","nameLocation":"10243:20:23","nodeType":"VariableDeclaration","scope":4706,"src":"10229:34:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":4605,"name":"string","nodeType":"ElementaryTypeName","src":"10229:6:23","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":4614,"initialValue":{"arguments":[{"expression":{"expression":{"id":4608,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"10292:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4609,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"10305:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"10292:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4610,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"10311:13:23","memberName":"maskedCommand","nodeType":"MemberAccess","referencedDeclaration":5675,"src":"10292:32:23","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"expression":{"id":4611,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"10338:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4612,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"10351:20:23","memberName":"skippedCommandPrefix","nodeType":"MemberAccess","referencedDeclaration":4081,"src":"10338:33:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4607,"name":"removePrefix","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4800,"src":"10266:12:23","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (string memory,uint256) pure returns (string memory)"}},"id":4613,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10266:115:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"nodeType":"VariableDeclarationStatement","src":"10229:152:23"},{"assignments":[4616],"declarations":[{"constant":false,"id":4616,"mutability":"mutable","name":"expectedCommand","nameLocation":"10405:15:23","nodeType":"VariableDeclaration","scope":4706,"src":"10391:29:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":4615,"name":"string","nodeType":"ElementaryTypeName","src":"10391:6:23","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":4618,"initialValue":{"hexValue":"","id":4617,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10423:2:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""},"nodeType":"VariableDeclarationStatement","src":"10391:34:23"},{"body":{"id":4656,"nodeType":"Block","src":"10491:391:23","statements":[{"expression":{"id":4637,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4629,"name":"expectedCommand","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4616,"src":"10505:15:23","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":4632,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"10576:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4633,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"10589:13:23","memberName":"commandParams","nodeType":"MemberAccess","referencedDeclaration":4078,"src":"10576:26:23","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_memory_ptr_$dyn_memory_ptr","typeString":"bytes memory[] memory"}},{"id":4634,"name":"template","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4512,"src":"10620:8:23","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},{"id":4635,"name":"stringCase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4620,"src":"10646:10:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_bytes_memory_ptr_$dyn_memory_ptr","typeString":"bytes memory[] memory"},{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":4630,"name":"CommandUtils","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5427,"src":"10523:12:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_CommandUtils_$5427_$","typeString":"type(library CommandUtils)"}},"id":4631,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10536:22:23","memberName":"computeExpectedCommand","nodeType":"MemberAccess","referencedDeclaration":5426,"src":"10523:35:23","typeDescriptions":{"typeIdentifier":"t_function_delegatecall_pure$_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$_t_uint256_$returns$_t_string_memory_ptr_$","typeString":"function (bytes memory[] memory,string memory[] memory,uint256) pure returns (string memory)"}},"id":4636,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10523:147:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"10505:165:23","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"id":4638,"nodeType":"ExpressionStatement","src":"10505:165:23"},{"condition":{"arguments":[{"id":4641,"name":"expectedCommand","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4616,"src":"10702:15:23","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":4642,"name":"trimmedMaskedCommand","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4606,"src":"10719:20:23","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":4639,"name":"Strings","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":2712,"src":"10688:7:23","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Strings_$2712_$","typeString":"type(library Strings)"}},"id":4640,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10696:5:23","memberName":"equal","nodeType":"MemberAccess","referencedDeclaration":2711,"src":"10688:13:23","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_bool_$","typeString":"function (string memory,string memory) pure returns (bool)"}},"id":4643,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10688:52:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4646,"nodeType":"IfStatement","src":"10684:96:23","trueBody":{"id":4645,"nodeType":"Block","src":"10742:38:23","statements":[{"id":4644,"nodeType":"Break","src":"10760:5:23"}]}},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4649,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4647,"name":"stringCase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4620,"src":"10797:10:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"32","id":4648,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10811:1:23","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"10797:15:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4655,"nodeType":"IfStatement","src":"10793:79:23","trueBody":{"id":4654,"nodeType":"Block","src":"10814:58:23","statements":[{"expression":{"arguments":[{"hexValue":"696e76616c696420636f6d6d616e64","id":4651,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10839:17:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_499cbdb392b48540c34935a328f619b91e09bf6db206414643eb1a00a3f66565","typeString":"literal_string \"invalid command\""},"value":"invalid command"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_499cbdb392b48540c34935a328f619b91e09bf6db206414643eb1a00a3f66565","typeString":"literal_string \"invalid command\""}],"id":4650,"name":"revert","nodeType":"Identifier","overloadedDeclarations":[-19,-19],"referencedDeclaration":-19,"src":"10832:6:23","typeDescriptions":{"typeIdentifier":"t_function_revert_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":4652,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10832:25:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4653,"nodeType":"ExpressionStatement","src":"10832:25:23"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4623,"name":"stringCase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4620,"src":"10461:10:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"hexValue":"33","id":4624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10474:1:23","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"10461:14:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4657,"initializationExpression":{"assignments":[4620],"declarations":[{"constant":false,"id":4620,"mutability":"mutable","name":"stringCase","nameLocation":"10445:10:23","nodeType":"VariableDeclaration","scope":4657,"src":"10440:15:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4619,"name":"uint","nodeType":"ElementaryTypeName","src":"10440:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4622,"initialValue":{"hexValue":"30","id":4621,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10458:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"10440:19:23"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":4627,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"10477:12:23","subExpression":{"id":4626,"name":"stringCase","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4620,"src":"10477:10:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4628,"nodeType":"ExpressionStatement","src":"10477:12:23"},"nodeType":"ForStatement","src":"10435:447:23"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":4665,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":4661,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"10939:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4662,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"10952:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"10939:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}],"expression":{"id":4659,"name":"verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4102,"src":"10913:8:23","typeDescriptions":{"typeIdentifier":"t_contract$_Verifier_$6081","typeString":"contract Verifier"}},"id":4660,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"10922:16:23","memberName":"verifyEmailProof","nodeType":"MemberAccess","referencedDeclaration":5929,"src":"10913:25:23","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_struct$_EmailProof_$5684_memory_ptr_$returns$_t_bool_$","typeString":"function (struct EmailProof memory) view external returns (bool)"}},"id":4663,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10913:45:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"74727565","id":4664,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"10962:4:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"10913:53:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c696420656d61696c2070726f6f66","id":4666,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10980:21:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_c431b17e9bb66a4792bb8b104feef717d43ac896d5ed77871976980289d002c7","typeString":"literal_string \"invalid email proof\""},"value":"invalid email proof"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c431b17e9bb66a4792bb8b104feef717d43ac896d5ed77871976980289d002c7","typeString":"literal_string \"invalid email proof\""}],"id":4658,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"10892:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4667,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"10892:119:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4668,"nodeType":"ExpressionStatement","src":"10892:119:23"},{"expression":{"id":4675,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":4669,"name":"usedNullifiers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4119,"src":"11022:14:23","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_bool_$","typeString":"mapping(bytes32 => bool)"}},"id":4673,"indexExpression":{"expression":{"expression":{"id":4670,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"11037:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4671,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11050:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"11037:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4672,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11056:14:23","memberName":"emailNullifier","nodeType":"MemberAccess","referencedDeclaration":5677,"src":"11037:33:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"11022:49:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"74727565","id":4674,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"11074:4:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"src":"11022:56:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4676,"nodeType":"ExpressionStatement","src":"11022:56:23"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":4683,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4677,"name":"timestampCheckEnabled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4122,"src":"11092:21:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4682,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"expression":{"id":4678,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"11117:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4679,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11130:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"11117:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4680,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11136:9:23","memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":5673,"src":"11117:28:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":4681,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"11149:1:23","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"11117:33:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"11092:58:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4691,"nodeType":"IfStatement","src":"11088:133:23","trueBody":{"id":4690,"nodeType":"Block","src":"11152:69:23","statements":[{"expression":{"id":4688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4684,"name":"lastTimestamp","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4114,"src":"11166:13:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"expression":{"id":4685,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"11182:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4686,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11195:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"11182:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4687,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11201:9:23","memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":5673,"src":"11182:28:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11166:44:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4689,"nodeType":"ExpressionStatement","src":"11166:44:23"}]}},{"eventCall":{"arguments":[{"expression":{"expression":{"id":4693,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"11260:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4694,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11273:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"11260:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4695,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11279:14:23","memberName":"emailNullifier","nodeType":"MemberAccess","referencedDeclaration":5677,"src":"11260:33:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"expression":{"id":4696,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"11307:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4697,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11320:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"11307:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4698,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11326:11:23","memberName":"accountSalt","nodeType":"MemberAccess","referencedDeclaration":5679,"src":"11307:30:23","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"expression":{"id":4699,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"11351:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4700,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11364:5:23","memberName":"proof","nodeType":"MemberAccess","referencedDeclaration":4085,"src":"11351:18:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailProof_$5684_memory_ptr","typeString":"struct EmailProof memory"}},"id":4701,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11370:11:23","memberName":"isCodeExist","nodeType":"MemberAccess","referencedDeclaration":5681,"src":"11351:30:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"expression":{"id":4702,"name":"emailAuthMsg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4503,"src":"11395:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg memory"}},"id":4703,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"11408:10:23","memberName":"templateId","nodeType":"MemberAccess","referencedDeclaration":4074,"src":"11395:23:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4692,"name":"EmailAuthed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4152,"src":"11235:11:23","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_bytes32_$_t_bool_$_t_uint256_$returns$__$","typeString":"function (bytes32,bytes32,bool,uint256)"}},"id":4704,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11235:193:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4705,"nodeType":"EmitStatement","src":"11230:198:23"}]},"documentation":{"id":4500,"nodeType":"StructuredDocumentation","src":"8512:330:23","text":"@notice Authenticate the email sender and authorize the message in the email command based on the provided email auth message.\n @dev This function can only be called by the controller contract.\n @param emailAuthMsg The email auth message containing all necessary information for authentication and authorization."},"functionSelector":"ad3f5f9b","implemented":true,"kind":"function","modifiers":[{"id":4506,"kind":"modifierInvocation","modifierName":{"id":4505,"name":"onlyController","nameLocations":["8907:14:23"],"nodeType":"IdentifierPath","referencedDeclaration":4168,"src":"8907:14:23"},"nodeType":"ModifierInvocation","src":"8907:14:23"}],"name":"authEmail","nameLocation":"8856:9:23","parameters":{"id":4504,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4503,"mutability":"mutable","name":"emailAuthMsg","nameLocation":"8886:12:23","nodeType":"VariableDeclaration","scope":4707,"src":"8866:32:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_memory_ptr","typeString":"struct EmailAuthMsg"},"typeName":{"id":4502,"nodeType":"UserDefinedTypeName","pathNode":{"id":4501,"name":"EmailAuthMsg","nameLocations":["8866:12:23"],"nodeType":"IdentifierPath","referencedDeclaration":4086,"src":"8866:12:23"},"referencedDeclaration":4086,"src":"8866:12:23","typeDescriptions":{"typeIdentifier":"t_struct$_EmailAuthMsg_$4086_storage_ptr","typeString":"struct EmailAuthMsg"}},"visibility":"internal"}],"src":"8865:34:23"},"returnParameters":{"id":4507,"nodeType":"ParameterList","parameters":[],"src":"8922:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4724,"nodeType":"FunctionDefinition","src":"11646:166:23","nodes":[],"body":{"id":4723,"nodeType":"Block","src":"11717:95:23","nodes":[],"statements":[{"expression":{"id":4717,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":4715,"name":"timestampCheckEnabled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4122,"src":"11727:21:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":4716,"name":"_enabled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4710,"src":"11751:8:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"11727:32:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4718,"nodeType":"ExpressionStatement","src":"11727:32:23"},{"eventCall":{"arguments":[{"id":4720,"name":"_enabled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4710,"src":"11796:8:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":4719,"name":"TimestampCheckEnabled","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4156,"src":"11774:21:23","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bool_$returns$__$","typeString":"function (bool)"}},"id":4721,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"11774:31:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4722,"nodeType":"EmitStatement","src":"11769:36:23"}]},"documentation":{"id":4708,"nodeType":"StructuredDocumentation","src":"11441:200:23","text":"@notice Enables or disables the timestamp check.\n @dev This function can only be called by the contract owner.\n @param _enabled Boolean flag to enable or disable the timestamp check."},"functionSelector":"e453c0f3","implemented":true,"kind":"function","modifiers":[{"id":4713,"kind":"modifierInvocation","modifierName":{"id":4712,"name":"onlyController","nameLocations":["11702:14:23"],"nodeType":"IdentifierPath","referencedDeclaration":4168,"src":"11702:14:23"},"nodeType":"ModifierInvocation","src":"11702:14:23"}],"name":"setTimestampCheckEnabled","nameLocation":"11655:24:23","parameters":{"id":4711,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4710,"mutability":"mutable","name":"_enabled","nameLocation":"11685:8:23","nodeType":"VariableDeclaration","scope":4724,"src":"11680:13:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4709,"name":"bool","nodeType":"ElementaryTypeName","src":"11680:4:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"11679:15:23"},"returnParameters":{"id":4714,"nodeType":"ParameterList","parameters":[],"src":"11717:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":4734,"nodeType":"FunctionDefinition","src":"11943:98:23","nodes":[],"body":{"id":4733,"nodeType":"Block","src":"12039:2:23","nodes":[],"statements":[]},"baseFunctions":[1296],"documentation":{"id":4725,"nodeType":"StructuredDocumentation","src":"11818:120:23","text":"@notice Upgrade the implementation of the proxy.\n @param newImplementation Address of the new implementation."},"implemented":true,"kind":"function","modifiers":[{"id":4731,"kind":"modifierInvocation","modifierName":{"id":4730,"name":"onlyOwner","nameLocations":["12029:9:23"],"nodeType":"IdentifierPath","referencedDeclaration":89,"src":"12029:9:23"},"nodeType":"ModifierInvocation","src":"12029:9:23"}],"name":"_authorizeUpgrade","nameLocation":"11952:17:23","overrides":{"id":4729,"nodeType":"OverrideSpecifier","overrides":[],"src":"12020:8:23"},"parameters":{"id":4728,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4727,"mutability":"mutable","name":"newImplementation","nameLocation":"11987:17:23","nodeType":"VariableDeclaration","scope":4734,"src":"11979:25:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4726,"name":"address","nodeType":"ElementaryTypeName","src":"11979:7:23","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"11969:41:23"},"returnParameters":{"id":4732,"nodeType":"ParameterList","parameters":[],"src":"12039:0:23"},"scope":4801,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":4800,"nodeType":"FunctionDefinition","src":"12047:467:23","nodes":[],"body":{"id":4799,"nodeType":"Block","src":"12162:352:23","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4750,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4744,"name":"numChars","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4738,"src":"12180:8:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"arguments":[{"id":4747,"name":"str","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4736,"src":"12198:3:23","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":4746,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12192:5:23","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":4745,"name":"bytes","nodeType":"ElementaryTypeName","src":"12192:5:23","typeDescriptions":{}}},"id":4748,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12192:10:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":4749,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12203:6:23","memberName":"length","nodeType":"MemberAccess","src":"12192:17:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12180:29:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"496e76616c6964206e756d626572206f662063686172616374657273","id":4751,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"12211:30:23","typeDescriptions":{"typeIdentifier":"t_stringliteral_bd864f8e3446f15f97deaf7d2735ffe4d46dc08893b311eff140e6da0d4e072d","typeString":"literal_string \"Invalid number of characters\""},"value":"Invalid number of characters"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_bd864f8e3446f15f97deaf7d2735ffe4d46dc08893b311eff140e6da0d4e072d","typeString":"literal_string \"Invalid number of characters\""}],"id":4743,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18,-18],"referencedDeclaration":-18,"src":"12172:7:23","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":4752,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12172:70:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":4753,"nodeType":"ExpressionStatement","src":"12172:70:23"},{"assignments":[4755],"declarations":[{"constant":false,"id":4755,"mutability":"mutable","name":"strBytes","nameLocation":"12266:8:23","nodeType":"VariableDeclaration","scope":4799,"src":"12253:21:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4754,"name":"bytes","nodeType":"ElementaryTypeName","src":"12253:5:23","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":4760,"initialValue":{"arguments":[{"id":4758,"name":"str","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4736,"src":"12283:3:23","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"id":4757,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12277:5:23","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":4756,"name":"bytes","nodeType":"ElementaryTypeName","src":"12277:5:23","typeDescriptions":{}}},"id":4759,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12277:10:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"12253:34:23"},{"assignments":[4762],"declarations":[{"constant":false,"id":4762,"mutability":"mutable","name":"result","nameLocation":"12310:6:23","nodeType":"VariableDeclaration","scope":4799,"src":"12297:19:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":4761,"name":"bytes","nodeType":"ElementaryTypeName","src":"12297:5:23","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":4770,"initialValue":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4768,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":4765,"name":"strBytes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4755,"src":"12329:8:23","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":4766,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12338:6:23","memberName":"length","nodeType":"MemberAccess","src":"12329:15:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":4767,"name":"numChars","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4738,"src":"12347:8:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12329:26:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":4764,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"12319:9:23","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$","typeString":"function (uint256) pure returns (bytes memory)"},"typeName":{"id":4763,"name":"bytes","nodeType":"ElementaryTypeName","src":"12323:5:23","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}}},"id":4769,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12319:37:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"12297:59:23"},{"body":{"id":4792,"nodeType":"Block","src":"12417:59:23","statements":[{"expression":{"id":4790,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":4782,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4762,"src":"12431:6:23","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":4786,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4785,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4783,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4772,"src":"12438:1:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":4784,"name":"numChars","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4738,"src":"12442:8:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12438:12:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"12431:20:23","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"id":4787,"name":"strBytes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4755,"src":"12454:8:23","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":4789,"indexExpression":{"id":4788,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4772,"src":"12463:1:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"12454:11:23","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"src":"12431:34:23","typeDescriptions":{"typeIdentifier":"t_bytes1","typeString":"bytes1"}},"id":4791,"nodeType":"ExpressionStatement","src":"12431:34:23"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":4778,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":4775,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4772,"src":"12391:1:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":4776,"name":"strBytes","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4755,"src":"12395:8:23","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":4777,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"12404:6:23","memberName":"length","nodeType":"MemberAccess","src":"12395:15:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"12391:19:23","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":4793,"initializationExpression":{"assignments":[4772],"declarations":[{"constant":false,"id":4772,"mutability":"mutable","name":"i","nameLocation":"12377:1:23","nodeType":"VariableDeclaration","scope":4793,"src":"12372:6:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4771,"name":"uint","nodeType":"ElementaryTypeName","src":"12372:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":4774,"initialValue":{"id":4773,"name":"numChars","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4738,"src":"12381:8:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"12372:17:23"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":4780,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"12412:3:23","subExpression":{"id":4779,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4772,"src":"12412:1:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":4781,"nodeType":"ExpressionStatement","src":"12412:3:23"},"nodeType":"ForStatement","src":"12367:109:23"},{"expression":{"arguments":[{"id":4796,"name":"result","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":4762,"src":"12500:6:23","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":4795,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"12493:6:23","typeDescriptions":{"typeIdentifier":"t_type$_t_string_storage_ptr_$","typeString":"type(string storage pointer)"},"typeName":{"id":4794,"name":"string","nodeType":"ElementaryTypeName","src":"12493:6:23","typeDescriptions":{}}},"id":4797,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"12493:14:23","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"functionReturnParameters":4742,"id":4798,"nodeType":"Return","src":"12486:21:23"}]},"implemented":true,"kind":"function","modifiers":[],"name":"removePrefix","nameLocation":"12056:12:23","parameters":{"id":4739,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4736,"mutability":"mutable","name":"str","nameLocation":"12092:3:23","nodeType":"VariableDeclaration","scope":4800,"src":"12078:17:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":4735,"name":"string","nodeType":"ElementaryTypeName","src":"12078:6:23","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":4738,"mutability":"mutable","name":"numChars","nameLocation":"12110:8:23","nodeType":"VariableDeclaration","scope":4800,"src":"12105:13:23","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4737,"name":"uint","nodeType":"ElementaryTypeName","src":"12105:4:23","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12068:56:23"},"returnParameters":{"id":4742,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4741,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":4800,"src":"12147:13:23","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":4740,"name":"string","nodeType":"ElementaryTypeName","src":"12147:6:23","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"12146:15:23"},"scope":4801,"stateMutability":"pure","virtual":false,"visibility":"private"}],"abstract":false,"baseContracts":[{"baseName":{"id":4088,"name":"OwnableUpgradeable","nameLocations":["1568:18:23"],"nodeType":"IdentifierPath","referencedDeclaration":194,"src":"1568:18:23"},"id":4089,"nodeType":"InheritanceSpecifier","src":"1568:18:23"},{"baseName":{"id":4090,"name":"UUPSUpgradeable","nameLocations":["1588:15:23"],"nodeType":"IdentifierPath","referencedDeclaration":1342,"src":"1588:15:23"},"id":4091,"nodeType":"InheritanceSpecifier","src":"1588:15:23"}],"canonicalName":"EmailAuth","contractDependencies":[],"contractKind":"contract","documentation":{"id":4087,"nodeType":"StructuredDocumentation","src":"1172:374:23","text":"@title Email Authentication/Authorization Contract\n @notice This contract provides functionalities for the authentication of the email sender and the authentication of the message in the command part of the email body using DKIM and custom verification logic.\n @dev Inherits from OwnableUpgradeable and UUPSUpgradeable for upgradeability and ownership management."},"fullyImplemented":true,"linearizedBaseContracts":[4801,1342,652,194,494,448],"name":"EmailAuth","nameLocation":"1555:9:23","scope":4802,"usedErrors":[30,35,211,214,862,875,1199,1204,1974,1977],"usedEvents":[41,219,841,4126,4130,4134,4138,4142,4152,4156]}],"license":"MIT"},"id":23} \ No newline at end of file diff --git a/example/scripts/abis/EmitEmailCommand.json b/example/scripts/abis/EmitEmailCommand.json new file mode 100644 index 00000000..e0ed8525 --- /dev/null +++ b/example/scripts/abis/EmitEmailCommand.json @@ -0,0 +1,9289 @@ +{ + "abi": [ + { + "type": "function", + "name": "commandTemplates", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string[][]", + "internalType": "string[][]" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "computeEmailAuthAddress", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "accountSalt", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "computeTemplateId", + "inputs": [ + { + "name": "templateIdx", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "dkim", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "dkimAddr", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "emailAuthImplementation", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "emailAuthImplementationAddr", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "emitEmailCommand", + "inputs": [ + { + "name": "emailAuthMsg", + "type": "tuple", + "internalType": "struct EmailAuthMsg", + "components": [ + { + "name": "templateId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "commandParams", + "type": "bytes[]", + "internalType": "bytes[]" + }, + { + "name": "skippedCommandPrefix", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "proof", + "type": "tuple", + "internalType": "struct EmailProof", + "components": [ + { + "name": "domainName", + "type": "string", + "internalType": "string" + }, + { + "name": "publicKeyHash", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "timestamp", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maskedCommand", + "type": "string", + "internalType": "string" + }, + { + "name": "emailNullifier", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "accountSalt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "isCodeExist", + "type": "bool", + "internalType": "bool" + }, + { + "name": "proof", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ] + }, + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "templateIdx", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "verifier", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "verifierAddr", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "DecimalsCommand", + "inputs": [ + { + "name": "emailAuthAddr", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "command", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EthAddrCommand", + "inputs": [ + { + "name": "emailAuthAddr", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "command", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "IntCommand", + "inputs": [ + { + "name": "emailAuthAddr", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "command", + "type": "int256", + "indexed": true, + "internalType": "int256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StringCommand", + "inputs": [ + { + "name": "emailAuthAddr", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "command", + "type": "string", + "indexed": true, + "internalType": "string" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "UintCommand", + "inputs": [ + { + "name": "emailAuthAddr", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "command", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + } + ], + "anonymous": false + } + ], + "bytecode": { + "object": "0x6080604052348015600f57600080fd5b506122508061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063400ad5ce1161007657806373357f851161005b57806373357f85146101a6578063b6201692146101c6578063db4f06d6146101e457600080fd5b8063400ad5ce14610168578063663ea2e21461018657600080fd5b806320c700c0116100a757806320c700c0146101225780632b7ac3f3146101375780633a8eab141461015557600080fd5b80631098e02e146100c357806316a8b1a01461010d575b600080fd5b6002546100e39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610115610262565b604051610104919061161c565b610135610130366004611933565b6109c0565b005b60005473ffffffffffffffffffffffffffffffffffffffff166100e3565b6100e3610163366004611a95565b611069565b60015473ffffffffffffffffffffffffffffffffffffffff166100e3565b6000546100e39073ffffffffffffffffffffffffffffffffffffffff1681565b6001546100e39073ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff166100e3565b6102546101f2366004611ac1565b6040805160208101829052600760608201527f4558414d504c4500000000000000000000000000000000000000000000000000608082015290810182905260009060a00160408051601f19818403018152919052805160209091012092915050565b604051908152602001610104565b604080516002808252606082810190935260009190816020015b606081526020019060019003908161027c57505060408051600580825260c08201909252919250602082015b60608152602001906001900390816102a857905050816000815181106102d0576102d0611ada565b60200260200101819052506040518060400160405280600481526020017f456d6974000000000000000000000000000000000000000000000000000000008152508160008151811061032457610324611ada565b602002602001015160008151811061033e5761033e611ada565b60200260200101819052506040518060400160405280600681526020017f737472696e6700000000000000000000000000000000000000000000000000008152508160008151811061039257610392611ada565b60200260200101516001815181106103ac576103ac611ada565b60200260200101819052506040518060400160405280600881526020017f7b737472696e677d0000000000000000000000000000000000000000000000008152508160008151811061040057610400611ada565b602002602001015160028151811061041a5761041a611ada565b60200260200101819052506040518060400160405280600481526020017f456d6974000000000000000000000000000000000000000000000000000000008152508160018151811061046e5761046e611ada565b602002602001015160008151811061048857610488611ada565b60200260200101819052506040518060400160405280600481526020017f75696e7400000000000000000000000000000000000000000000000000000000815250816001815181106104dc576104dc611ada565b60200260200101516001815181106104f6576104f6611ada565b60200260200101819052506040518060400160405280600681526020017f7b75696e747d00000000000000000000000000000000000000000000000000008152508160018151811061054a5761054a611ada565b602002602001015160028151811061056457610564611ada565b60200260200101819052506040518060400160405280600481526020017f456d697400000000000000000000000000000000000000000000000000000000815250816002815181106105b8576105b8611ada565b60200260200101516000815181106105d2576105d2611ada565b60200260200101819052506040518060400160405280600381526020017f696e7400000000000000000000000000000000000000000000000000000000008152508160028151811061062657610626611ada565b602002602001015160018151811061064057610640611ada565b60200260200101819052506040518060400160405280600581526020017f7b696e747d0000000000000000000000000000000000000000000000000000008152508160028151811061069457610694611ada565b60200260200101516002815181106106ae576106ae611ada565b60200260200101819052506040518060400160405280600481526020017f456d6974000000000000000000000000000000000000000000000000000000008152508160038151811061070257610702611ada565b602002602001015160008151811061071c5761071c611ada565b60200260200101819052506040518060400160405280600881526020017f646563696d616c730000000000000000000000000000000000000000000000008152508160038151811061077057610770611ada565b602002602001015160018151811061078a5761078a611ada565b60200260200101819052506040518060400160405280600a81526020017f7b646563696d616c737d00000000000000000000000000000000000000000000815250816003815181106107de576107de611ada565b60200260200101516002815181106107f8576107f8611ada565b60200260200101819052506040518060400160405280600481526020017f456d6974000000000000000000000000000000000000000000000000000000008152508160048151811061084c5761084c611ada565b602002602001015160008151811061086657610866611ada565b60200260200101819052506040518060400160405280600881526020017f657468657265756d000000000000000000000000000000000000000000000000815250816004815181106108ba576108ba611ada565b60200260200101516001815181106108d4576108d4611ada565b60200260200101819052506040518060400160405280600881526020017f61646464726573730000000000000000000000000000000000000000000000008152508160048151811061092857610928611ada565b602002602001015160028151811061094257610942611ada565b60200260200101819052506040518060400160405280600981526020017f7b657468416464727d00000000000000000000000000000000000000000000008152508160048151811061099657610996611ada565b60200260200101516003815181106109b0576109b0611ada565b6020908102919091010152919050565b60006109d483856060015160a00151611069565b90506000610a3e836040805160208101829052600760608201527f4558414d504c4500000000000000000000000000000000000000000000000000608082015290810182905260009060a00160408051601f19818403018152919052805160209091012092915050565b85519091508114610ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642074656d706c6174652069640000000000000000000000000060448201526064015b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff163b600003610ec857606086015160c001511515600114610b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f6973436f64654578697374206d757374206265207472756520666f722074686560448201527f20666972737420656d61696c00000000000000000000000000000000000000006064820152608401610aa7565b6000610b7f86886060015160a00151611187565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f70726f7879206164647265737320646f6573206e6f74206d617463682077697460448201527f6820656d61696c417574684164647200000000000000000000000000000000006064820152608401610aa7565b8091508173ffffffffffffffffffffffffffffffffffffffff1663557cf5ef610c7a60015473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b158015610ce057600080fd5b505af1158015610cf4573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16634141407c610d3360005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b158015610d9957600080fd5b505af1158015610dad573d6000803e3d6000fd5b505050506000610dbb610262565b905060005b8151811015610ec0578373ffffffffffffffffffffffffffffffffffffffff16638ff3730f610e4b836040805160208101829052600760608201527f4558414d504c4500000000000000000000000000000000000000000000000000608082015290810182905260009060a00160408051601f19818403018152919052805160209091012092915050565b848481518110610e5d57610e5d611ada565b60200260200101516040518363ffffffff1660e01b8152600401610e82929190611b09565b600060405180830381600087803b158015610e9c57600080fd5b505af1158015610eb0573d6000803e3d6000fd5b505060019092019150610dc09050565b505050610fce565b8290503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663f77c47916040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f519190611b93565b73ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420636f6e74726f6c6c657200000000000000000000000000006044820152606401610aa7565b6040517fad3f5f9b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063ad3f5f9b90611020908990600401611c3f565b600060405180830381600087803b15801561103a57600080fd5b505af115801561104e573d6000803e3d6000fd5b505050506110618387602001518661126f565b505050505050565b6000611180826040518060200161107f906115bf565b601f1982820381018352601f909101166040526110b160025473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff881660248201526044810187905230606482015260840160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd26b3e6e00000000000000000000000000000000000000000000000000000000179052905161114793929101611cf4565b60408051601f19818403018152908290526111659291602001611d2b565b6040516020818303038152906040528051906020012061158d565b9392505050565b600080826111aa60025473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff871660248201526044810186905230606482015260840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd26b3e6e000000000000000000000000000000000000000000000000000000001790525161123b906115bf565b611246929190611cf4565b8190604051809103906000f5905080158015611266573d6000803e3d6000fd5b50949350505050565b806000036113055760008260008151811061128c5761128c611ada565b60200260200101518060200190518101906112a79190611d5a565b9050806040516112b79190611dc8565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff8616907f645126e6978c1c365d84853d6b5fde98c36802fdbf41bba8d1a8ee915c9ea69290600090a350505050565b806001036113895760008260008151811061132257611322611ada565b602002602001015180602001905181019061133d9190611de4565b9050808473ffffffffffffffffffffffffffffffffffffffff167fa5c3e1e5fe35e2cf53bcd2d9788d8c914a2c0009059c57a4f81867ef891f953a60405160405180910390a350505050565b8060020361140d576000826000815181106113a6576113a6611ada565b60200260200101518060200190518101906113c19190611de4565b9050808473ffffffffffffffffffffffffffffffffffffffff167fc3ff6c3d86b9cdcc412d73eebae668f46939e7200f0a8b85a9d1b193cb78d9a660405160405180910390a350505050565b806003036114915760008260008151811061142a5761142a611ada565b60200260200101518060200190518101906114459190611de4565b9050808473ffffffffffffffffffffffffffffffffffffffff167fd3a48525d8c5ab22221baba6d473309d152050b2bbc71145e26a192ef216e8d160405160405180910390a350505050565b8060040361152b576000826000815181106114ae576114ae611ada565b60200260200101518060200190518101906114c99190611b93565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f1fa54e548d12ab4ab1876c405749e0ef462160262aaa4df2bfd4f4fe9fc7693b60405160405180910390a350505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642074656d706c617465496478000000000000000000000000006044820152606401610aa7565b60006111808383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61041d80611dfe83390190565b60005b838110156115e75781810151838201526020016115cf565b50506000910152565b600081518084526116088160208601602086016115cc565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156116da578685037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018452815180518087526020918201918088019190600582901b89010160005b828110156116c157601f198a83030184526116ac8286516115f0565b60209586019594909401939150600101611690565b5097505050602094850194929092019150600101611644565b50929695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715611739576117396116e6565b60405290565b6040516080810167ffffffffffffffff81118282101715611739576117396116e6565b604051601f8201601f1916810167ffffffffffffffff8111828210171561178b5761178b6116e6565b604052919050565b600067ffffffffffffffff8211156117ad576117ad6116e6565b50601f01601f191660200190565b600082601f8301126117cc57600080fd5b81356020830160006117e56117e084611793565b611762565b90508281528583830111156117f957600080fd5b82826020830137600092810160200192909252509392505050565b8035801515811461182457600080fd5b919050565b6000610100828403121561183c57600080fd5b611844611715565b9050813567ffffffffffffffff81111561185d57600080fd5b611869848285016117bb565b8252506020828101359082015260408083013590820152606082013567ffffffffffffffff81111561189a57600080fd5b6118a6848285016117bb565b6060830152506080828101359082015260a080830135908201526118cc60c08301611814565b60c082015260e082013567ffffffffffffffff8111156118eb57600080fd5b6118f7848285016117bb565b60e08301525092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461192557600080fd5b50565b803561182481611903565b60008060006060848603121561194857600080fd5b833567ffffffffffffffff81111561195f57600080fd5b84016080818703121561197157600080fd5b61197961173f565b81358152602082013567ffffffffffffffff81111561199757600080fd5b8201601f810188136119a857600080fd5b803567ffffffffffffffff8111156119c2576119c26116e6565b8060051b6119d260208201611762565b9182526020818401810192908101908b8411156119ee57600080fd5b6020850192505b83831015611a3557823567ffffffffffffffff811115611a1457600080fd5b611a238d6020838901016117bb565b835250602092830192909101906119f5565b60208601525050505060408281013590820152606082013567ffffffffffffffff811115611a6257600080fd5b611a6e88828501611829565b6060830152509350611a84905060208501611928565b929592945050506040919091013590565b60008060408385031215611aa857600080fd5b8235611ab381611903565b946020939093013593505050565b600060208284031215611ad357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000604082018483526040602084015280845180835260608501915060608160051b86010192506020860160005b82811015611b86577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0878603018452611b718583516115f0565b94506020938401939190910190600101611b37565b5092979650505050505050565b600060208284031215611ba557600080fd5b815161118081611903565b600081516101008452611bc76101008501826115f0565b9050602083015160208501526040830151604085015260608301518482036060860152611bf482826115f0565b9150506080830151608085015260a083015160a085015260c0830151611c1e60c086018215159052565b5060e083015184820360e0860152611c3682826115f0565b95945050505050565b60208152600060a082018351602084015260208401516080604085015281815180845260c08601915060c08160051b870101935060208301925060005b81811015611ccb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40878603018352611cb68585516115f0565b94506020938401939290920191600101611c7c565b50505050604084015160608401526060840151601f19848303016080850152611c368282611bb0565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000611d2360408301846115f0565b949350505050565b60008351611d3d8184602088016115cc565b835190830190611d518183602088016115cc565b01949350505050565b600060208284031215611d6c57600080fd5b815167ffffffffffffffff811115611d8357600080fd5b8201601f81018413611d9457600080fd5b8051611da26117e082611793565b818152856020838501011115611db757600080fd5b611c368260208301602086016115cc565b60008251611dda8184602087016115cc565b9190910192915050565b600060208284031215611df657600080fd5b505191905056fe608060405260405161041d38038061041d83398101604081905261002291610268565b61002c8282610033565b5050610358565b61003c82610092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561008657610081828261010e565b505050565b61008e610185565b5050565b806001600160a01b03163b6000036100cd57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161012b919061033c565b600060405180830381855af49150503d8060008114610166576040519150601f19603f3d011682016040523d82523d6000602084013e61016b565b606091505b50909250905061017c8583836101a6565b95945050505050565b34156101a45760405163b398979f60e01b815260040160405180910390fd5b565b6060826101bb576101b682610205565b6101fe565b81511580156101d257506001600160a01b0384163b155b156101fb57604051639996b31560e01b81526001600160a01b03851660048201526024016100c4565b50805b9392505050565b8051156102155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025f578181015183820152602001610247565b50506000910152565b6000806040838503121561027b57600080fd5b82516001600160a01b038116811461029257600080fd5b60208401519092506001600160401b038111156102ae57600080fd5b8301601f810185136102bf57600080fd5b80516001600160401b038111156102d8576102d861022e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103065761030661022e565b60405281815282820160200187101561031e57600080fd5b61032f826020830160208601610244565b8093505050509250929050565b6000825161034e818460208701610244565b9190910192915050565b60b7806103666000396000f3fe6080604052600a600c565b005b60186014601a565b605e565b565b600060597f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e808015607c573d6000f35b3d6000fdfea2646970667358221220d774b63875ebbbb75f47054a127014ec1ba4efb9781fa1be4664237d223e393264736f6c634300081a0033a26469706673582212206d37fff02fd2da9ab0f7ae9da3e2b051bce49c51c66b2c0b1358f66b988e752464736f6c634300081a0033", + "sourceMap": "345:8296:28:-:0;;;;;;;;;;;;;;;;;;;", + "linkReferences": {} + }, + "deployedBytecode": { + "object": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063400ad5ce1161007657806373357f851161005b57806373357f85146101a6578063b6201692146101c6578063db4f06d6146101e457600080fd5b8063400ad5ce14610168578063663ea2e21461018657600080fd5b806320c700c0116100a757806320c700c0146101225780632b7ac3f3146101375780633a8eab141461015557600080fd5b80631098e02e146100c357806316a8b1a01461010d575b600080fd5b6002546100e39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610115610262565b604051610104919061161c565b610135610130366004611933565b6109c0565b005b60005473ffffffffffffffffffffffffffffffffffffffff166100e3565b6100e3610163366004611a95565b611069565b60015473ffffffffffffffffffffffffffffffffffffffff166100e3565b6000546100e39073ffffffffffffffffffffffffffffffffffffffff1681565b6001546100e39073ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff166100e3565b6102546101f2366004611ac1565b6040805160208101829052600760608201527f4558414d504c4500000000000000000000000000000000000000000000000000608082015290810182905260009060a00160408051601f19818403018152919052805160209091012092915050565b604051908152602001610104565b604080516002808252606082810190935260009190816020015b606081526020019060019003908161027c57505060408051600580825260c08201909252919250602082015b60608152602001906001900390816102a857905050816000815181106102d0576102d0611ada565b60200260200101819052506040518060400160405280600481526020017f456d6974000000000000000000000000000000000000000000000000000000008152508160008151811061032457610324611ada565b602002602001015160008151811061033e5761033e611ada565b60200260200101819052506040518060400160405280600681526020017f737472696e6700000000000000000000000000000000000000000000000000008152508160008151811061039257610392611ada565b60200260200101516001815181106103ac576103ac611ada565b60200260200101819052506040518060400160405280600881526020017f7b737472696e677d0000000000000000000000000000000000000000000000008152508160008151811061040057610400611ada565b602002602001015160028151811061041a5761041a611ada565b60200260200101819052506040518060400160405280600481526020017f456d6974000000000000000000000000000000000000000000000000000000008152508160018151811061046e5761046e611ada565b602002602001015160008151811061048857610488611ada565b60200260200101819052506040518060400160405280600481526020017f75696e7400000000000000000000000000000000000000000000000000000000815250816001815181106104dc576104dc611ada565b60200260200101516001815181106104f6576104f6611ada565b60200260200101819052506040518060400160405280600681526020017f7b75696e747d00000000000000000000000000000000000000000000000000008152508160018151811061054a5761054a611ada565b602002602001015160028151811061056457610564611ada565b60200260200101819052506040518060400160405280600481526020017f456d697400000000000000000000000000000000000000000000000000000000815250816002815181106105b8576105b8611ada565b60200260200101516000815181106105d2576105d2611ada565b60200260200101819052506040518060400160405280600381526020017f696e7400000000000000000000000000000000000000000000000000000000008152508160028151811061062657610626611ada565b602002602001015160018151811061064057610640611ada565b60200260200101819052506040518060400160405280600581526020017f7b696e747d0000000000000000000000000000000000000000000000000000008152508160028151811061069457610694611ada565b60200260200101516002815181106106ae576106ae611ada565b60200260200101819052506040518060400160405280600481526020017f456d6974000000000000000000000000000000000000000000000000000000008152508160038151811061070257610702611ada565b602002602001015160008151811061071c5761071c611ada565b60200260200101819052506040518060400160405280600881526020017f646563696d616c730000000000000000000000000000000000000000000000008152508160038151811061077057610770611ada565b602002602001015160018151811061078a5761078a611ada565b60200260200101819052506040518060400160405280600a81526020017f7b646563696d616c737d00000000000000000000000000000000000000000000815250816003815181106107de576107de611ada565b60200260200101516002815181106107f8576107f8611ada565b60200260200101819052506040518060400160405280600481526020017f456d6974000000000000000000000000000000000000000000000000000000008152508160048151811061084c5761084c611ada565b602002602001015160008151811061086657610866611ada565b60200260200101819052506040518060400160405280600881526020017f657468657265756d000000000000000000000000000000000000000000000000815250816004815181106108ba576108ba611ada565b60200260200101516001815181106108d4576108d4611ada565b60200260200101819052506040518060400160405280600881526020017f61646464726573730000000000000000000000000000000000000000000000008152508160048151811061092857610928611ada565b602002602001015160028151811061094257610942611ada565b60200260200101819052506040518060400160405280600981526020017f7b657468416464727d00000000000000000000000000000000000000000000008152508160048151811061099657610996611ada565b60200260200101516003815181106109b0576109b0611ada565b6020908102919091010152919050565b60006109d483856060015160a00151611069565b90506000610a3e836040805160208101829052600760608201527f4558414d504c4500000000000000000000000000000000000000000000000000608082015290810182905260009060a00160408051601f19818403018152919052805160209091012092915050565b85519091508114610ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642074656d706c6174652069640000000000000000000000000060448201526064015b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff163b600003610ec857606086015160c001511515600114610b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f6973436f64654578697374206d757374206265207472756520666f722074686560448201527f20666972737420656d61696c00000000000000000000000000000000000000006064820152608401610aa7565b6000610b7f86886060015160a00151611187565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f70726f7879206164647265737320646f6573206e6f74206d617463682077697460448201527f6820656d61696c417574684164647200000000000000000000000000000000006064820152608401610aa7565b8091508173ffffffffffffffffffffffffffffffffffffffff1663557cf5ef610c7a60015473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b158015610ce057600080fd5b505af1158015610cf4573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16634141407c610d3360005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401600060405180830381600087803b158015610d9957600080fd5b505af1158015610dad573d6000803e3d6000fd5b505050506000610dbb610262565b905060005b8151811015610ec0578373ffffffffffffffffffffffffffffffffffffffff16638ff3730f610e4b836040805160208101829052600760608201527f4558414d504c4500000000000000000000000000000000000000000000000000608082015290810182905260009060a00160408051601f19818403018152919052805160209091012092915050565b848481518110610e5d57610e5d611ada565b60200260200101516040518363ffffffff1660e01b8152600401610e82929190611b09565b600060405180830381600087803b158015610e9c57600080fd5b505af1158015610eb0573d6000803e3d6000fd5b505060019092019150610dc09050565b505050610fce565b8290503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663f77c47916040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f519190611b93565b73ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420636f6e74726f6c6c657200000000000000000000000000006044820152606401610aa7565b6040517fad3f5f9b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063ad3f5f9b90611020908990600401611c3f565b600060405180830381600087803b15801561103a57600080fd5b505af115801561104e573d6000803e3d6000fd5b505050506110618387602001518661126f565b505050505050565b6000611180826040518060200161107f906115bf565b601f1982820381018352601f909101166040526110b160025473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff881660248201526044810187905230606482015260840160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd26b3e6e00000000000000000000000000000000000000000000000000000000179052905161114793929101611cf4565b60408051601f19818403018152908290526111659291602001611d2b565b6040516020818303038152906040528051906020012061158d565b9392505050565b600080826111aa60025473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff871660248201526044810186905230606482015260840160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd26b3e6e000000000000000000000000000000000000000000000000000000001790525161123b906115bf565b611246929190611cf4565b8190604051809103906000f5905080158015611266573d6000803e3d6000fd5b50949350505050565b806000036113055760008260008151811061128c5761128c611ada565b60200260200101518060200190518101906112a79190611d5a565b9050806040516112b79190611dc8565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff8616907f645126e6978c1c365d84853d6b5fde98c36802fdbf41bba8d1a8ee915c9ea69290600090a350505050565b806001036113895760008260008151811061132257611322611ada565b602002602001015180602001905181019061133d9190611de4565b9050808473ffffffffffffffffffffffffffffffffffffffff167fa5c3e1e5fe35e2cf53bcd2d9788d8c914a2c0009059c57a4f81867ef891f953a60405160405180910390a350505050565b8060020361140d576000826000815181106113a6576113a6611ada565b60200260200101518060200190518101906113c19190611de4565b9050808473ffffffffffffffffffffffffffffffffffffffff167fc3ff6c3d86b9cdcc412d73eebae668f46939e7200f0a8b85a9d1b193cb78d9a660405160405180910390a350505050565b806003036114915760008260008151811061142a5761142a611ada565b60200260200101518060200190518101906114459190611de4565b9050808473ffffffffffffffffffffffffffffffffffffffff167fd3a48525d8c5ab22221baba6d473309d152050b2bbc71145e26a192ef216e8d160405160405180910390a350505050565b8060040361152b576000826000815181106114ae576114ae611ada565b60200260200101518060200190518101906114c99190611b93565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f1fa54e548d12ab4ab1876c405749e0ef462160262aaa4df2bfd4f4fe9fc7693b60405160405180910390a350505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642074656d706c617465496478000000000000000000000000006044820152606401610aa7565b60006111808383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61041d80611dfe83390190565b60005b838110156115e75781810151838201526020016115cf565b50506000910152565b600081518084526116088160208601602086016115cc565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156116da578685037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018452815180518087526020918201918088019190600582901b89010160005b828110156116c157601f198a83030184526116ac8286516115f0565b60209586019594909401939150600101611690565b5097505050602094850194929092019150600101611644565b50929695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715611739576117396116e6565b60405290565b6040516080810167ffffffffffffffff81118282101715611739576117396116e6565b604051601f8201601f1916810167ffffffffffffffff8111828210171561178b5761178b6116e6565b604052919050565b600067ffffffffffffffff8211156117ad576117ad6116e6565b50601f01601f191660200190565b600082601f8301126117cc57600080fd5b81356020830160006117e56117e084611793565b611762565b90508281528583830111156117f957600080fd5b82826020830137600092810160200192909252509392505050565b8035801515811461182457600080fd5b919050565b6000610100828403121561183c57600080fd5b611844611715565b9050813567ffffffffffffffff81111561185d57600080fd5b611869848285016117bb565b8252506020828101359082015260408083013590820152606082013567ffffffffffffffff81111561189a57600080fd5b6118a6848285016117bb565b6060830152506080828101359082015260a080830135908201526118cc60c08301611814565b60c082015260e082013567ffffffffffffffff8111156118eb57600080fd5b6118f7848285016117bb565b60e08301525092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461192557600080fd5b50565b803561182481611903565b60008060006060848603121561194857600080fd5b833567ffffffffffffffff81111561195f57600080fd5b84016080818703121561197157600080fd5b61197961173f565b81358152602082013567ffffffffffffffff81111561199757600080fd5b8201601f810188136119a857600080fd5b803567ffffffffffffffff8111156119c2576119c26116e6565b8060051b6119d260208201611762565b9182526020818401810192908101908b8411156119ee57600080fd5b6020850192505b83831015611a3557823567ffffffffffffffff811115611a1457600080fd5b611a238d6020838901016117bb565b835250602092830192909101906119f5565b60208601525050505060408281013590820152606082013567ffffffffffffffff811115611a6257600080fd5b611a6e88828501611829565b6060830152509350611a84905060208501611928565b929592945050506040919091013590565b60008060408385031215611aa857600080fd5b8235611ab381611903565b946020939093013593505050565b600060208284031215611ad357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000604082018483526040602084015280845180835260608501915060608160051b86010192506020860160005b82811015611b86577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0878603018452611b718583516115f0565b94506020938401939190910190600101611b37565b5092979650505050505050565b600060208284031215611ba557600080fd5b815161118081611903565b600081516101008452611bc76101008501826115f0565b9050602083015160208501526040830151604085015260608301518482036060860152611bf482826115f0565b9150506080830151608085015260a083015160a085015260c0830151611c1e60c086018215159052565b5060e083015184820360e0860152611c3682826115f0565b95945050505050565b60208152600060a082018351602084015260208401516080604085015281815180845260c08601915060c08160051b870101935060208301925060005b81811015611ccb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40878603018352611cb68585516115f0565b94506020938401939290920191600101611c7c565b50505050604084015160608401526060840151601f19848303016080850152611c368282611bb0565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000611d2360408301846115f0565b949350505050565b60008351611d3d8184602088016115cc565b835190830190611d518183602088016115cc565b01949350505050565b600060208284031215611d6c57600080fd5b815167ffffffffffffffff811115611d8357600080fd5b8201601f81018413611d9457600080fd5b8051611da26117e082611793565b818152856020838501011115611db757600080fd5b611c368260208301602086016115cc565b60008251611dda8184602087016115cc565b9190910192915050565b600060208284031215611df657600080fd5b505191905056fe608060405260405161041d38038061041d83398101604081905261002291610268565b61002c8282610033565b5050610358565b61003c82610092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561008657610081828261010e565b505050565b61008e610185565b5050565b806001600160a01b03163b6000036100cd57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161012b919061033c565b600060405180830381855af49150503d8060008114610166576040519150601f19603f3d011682016040523d82523d6000602084013e61016b565b606091505b50909250905061017c8583836101a6565b95945050505050565b34156101a45760405163b398979f60e01b815260040160405180910390fd5b565b6060826101bb576101b682610205565b6101fe565b81511580156101d257506001600160a01b0384163b155b156101fb57604051639996b31560e01b81526001600160a01b03851660048201526024016100c4565b50805b9392505050565b8051156102155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025f578181015183820152602001610247565b50506000910152565b6000806040838503121561027b57600080fd5b82516001600160a01b038116811461029257600080fd5b60208401519092506001600160401b038111156102ae57600080fd5b8301601f810185136102bf57600080fd5b80516001600160401b038111156102d8576102d861022e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103065761030661022e565b60405281815282820160200187101561031e57600080fd5b61032f826020830160208601610244565b8093505050509250929050565b6000825161034e818460208701610244565b9190910192915050565b60b7806103666000396000f3fe6080604052600a600c565b005b60186014601a565b605e565b565b600060597f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e808015607c573d6000f35b3d6000fdfea2646970667358221220d774b63875ebbbb75f47054a127014ec1ba4efb9781fa1be4664237d223e393264736f6c634300081a0033a26469706673582212206d37fff02fd2da9ab0f7ae9da3e2b051bce49c51c66b2c0b1358f66b988e752464736f6c634300081a0033", + "sourceMap": "345:8296:28:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;439:42;;;;;;;;;;;;190::29;178:55;;;160:74;;148:2;133:18;439:42:28;;;;;;;;5068:778;;;:::i;:::-;;;;;;;:::i;5919:1702::-;;;;;;:::i;:::-;;:::i;:::-;;1112:94;1161:7;1187:12;;;1112:94;;2745:698;;;;;;:::i;:::-;;:::i;1413:86::-;1484:8;;;;1413:86;;377:27;;;;;;;;;410:23;;;;;;;;;1758:124;1848:27;;;;1758:124;;4660:150;;;;;;:::i;:::-;4767:34;;;;;;15327:21:29;;;15384:1;15364:18;;;15357:29;15422:9;15402:18;;;15395:37;15484:20;;;15477:36;;;4726:4:28;;15449:19:29;;4767:34:28;;;-1:-1:-1;;4767:34:28;;;;;;;;;4757:45;;4767:34;4757:45;;;;;4660:150;-1:-1:-1;;4660:150:28;;;;8681:25:29;;;8669:2;8654:18;4660:150:28;8535:177:29;5068:778:28;5176:17;;;5191:1;5176:17;;;5117;5176;;;;;;5146:27;;5176:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;5218:15:28;;;5231:1;5218:15;;;;;;;;;5146:47;;-1:-1:-1;5218:15:28;;;;;;;;;;;;;;;;;;;;5203:9;5213:1;5203:12;;;;;;;;:::i;:::-;;;;;;:30;;;;5243:24;;;;;;;;;;;;;;;;;:9;5253:1;5243:12;;;;;;;;:::i;:::-;;;;;;;5256:1;5243:15;;;;;;;;:::i;:::-;;;;;;:24;;;;5277:26;;;;;;;;;;;;;;;;;:9;5287:1;5277:12;;;;;;;;:::i;:::-;;;;;;;5290:1;5277:15;;;;;;;;:::i;:::-;;;;;;:26;;;;5313:28;;;;;;;;;;;;;;;;;:9;5323:1;5313:12;;;;;;;;:::i;:::-;;;;;;;5326:1;5313:15;;;;;;;;:::i;:::-;;;;;;:28;;;;5352:24;;;;;;;;;;;;;;;;;:9;5362:1;5352:12;;;;;;;;:::i;:::-;;;;;;;5365:1;5352:15;;;;;;;;:::i;:::-;;;;;;:24;;;;5386;;;;;;;;;;;;;;;;;:9;5396:1;5386:12;;;;;;;;:::i;:::-;;;;;;;5399:1;5386:15;;;;;;;;:::i;:::-;;;;;;:24;;;;5420:26;;;;;;;;;;;;;;;;;:9;5430:1;5420:12;;;;;;;;:::i;:::-;;;;;;;5433:1;5420:15;;;;;;;;:::i;:::-;;;;;;:26;;;;5457:24;;;;;;;;;;;;;;;;;:9;5467:1;5457:12;;;;;;;;:::i;:::-;;;;;;;5470:1;5457:15;;;;;;;;:::i;:::-;;;;;;:24;;;;5491:23;;;;;;;;;;;;;;;;;:9;5501:1;5491:12;;;;;;;;:::i;:::-;;;;;;;5504:1;5491:15;;;;;;;;:::i;:::-;;;;;;:23;;;;5524:25;;;;;;;;;;;;;;;;;:9;5534:1;5524:12;;;;;;;;:::i;:::-;;;;;;;5537:1;5524:15;;;;;;;;:::i;:::-;;;;;;:25;;;;5560:24;;;;;;;;;;;;;;;;;:9;5570:1;5560:12;;;;;;;;:::i;:::-;;;;;;;5573:1;5560:15;;;;;;;;:::i;:::-;;;;;;:24;;;;5594:28;;;;;;;;;;;;;;;;;:9;5604:1;5594:12;;;;;;;;:::i;:::-;;;;;;;5607:1;5594:15;;;;;;;;:::i;:::-;;;;;;:28;;;;5632:30;;;;;;;;;;;;;;;;;:9;5642:1;5632:12;;;;;;;;:::i;:::-;;;;;;;5645:1;5632:15;;;;;;;;:::i;:::-;;;;;;:30;;;;5673:24;;;;;;;;;;;;;;;;;:9;5683:1;5673:12;;;;;;;;:::i;:::-;;;;;;;5686:1;5673:15;;;;;;;;:::i;:::-;;;;;;:24;;;;5707:28;;;;;;;;;;;;;;;;;:9;5717:1;5707:12;;;;;;;;:::i;:::-;;;;;;;5720:1;5707:15;;;;;;;;:::i;:::-;;;;;;:28;;;;5745;;;;;;;;;;;;;;;;;:9;5755:1;5745:12;;;;;;;;:::i;:::-;;;;;;;5758:1;5745:15;;;;;;;;:::i;:::-;;;;;;:28;;;;5783:29;;;;;;;;;;;;;;;;;:9;5793:1;5783:12;;;;;;;;:::i;:::-;;;;;;;5796:1;5783:15;;;;;;;;:::i;:::-;;;;;;;;;;:29;5830:9;5068:778;-1:-1:-1;5068:778:28:o;5919:1702::-;6059:21;6083:96;6120:5;6139:12;:18;;;:30;;;6083:23;:96::i;:::-;6059:120;;6189:15;6207:30;6225:11;4767:34;;;;;;15327:21:29;;;15384:1;15364:18;;;15357:29;15422:9;15402:18;;;15395:37;15484:20;;;15477:36;;;4726:4:28;;15449:19:29;;4767:34:28;;;-1:-1:-1;;4767:34:28;;;;;;;;;4757:45;;4767:34;4757:45;;;;;4660:150;-1:-1:-1;;4660:150:28;6207:30;6269:23;;6189:48;;-1:-1:-1;6255:37:28;;6247:69;;;;;;;9108:2:29;6247:69:28;;;9090:21:29;9147:2;9127:18;;;9120:30;9186:21;9166:18;;;9159:49;9225:18;;6247:69:28;;;;;;;;;6327:19;6360:13;:25;;;6389:1;6360:30;6356:1140;;6431:18;;;;:30;;;:38;;6465:4;6431:38;6406:141;;;;;;;9456:2:29;6406:141:28;;;9438:21:29;9495:2;9475:18;;;9468:30;9534:34;9514:18;;;9507:62;9605:14;9585:18;;;9578:42;9637:19;;6406:141:28;9254:408:29;6406:141:28;6561:20;6584:105;6622:5;6645:12;:18;;;:30;;;6584:20;:105::i;:::-;6561:128;;6744:13;6728:29;;:12;:29;;;6703:135;;;;;;;9869:2:29;6703:135:28;;;9851:21:29;9908:2;9888:18;;;9881:30;9947:34;9927:18;;;9920:62;10018:17;9998:18;;;9991:45;10053:19;;6703:135:28;9667:411:29;6703:135:28;6874:12;6852:35;;6901:9;:26;;;6928:6;1484:8;;;;;1413:86;6928:6;6901:34;;;;;;;;;;190:42:29;178:55;;;6901:34:28;;;160:74:29;133:18;;6901:34:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6949:9;:22;;;6972:10;1161:7;1187:12;;;;1112:94;6972:10;6949:34;;;;;;;;;;190:42:29;178:55;;;6949:34:28;;;160:74:29;133:18;;6949:34:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6997:27;7027:18;:16;:18::i;:::-;6997:48;;7064:8;7059:212;7084:9;:16;7078:3;:22;7059:212;;;7127:9;:31;;;7180:22;7198:3;4767:34;;;;;;15327:21:29;;;15384:1;15364:18;;;15357:29;15422:9;15402:18;;;15395:37;15484:20;;;15477:36;;;4726:4:28;;15449:19:29;;4767:34:28;;;-1:-1:-1;;4767:34:28;;;;;;;;;4757:45;;4767:34;4757:45;;;;;4660:150;-1:-1:-1;;4660:150:28;7180:22;7224:9;7234:3;7224:14;;;;;;;;:::i;:::-;;;;;;;7127:129;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7102:5:28;;;;;-1:-1:-1;7059:212:28;;-1:-1:-1;7059:212:28;;;6392:889;;6356:1140;;;7339:13;7301:54;;7428:4;7394:39;;:9;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;7369:116;;;;;;;11458:2:29;7369:116:28;;;11440:21:29;11497:2;11477:18;;;11470:30;11536:20;11516:18;;;11509:48;11574:18;;7369:116:28;11256:342:29;7369:116:28;7505:33;;;;;:19;;;;;;:33;;7525:12;;7505:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7548:66;7559:13;7574:12;:26;;;7602:11;7548:10;:66::i;:::-;6049:1572;;;5919:1702;;;:::o;2745:698::-;2857:7;2895:541;2935:11;3037:31;;;;;;;;:::i;:::-;-1:-1:-1;;3037:31:28;;;;;;;;;;;;;;3134:25;1848:27;;;;;1758:124;3134:25;3189:167;;14085:42:29;14073:55;;3189:167:28;;;14055:74:29;14145:18;;;14138:34;;;3320:4:28;14188:18:29;;;14181:83;14028:18;;3189:167:28;;;-1:-1:-1;;3189:167:28;;;;;;;;;;;;;;;;;;;;;3094:288;;;;;3189:167;3094:288;;:::i;:::-;;;;-1:-1:-1;;3094:288:28;;;;;;;;;;2995:409;;;3094:288;2995:409;;:::i;:::-;;;;;;;;;;;;;2964:458;;;;;;2895:22;:541::i;:::-;2876:560;2745:698;-1:-1:-1;;;2745:698:28:o;3892:401::-;3998:7;4017:18;4061:11;4087:25;1848:27;;;;;1758:124;4087:25;4126:119;;14085:42:29;14073:55;;4126:119:28;;;14055:74:29;14145:18;;;14138:34;;;4225:4:28;14188:18:29;;;14181:83;14028:18;;4126:119:28;;;-1:-1:-1;;4126:119:28;;;;;;;;;;;;;;;;;;;;4038:217;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4017:238:28;3892:401;-1:-1:-1;;;;3892:401:28:o;7627:1012::-;7770:11;7785:1;7770:16;7766:867;;7802:21;7837:13;7851:1;7837:16;;;;;;;;:::i;:::-;;;;;;;7826:38;;;;;;;;;;;;:::i;:::-;7802:62;;7912:7;7883:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7788:143;7627:1012;;;:::o;7766:867::-;7941:11;7956:1;7941:16;7937:696;;7973:12;7999:13;8013:1;7999:16;;;;;;;;:::i;:::-;;;;;;;7988:36;;;;;;;;;;;;:::i;:::-;7973:51;;8070:7;8055:13;8043:35;;;;;;;;;;;;7959:130;7627:1012;;;:::o;7937:696::-;8099:11;8114:1;8099:16;8095:538;;8131:11;8156:13;8170:1;8156:16;;;;;;;;:::i;:::-;;;;;;;8145:35;;;;;;;;;;;;:::i;:::-;8131:49;;8225:7;8210:13;8199:34;;;;;;;;;;;;8117:127;7627:1012;;;:::o;8095:538::-;8254:11;8269:1;8254:16;8250:383;;8286:12;8312:13;8326:1;8312:16;;;;;;;;:::i;:::-;;;;;;;8301:36;;;;;;;;;;;;:::i;:::-;8286:51;;8387:7;8372:13;8356:39;;;;;;;;;;;;8272:134;7627:1012;;;:::o;8250:383::-;8416:11;8431:1;8416:16;8412:221;;8448:15;8477:13;8491:1;8477:16;;;;;;;;:::i;:::-;;;;;;;8466:39;;;;;;;;;;;;:::i;:::-;8448:57;;8554:7;8524:38;;8539:13;8524:38;;;;;;;;;;;;8434:139;7627:1012;;;:::o;8412:221::-;8593:29;;;;;17334:2:29;8593:29:28;;;17316:21:29;17373:2;17353:18;;;17346:30;17412:21;17392:18;;;17385:49;17451:18;;8593:29:28;17132:343:29;2190:165:16;2273:7;2299:49;2314:4;2320:12;2342:4;2699:12;2806:4;2800:11;4025:12;4018:4;4013:3;4009:14;4002:36;4074:4;4067;4062:3;4058:14;4051:28;4104:8;4099:3;4092:21;4197:4;4192:3;4188:14;4175:27;;4308:4;4301:5;4293:20;4351:2;4334:20;;;2598:1772;-1:-1:-1;;;;2598:1772:16:o;-1:-1:-1:-;;;;;;;;:::o;245:250:29:-;330:1;340:113;354:6;351:1;348:13;340:113;;;430:11;;;424:18;411:11;;;404:39;376:2;369:10;340:113;;;-1:-1:-1;;487:1:29;469:16;;462:27;245:250::o;500:330::-;542:3;580:5;574:12;607:6;602:3;595:19;623:76;692:6;685:4;680:3;676:14;669:4;662:5;658:16;623:76;:::i;:::-;744:2;732:15;-1:-1:-1;;728:88:29;719:98;;;;819:4;715:109;;500:330;-1:-1:-1;;500:330:29:o;835:1535::-;1047:4;1095:2;1084:9;1080:18;1125:2;1114:9;1107:21;1148:6;1183;1177:13;1214:6;1206;1199:22;1252:2;1241:9;1237:18;1230:25;;1314:2;1304:6;1301:1;1297:14;1286:9;1282:30;1278:39;1264:53;;1352:2;1344:6;1340:15;1373:1;1383:958;1397:6;1394:1;1391:13;1383:958;;;1462:22;;;1486:66;1458:95;1446:108;;1577:13;;1651:9;;1673:24;;;1731:2;1828:11;;;;1719:15;;;;1651:9;1781:1;1777:16;;;1765:29;;1761:38;1863:1;1877:355;1893:8;1888:3;1885:17;1877:355;;;-1:-1:-1;;1986:6:29;1978;1974:19;1970:92;1963:5;1956:107;2090:42;2125:6;2114:8;2108:15;2090:42;:::i;:::-;2175:2;2161:17;;;;2204:14;;;;;2080:52;-1:-1:-1;1921:1:29;1912:11;1877:355;;;-1:-1:-1;2255:6:29;-1:-1:-1;;;2296:2:29;2319:12;;;;2284:15;;;;;-1:-1:-1;1419:1:29;1412:9;1383:958;;;-1:-1:-1;2358:6:29;;835:1535;-1:-1:-1;;;;;;835:1535:29:o;2375:184::-;2427:77;2424:1;2417:88;2524:4;2521:1;2514:15;2548:4;2545:1;2538:15;2564:255;2636:2;2630:9;2678:6;2666:19;;2715:18;2700:34;;2736:22;;;2697:62;2694:88;;;2762:18;;:::i;:::-;2798:2;2791:22;2564:255;:::o;2824:253::-;2896:2;2890:9;2938:4;2926:17;;2973:18;2958:34;;2994:22;;;2955:62;2952:88;;;3020:18;;:::i;3082:334::-;3153:2;3147:9;3209:2;3199:13;;-1:-1:-1;;3195:86:29;3183:99;;3312:18;3297:34;;3333:22;;;3294:62;3291:88;;;3359:18;;:::i;:::-;3395:2;3388:22;3082:334;;-1:-1:-1;3082:334:29:o;3421:245::-;3469:4;3502:18;3494:6;3491:30;3488:56;;;3524:18;;:::i;:::-;-1:-1:-1;3581:2:29;3569:15;-1:-1:-1;;3565:88:29;3655:4;3561:99;;3421:245::o;3671:516::-;3713:5;3766:3;3759:4;3751:6;3747:17;3743:27;3733:55;;3784:1;3781;3774:12;3733:55;3824:6;3811:20;3863:4;3855:6;3851:17;3892:1;3913:52;3929:35;3957:6;3929:35;:::i;:::-;3913:52;:::i;:::-;3902:63;;3990:6;3981:7;3974:23;4030:3;4021:6;4016:3;4012:16;4009:25;4006:45;;;4047:1;4044;4037:12;4006:45;4098:6;4093:3;4086:4;4077:7;4073:18;4060:45;4154:1;4125:20;;;4147:4;4121:31;4114:42;;;;-1:-1:-1;4129:7:29;3671:516;-1:-1:-1;;;3671:516:29:o;4192:160::-;4257:20;;4313:13;;4306:21;4296:32;;4286:60;;4342:1;4339;4332:12;4286:60;4192:160;;;:::o;4357:1289::-;4414:5;4462:6;4450:9;4445:3;4441:19;4437:32;4434:52;;;4482:1;4479;4472:12;4434:52;4504:22;;:::i;:::-;4495:31;;4562:9;4549:23;4595:18;4587:6;4584:30;4581:50;;;4627:1;4624;4617:12;4581:50;4654:45;4695:3;4686:6;4675:9;4671:22;4654:45;:::i;:::-;4640:60;;-1:-1:-1;4773:2:29;4758:18;;;4745:32;4793:14;;;4786:31;4890:2;4875:18;;;4862:32;4910:14;;;4903:31;4987:2;4972:18;;4959:32;5016:18;5003:32;;5000:52;;;5048:1;5045;5038:12;5000:52;5084:47;5127:3;5116:8;5105:9;5101:24;5084:47;:::i;:::-;5079:2;5068:14;;5061:71;-1:-1:-1;5205:3:29;5190:19;;;5177:33;5226:15;;;5219:32;5324:3;5309:19;;;5296:33;5345:15;;;5338:32;5403:36;5434:3;5419:19;;5403:36;:::i;:::-;5397:3;5390:5;5386:15;5379:61;5493:3;5482:9;5478:19;5465:33;5523:18;5513:8;5510:32;5507:52;;;5555:1;5552;5545:12;5507:52;5592:47;5635:3;5624:8;5613:9;5609:24;5592:47;:::i;:::-;5586:3;5579:5;5575:15;5568:72;;4357:1289;;;;:::o;5651:154::-;5737:42;5730:5;5726:54;5719:5;5716:65;5706:93;;5795:1;5792;5785:12;5706:93;5651:154;:::o;5810:134::-;5878:20;;5907:31;5878:20;5907:31;:::i;5949:1978::-;6056:6;6064;6072;6125:2;6113:9;6104:7;6100:23;6096:32;6093:52;;;6141:1;6138;6131:12;6093:52;6181:9;6168:23;6214:18;6206:6;6203:30;6200:50;;;6246:1;6243;6236:12;6200:50;6269:22;;6325:4;6307:16;;;6303:27;6300:47;;;6343:1;6340;6333:12;6300:47;6369:22;;:::i;:::-;6436:16;;6461:22;;6529:2;6521:11;;6508:25;6558:18;6545:32;;6542:52;;;6590:1;6587;6580:12;6542:52;6613:17;;6661:4;6653:13;;6649:27;-1:-1:-1;6639:55:29;;6690:1;6687;6680:12;6639:55;6730:2;6717:16;6756:18;6748:6;6745:30;6742:56;;;6778:18;;:::i;:::-;6824:6;6821:1;6817:14;6851:28;6875:2;6871;6867:11;6851:28;:::i;:::-;6913:19;;;6957:2;6987:11;;;6983:20;;;6948:12;;;;7015:19;;;7012:39;;;7047:1;7044;7037:12;7012:39;7079:2;7075;7071:11;7060:22;;7091:298;7107:6;7102:3;7099:15;7091:298;;;7193:3;7180:17;7229:18;7216:11;7213:35;7210:55;;;7261:1;7258;7251:12;7210:55;7290:56;7338:7;7333:2;7319:11;7315:2;7311:20;7307:29;7290:56;:::i;:::-;7278:69;;-1:-1:-1;7376:2:29;7124:12;;;;7367;;;;7091:298;;;7416:2;7405:14;;7398:29;-1:-1:-1;;;;7493:2:29;7485:11;;;7472:25;7513:14;;;7506:31;7583:2;7575:11;;7562:25;7612:18;7599:32;;7596:52;;;7644:1;7641;7634:12;7596:52;7680:56;7728:7;7717:8;7713:2;7709:17;7680:56;:::i;:::-;7675:2;7664:14;;7657:80;-1:-1:-1;7668:5:29;-1:-1:-1;7780:38:29;;-1:-1:-1;7814:2:29;7799:18;;7780:38;:::i;:::-;5949:1978;;7770:48;;-1:-1:-1;;;7891:2:29;7876:18;;;;7863:32;;5949:1978::o;7932:367::-;8000:6;8008;8061:2;8049:9;8040:7;8036:23;8032:32;8029:52;;;8077:1;8074;8067:12;8029:52;8116:9;8103:23;8135:31;8160:5;8135:31;:::i;:::-;8185:5;8263:2;8248:18;;;;8235:32;;-1:-1:-1;;;7932:367:29:o;8304:226::-;8363:6;8416:2;8404:9;8395:7;8391:23;8387:32;8384:52;;;8432:1;8429;8422:12;8384:52;-1:-1:-1;8477:23:29;;8304:226;-1:-1:-1;8304:226:29:o;8717:184::-;8769:77;8766:1;8759:88;8866:4;8863:1;8856:15;8890:4;8887:1;8880:15;10083:912;10273:4;10321:2;10310:9;10306:18;10351:6;10340:9;10333:25;10394:2;10389;10378:9;10374:18;10367:30;10417:6;10452;10446:13;10483:6;10475;10468:22;10521:2;10510:9;10506:18;10499:25;;10583:2;10573:6;10570:1;10566:14;10555:9;10551:30;10547:39;10533:53;;10621:2;10613:6;10609:15;10642:1;10652:314;10666:6;10663:1;10660:13;10652:314;;;10755:66;10743:9;10735:6;10731:22;10727:95;10722:3;10715:108;10846:40;10879:6;10870;10864:13;10846:40;:::i;:::-;10836:50;-1:-1:-1;10921:2:29;10944:12;;;;10909:15;;;;;10688:1;10681:9;10652:314;;;-1:-1:-1;10983:6:29;;10083:912;-1:-1:-1;;;;;;;10083:912:29:o;11000:251::-;11070:6;11123:2;11111:9;11102:7;11098:23;11094:32;11091:52;;;11139:1;11136;11129:12;11091:52;11171:9;11165:16;11190:31;11215:5;11190:31;:::i;11699:864::-;11752:3;11796:5;11790:12;11823:6;11818:3;11811:19;11851:49;11892:6;11887:3;11883:16;11869:12;11851:49;:::i;:::-;11839:61;;11949:4;11942:5;11938:16;11932:23;11925:4;11920:3;11916:14;11909:47;12005:4;11998:5;11994:16;11988:23;11981:4;11976:3;11972:14;11965:47;12060:4;12053:5;12049:16;12043:23;12108:3;12102:4;12098:14;12091:4;12086:3;12082:14;12075:38;12136:39;12170:4;12154:14;12136:39;:::i;:::-;12122:53;;;12224:4;12217:5;12213:16;12207:23;12200:4;12195:3;12191:14;12184:47;12280:4;12273:5;12269:16;12263:23;12256:4;12251:3;12247:14;12240:47;12335:4;12328:5;12324:16;12318:23;12350:47;12391:4;12386:3;12382:14;12366;11673:13;11666:21;11654:34;;11603:91;12350:47;;12445:4;12438:5;12434:16;12428:23;12495:3;12487:6;12483:16;12476:4;12471:3;12467:14;12460:40;12516:41;12550:6;12534:14;12516:41;:::i;:::-;12509:48;11699:864;-1:-1:-1;;;;;11699:864:29:o;12568:1280::-;12757:2;12746:9;12739:21;12720:4;12798:3;12787:9;12783:19;12844:6;12838:13;12833:2;12822:9;12818:18;12811:41;12899:2;12891:6;12887:15;12881:22;12939:4;12934:2;12923:9;12919:18;12912:32;12964:6;12999:12;12993:19;13036:6;13028;13021:22;13074:3;13063:9;13059:19;13052:26;;13137:3;13127:6;13124:1;13120:14;13109:9;13105:30;13101:40;13087:54;;13182:2;13168:12;13164:21;13150:35;;13203:1;13213:314;13227:6;13224:1;13221:13;13213:314;;;13316:66;13304:9;13296:6;13292:22;13288:95;13283:3;13276:108;13407:40;13440:6;13431;13425:13;13407:40;:::i;:::-;13397:50;-1:-1:-1;13482:2:29;13470:15;;;;13505:12;;;;;13249:1;13242:9;13213:314;;;13217:3;;;;13581:2;13573:6;13569:15;13563:22;13558:2;13547:9;13543:18;13536:50;13635:2;13627:6;13623:15;13617:22;-1:-1:-1;;13693:9:29;13685:6;13681:22;13677:95;13670:4;13659:9;13655:20;13648:125;13790:52;13835:6;13819:14;13790:52;:::i;14275:338::-;14462:42;14454:6;14450:55;14439:9;14432:74;14542:2;14537;14526:9;14522:18;14515:30;14413:4;14562:45;14603:2;14592:9;14588:18;14580:6;14562:45;:::i;:::-;14554:53;14275:338;-1:-1:-1;;;;14275:338:29:o;14618:492::-;14793:3;14831:6;14825:13;14847:66;14906:6;14901:3;14894:4;14886:6;14882:17;14847:66;:::i;:::-;14976:13;;14935:16;;;;14998:70;14976:13;14935:16;15045:4;15033:17;;14998:70;:::i;:::-;15084:20;;14618:492;-1:-1:-1;;;;14618:492:29:o;15524:668::-;15604:6;15657:2;15645:9;15636:7;15632:23;15628:32;15625:52;;;15673:1;15670;15663:12;15625:52;15706:9;15700:16;15739:18;15731:6;15728:30;15725:50;;;15771:1;15768;15761:12;15725:50;15794:22;;15847:4;15839:13;;15835:27;-1:-1:-1;15825:55:29;;15876:1;15873;15866:12;15825:55;15909:2;15903:9;15934:52;15950:35;15978:6;15950:35;:::i;15934:52::-;16009:6;16002:5;15995:21;16057:7;16052:2;16043:6;16039:2;16035:15;16031:24;16028:37;16025:57;;;16078:1;16075;16068:12;16025:57;16091:71;16155:6;16150:2;16143:5;16139:14;16134:2;16130;16126:11;16091:71;:::i;16197:289::-;16328:3;16366:6;16360:13;16382:66;16441:6;16436:3;16429:4;16421:6;16417:17;16382:66;:::i;:::-;16464:16;;;;;16197:289;-1:-1:-1;;16197:289:29:o;16491:184::-;16561:6;16614:2;16602:9;16593:7;16589:23;16585:32;16582:52;;;16630:1;16627;16620:12;16582:52;-1:-1:-1;16653:16:29;;16491:184;-1:-1:-1;16491:184:29:o", + "linkReferences": {} + }, + "methodIdentifiers": { + "commandTemplates()": "16a8b1a0", + "computeEmailAuthAddress(address,bytes32)": "3a8eab14", + "computeTemplateId(uint256)": "db4f06d6", + "dkim()": "400ad5ce", + "dkimAddr()": "73357f85", + "emailAuthImplementation()": "b6201692", + "emailAuthImplementationAddr()": "1098e02e", + "emitEmailCommand((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),address,uint256)": "20c700c0", + "verifier()": "2b7ac3f3", + "verifierAddr()": "663ea2e2" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"emailAuthAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"command\",\"type\":\"uint256\"}],\"name\":\"DecimalsCommand\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"emailAuthAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"command\",\"type\":\"address\"}],\"name\":\"EthAddrCommand\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"emailAuthAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"int256\",\"name\":\"command\",\"type\":\"int256\"}],\"name\":\"IntCommand\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"emailAuthAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"command\",\"type\":\"string\"}],\"name\":\"StringCommand\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"emailAuthAddr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"command\",\"type\":\"uint256\"}],\"name\":\"UintCommand\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"commandTemplates\",\"outputs\":[{\"internalType\":\"string[][]\",\"name\":\"\",\"type\":\"string[][]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"accountSalt\",\"type\":\"bytes32\"}],\"name\":\"computeEmailAuthAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"templateIdx\",\"type\":\"uint256\"}],\"name\":\"computeTemplateId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dkim\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dkimAddr\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emailAuthImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emailAuthImplementationAddr\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"templateId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"commandParams\",\"type\":\"bytes[]\"},{\"internalType\":\"uint256\",\"name\":\"skippedCommandPrefix\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"domainName\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"publicKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"maskedCommand\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"emailNullifier\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"accountSalt\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"isCodeExist\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"internalType\":\"struct EmailProof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"internalType\":\"struct EmailAuthMsg\",\"name\":\"emailAuthMsg\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"templateIdx\",\"type\":\"uint256\"}],\"name\":\"emitEmailCommand\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifierAddr\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"commandTemplates()\":{\"returns\":{\"_0\":\"string[][] A two-dimensional array of strings, where each inner array represents a set of fixed strings and matchers for a command template.\"}},\"computeEmailAuthAddress(address,bytes32)\":{\"details\":\"This function utilizes the `Create2` library to compute the address. The computation uses a provided account address to be recovered, account salt, and the hash of the encoded ERC1967Proxy creation code concatenated with the encoded email auth contract implementation address and the initialization call data. This ensures that the computed address is deterministic and unique per account salt.\",\"params\":{\"accountSalt\":\"A bytes32 salt value defined as a hash of the guardian's email address and an account code. This is assumed to be unique to a pair of the guardian's email address and the wallet address to be recovered.\",\"owner\":\"The address of the owner of the EmailAuth proxy.\"},\"returns\":{\"_0\":\"address The computed address.\"}},\"computeTemplateId(uint256)\":{\"details\":\"Encodes the email account recovery version ID, \\\"EXAMPLE\\\", and the template index, then uses keccak256 to hash these values into a uint ID.\",\"params\":{\"templateIdx\":\"The index of the command template.\"},\"returns\":{\"_0\":\"uint The computed uint ID.\"}},\"dkim()\":{\"details\":\"This function is virtual and can be overridden by inheriting contracts.\",\"returns\":{\"_0\":\"address The address of the DKIM contract.\"}},\"emailAuthImplementation()\":{\"details\":\"This function is virtual and can be overridden by inheriting contracts.\",\"returns\":{\"_0\":\"address The address of the email authentication contract implementation.\"}},\"verifier()\":{\"details\":\"This function is virtual and can be overridden by inheriting contracts.\",\"returns\":{\"_0\":\"address The address of the verifier contract.\"}}},\"title\":\"Example contract that emits an event for the command in the given email.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"commandTemplates()\":{\"notice\":\"Returns a two-dimensional array of strings representing the command templates.\"},\"computeEmailAuthAddress(address,bytes32)\":{\"notice\":\"Computes the address for email auth contract using the CREATE2 opcode.\"},\"computeTemplateId(uint256)\":{\"notice\":\"Calculates a unique command template ID for template provided by this contract.\"},\"dkim()\":{\"notice\":\"Returns the address of the DKIM contract.\"},\"emailAuthImplementation()\":{\"notice\":\"Returns the address of the email auth contract implementation.\"},\"emitEmailCommand((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),address,uint256)\":{\"notice\":\"Emits an event for the command in the given email.\"},\"verifier()\":{\"notice\":\"Returns the address of the verifier contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EmitEmailCommand.sol\":\"EmitEmailCommand\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":20000},\"remappings\":[\":@matterlabs/=node_modules/@matterlabs/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@uniswap/=node_modules/@uniswap/\",\":@zk-email/=node_modules/@zk-email/\",\":accountabstraction/=node_modules/accountabstraction/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":solady/=node_modules/solady/src/\"]},\"sources\":{\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"node_modules/@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9\",\"dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v\"]},\"node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f\",\"dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt\"]},\"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"keccak256\":\"0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c\",\"dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV\"]},\"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a\",\"dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE\"]},\"node_modules/@openzeppelin/contracts/proxy/Proxy.sol\":{\"keccak256\":\"0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac\",\"dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e\"]},\"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"node_modules/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd\",\"dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229\",\"dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850\",\"dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/Create2.sol\":{\"keccak256\":\"0x2b9807d194b92f1068d868e9587d27037264a9a067c778486f86ae21c61cbd5e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://22d71f40aa38a20cf466d8647452a6e3f746353474f8c8af40f03aa8cae38420\",\"dweb:/ipfs/QmQ752Hz5av7YDK8pFojzb5qgeXQvfsdkdwkHVzaXoYAZR\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c\",\"dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453\",\"dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875\",\"dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc\",\"dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT\"]},\"node_modules/@zk-email/contracts/DKIMRegistry.sol\":{\"keccak256\":\"0x7dc85d2f80b81b60fab94575a0769f3ce6300bf4e8a2e5dddcd2a8c2aa9a6983\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7fff6d3157e54d256ca746845297e71b121e20959ca1932e95fc30def82bc809\",\"dweb:/ipfs/QmYvXA2dhqAXVqbC9mxnjFXBgNLqC1KKfdnDs1YSEqiKn3\"]},\"node_modules/@zk-email/contracts/interfaces/IDKIMRegistry.sol\":{\"keccak256\":\"0x85ee536632227f79e208f364bb0fa8fdf6c046baa048e158d0817b8d1fce615d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a64d541d2d914ce7e6a13605fbdfb64abfa43dc9f7e2e1865948e2e0ed0f4b6\",\"dweb:/ipfs/Qmc1yJHdkXMdR2nbkFhgCruuYnA76zV6784qbiFaN7xU5V\"]},\"node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol\":{\"keccak256\":\"0x602fbb2c2639092b4730b2ab0c414358126695284014bb805777fbd12c8ceb92\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://602cb58ce5c0eb3a76bf75ec403b851c13318e5646cff56422839257d6ae4125\",\"dweb:/ipfs/QmVUCjPuUpx9auD7eNzXVNsFaifW9e9n2uBYzJqWwWHqum\"]},\"node_modules/@zk-email/ether-email-auth-contracts/src/interfaces/IGroth16Verifier.sol\":{\"keccak256\":\"0x3c3405cf20adfb69d760b204d1570c328f93b64f2caaf5e54f4a0ced6d2e2fcc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1a82f3d9a2a0cec1ef294758f555004bab93792213fe313ecf4542c36501c5c1\",\"dweb:/ipfs/QmcNnmvzMBaezF9CpDueah69UvxQNhBLw6S3aoGoVm9tLg\"]},\"node_modules/@zk-email/ether-email-auth-contracts/src/libraries/CommandUtils.sol\":{\"keccak256\":\"0xe5a54b706f91c1e02f408260f6f7c0dbe18697a3eb71394037813816a5bb7cd6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://12dcc386468bf001a99b38618af06ec993ccb11c8621731481d92f8934c8ebf3\",\"dweb:/ipfs/QmQCddXesydvzPkr1QDMbKPbS6JBHqSe34RncTARP3ByRz\"]},\"node_modules/@zk-email/ether-email-auth-contracts/src/libraries/DecimalUtils.sol\":{\"keccak256\":\"0x80b98721a7070856b3f000e61a54317ff441564ba5967c8a255c04a450747201\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://830b971ed21fd3ac7c944afda51db3401658f9788d6e8eb2e49d849edf0c3467\",\"dweb:/ipfs/QmQn1xgS48uTT4k8xCLeQ2oRm9CSDdkAkg11Q2FV6KppMU\"]},\"node_modules/@zk-email/ether-email-auth-contracts/src/utils/Verifier.sol\":{\"keccak256\":\"0xd93cd575c0ffaf3ae142a6450a0c295db4d21033a66ba77667193366b88e0b02\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b353b8d8a3ab7fdffd35a3c19216353960b13309da18842d79dc8d53ba9b3a23\",\"dweb:/ipfs/QmauaENbuVPZ7CRcfJkiKLPr8f5ecwAVDgNFjvL7eV5jyH\"]},\"src/EmitEmailCommand.sol\":{\"keccak256\":\"0xf35d0d2444d734afa6d097776b35105714dce6b7f1d14c5999ae6d73201e1005\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b8ef348ff2b3d9b757cacd3311d985b278713629e0eb9e299997b7685f952af6\",\"dweb:/ipfs/Qme8wZ7QJV6LDEuVxDkcQpNA4TX5Ms7ri6YRAfuaNnZ8xy\"]}},\"version\":1}", + "metadata": { + "compiler": { + "version": "0.8.26+commit.8a97fa7a" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "emailAuthAddr", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "command", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "DecimalsCommand", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "emailAuthAddr", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "command", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "EthAddrCommand", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "emailAuthAddr", + "type": "address", + "indexed": true + }, + { + "internalType": "int256", + "name": "command", + "type": "int256", + "indexed": true + } + ], + "type": "event", + "name": "IntCommand", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "emailAuthAddr", + "type": "address", + "indexed": true + }, + { + "internalType": "string", + "name": "command", + "type": "string", + "indexed": true + } + ], + "type": "event", + "name": "StringCommand", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "emailAuthAddr", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "command", + "type": "uint256", + "indexed": true + } + ], + "type": "event", + "name": "UintCommand", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "pure", + "type": "function", + "name": "commandTemplates", + "outputs": [ + { + "internalType": "string[][]", + "name": "", + "type": "string[][]" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "accountSalt", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function", + "name": "computeEmailAuthAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "templateIdx", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function", + "name": "computeTemplateId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "dkim", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "dkimAddr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "emailAuthImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "emailAuthImplementationAddr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "struct EmailAuthMsg", + "name": "emailAuthMsg", + "type": "tuple", + "components": [ + { + "internalType": "uint256", + "name": "templateId", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "commandParams", + "type": "bytes[]" + }, + { + "internalType": "uint256", + "name": "skippedCommandPrefix", + "type": "uint256" + }, + { + "internalType": "struct EmailProof", + "name": "proof", + "type": "tuple", + "components": [ + { + "internalType": "string", + "name": "domainName", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "publicKeyHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "string", + "name": "maskedCommand", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "emailNullifier", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "accountSalt", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "isCodeExist", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ] + } + ] + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "templateIdx", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "emitEmailCommand" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "verifier", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "verifierAddr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "commandTemplates()": { + "returns": { + "_0": "string[][] A two-dimensional array of strings, where each inner array represents a set of fixed strings and matchers for a command template." + } + }, + "computeEmailAuthAddress(address,bytes32)": { + "details": "This function utilizes the `Create2` library to compute the address. The computation uses a provided account address to be recovered, account salt, and the hash of the encoded ERC1967Proxy creation code concatenated with the encoded email auth contract implementation address and the initialization call data. This ensures that the computed address is deterministic and unique per account salt.", + "params": { + "accountSalt": "A bytes32 salt value defined as a hash of the guardian's email address and an account code. This is assumed to be unique to a pair of the guardian's email address and the wallet address to be recovered.", + "owner": "The address of the owner of the EmailAuth proxy." + }, + "returns": { + "_0": "address The computed address." + } + }, + "computeTemplateId(uint256)": { + "details": "Encodes the email account recovery version ID, \"EXAMPLE\", and the template index, then uses keccak256 to hash these values into a uint ID.", + "params": { + "templateIdx": "The index of the command template." + }, + "returns": { + "_0": "uint The computed uint ID." + } + }, + "dkim()": { + "details": "This function is virtual and can be overridden by inheriting contracts.", + "returns": { + "_0": "address The address of the DKIM contract." + } + }, + "emailAuthImplementation()": { + "details": "This function is virtual and can be overridden by inheriting contracts.", + "returns": { + "_0": "address The address of the email authentication contract implementation." + } + }, + "verifier()": { + "details": "This function is virtual and can be overridden by inheriting contracts.", + "returns": { + "_0": "address The address of the verifier contract." + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "commandTemplates()": { + "notice": "Returns a two-dimensional array of strings representing the command templates." + }, + "computeEmailAuthAddress(address,bytes32)": { + "notice": "Computes the address for email auth contract using the CREATE2 opcode." + }, + "computeTemplateId(uint256)": { + "notice": "Calculates a unique command template ID for template provided by this contract." + }, + "dkim()": { + "notice": "Returns the address of the DKIM contract." + }, + "emailAuthImplementation()": { + "notice": "Returns the address of the email auth contract implementation." + }, + "emitEmailCommand((uint256,bytes[],uint256,(string,bytes32,uint256,string,bytes32,bytes32,bool,bytes)),address,uint256)": { + "notice": "Emits an event for the command in the given email." + }, + "verifier()": { + "notice": "Returns the address of the verifier contract." + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@matterlabs/=node_modules/@matterlabs/", + "@openzeppelin/=node_modules/@openzeppelin/", + "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", + "@uniswap/=node_modules/@uniswap/", + "@zk-email/=node_modules/@zk-email/", + "accountabstraction/=node_modules/accountabstraction/", + "ds-test/=node_modules/ds-test/src/", + "forge-std/=node_modules/forge-std/src/", + "solady/=node_modules/solady/src/" + ], + "optimizer": { + "enabled": true, + "runs": 20000 + }, + "metadata": { + "bytecodeHash": "ipfs" + }, + "compilationTarget": { + "src/EmitEmailCommand.sol": "EmitEmailCommand" + }, + "evmVersion": "paris", + "libraries": {} + }, + "sources": { + "node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "keccak256": "0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a", + "urls": [ + "bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6", + "dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "keccak256": "0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b", + "urls": [ + "bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609", + "dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "keccak256": "0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397", + "urls": [ + "bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9", + "dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/access/Ownable.sol": { + "keccak256": "0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb", + "urls": [ + "bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6", + "dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol": { + "keccak256": "0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c", + "urls": [ + "bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9", + "dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol": { + "keccak256": "0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7", + "urls": [ + "bzz-raw://ea290300e0efc4d901244949dc4d877fd46e6c5e43dc2b26620e8efab3ab803f", + "dweb:/ipfs/QmcLLJppxKeJWqHxE2CUkcfhuRTgHSn8J4kijcLa5MYhSt" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": { + "keccak256": "0xbfb6695731de677140fbf76c772ab08c4233a122fb51ac28ac120fc49bbbc4ec", + "urls": [ + "bzz-raw://68f8fded7cc318efa15874b7c6a983fe17a4a955d72d240353a9a4ca1e1b824c", + "dweb:/ipfs/QmdcmBL9Qo4Tk3Dby4wFYabGyot9JNeLPxpSXZUgUm92BV" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol": { + "keccak256": "0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65", + "urls": [ + "bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a", + "dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/proxy/Proxy.sol": { + "keccak256": "0xc3f2ec76a3de8ed7a7007c46166f5550c72c7709e3fc7e8bb3111a7191cdedbd", + "urls": [ + "bzz-raw://e73efb4c2ca655882dc237c6b4f234a9bd36d97159d8fcaa837eb01171f726ac", + "dweb:/ipfs/QmTNnnv7Gu5fs5G1ZMh7Fexp8N4XUs3XrNAngjcxgiss3e" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol": { + "keccak256": "0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c", + "urls": [ + "bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa", + "dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol": { + "keccak256": "0x3ffb56bcb175984a10b1167e2eba560876bfe96a435f5d62ffed8b1bb4ebc4c7", + "urls": [ + "bzz-raw://7db94af56aa20efb57c3f9003eacd884faad04118967d8e35cdffe07790bbdcd", + "dweb:/ipfs/QmXtAshRWFjcQ1kL7gpC5CiLUZgJ9uzrZyeHp2Sux9ojPF" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "keccak256": "0xc3e1fa9d1987f8d349dfb4d6fe93bf2ca014b52ba335cfac30bfe71e357e6f80", + "urls": [ + "bzz-raw://c5703ccdeb7b1d685e375ed719117e9edf2ab4bc544f24f23b0d50ec82257229", + "dweb:/ipfs/QmTdwkbQq7owpCiyuzE7eh5LrD2ddrBCZ5WHVsWPi1RrTS" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70", + "urls": [ + "bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c", + "dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "keccak256": "0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2", + "urls": [ + "bzz-raw://0ad7c8d4d08938c8dfc43d75a148863fb324b80cf53e0a36f7e5a4ac29008850", + "dweb:/ipfs/QmcrhfPgVNf5mkdhQvy1pMv51TFokD3Y4Wa5WZhFqVh8UV" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2", + "urls": [ + "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12", + "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/utils/Create2.sol": { + "keccak256": "0x2b9807d194b92f1068d868e9587d27037264a9a067c778486f86ae21c61cbd5e", + "urls": [ + "bzz-raw://22d71f40aa38a20cf466d8647452a6e3f746353474f8c8af40f03aa8cae38420", + "dweb:/ipfs/QmQ752Hz5av7YDK8pFojzb5qgeXQvfsdkdwkHVzaXoYAZR" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": { + "keccak256": "0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418", + "urls": [ + "bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c", + "dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/utils/Strings.sol": { + "keccak256": "0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792", + "urls": [ + "bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453", + "dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/utils/math/Math.sol": { + "keccak256": "0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d", + "urls": [ + "bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875", + "dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L" + ], + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "keccak256": "0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72", + "urls": [ + "bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc", + "dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT" + ], + "license": "MIT" + }, + "node_modules/@zk-email/contracts/DKIMRegistry.sol": { + "keccak256": "0x7dc85d2f80b81b60fab94575a0769f3ce6300bf4e8a2e5dddcd2a8c2aa9a6983", + "urls": [ + "bzz-raw://7fff6d3157e54d256ca746845297e71b121e20959ca1932e95fc30def82bc809", + "dweb:/ipfs/QmYvXA2dhqAXVqbC9mxnjFXBgNLqC1KKfdnDs1YSEqiKn3" + ], + "license": "MIT" + }, + "node_modules/@zk-email/contracts/interfaces/IDKIMRegistry.sol": { + "keccak256": "0x85ee536632227f79e208f364bb0fa8fdf6c046baa048e158d0817b8d1fce615d", + "urls": [ + "bzz-raw://4a64d541d2d914ce7e6a13605fbdfb64abfa43dc9f7e2e1865948e2e0ed0f4b6", + "dweb:/ipfs/Qmc1yJHdkXMdR2nbkFhgCruuYnA76zV6784qbiFaN7xU5V" + ], + "license": "MIT" + }, + "node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol": { + "keccak256": "0x602fbb2c2639092b4730b2ab0c414358126695284014bb805777fbd12c8ceb92", + "urls": [ + "bzz-raw://602cb58ce5c0eb3a76bf75ec403b851c13318e5646cff56422839257d6ae4125", + "dweb:/ipfs/QmVUCjPuUpx9auD7eNzXVNsFaifW9e9n2uBYzJqWwWHqum" + ], + "license": "MIT" + }, + "node_modules/@zk-email/ether-email-auth-contracts/src/interfaces/IGroth16Verifier.sol": { + "keccak256": "0x3c3405cf20adfb69d760b204d1570c328f93b64f2caaf5e54f4a0ced6d2e2fcc", + "urls": [ + "bzz-raw://1a82f3d9a2a0cec1ef294758f555004bab93792213fe313ecf4542c36501c5c1", + "dweb:/ipfs/QmcNnmvzMBaezF9CpDueah69UvxQNhBLw6S3aoGoVm9tLg" + ], + "license": "MIT" + }, + "node_modules/@zk-email/ether-email-auth-contracts/src/libraries/CommandUtils.sol": { + "keccak256": "0xe5a54b706f91c1e02f408260f6f7c0dbe18697a3eb71394037813816a5bb7cd6", + "urls": [ + "bzz-raw://12dcc386468bf001a99b38618af06ec993ccb11c8621731481d92f8934c8ebf3", + "dweb:/ipfs/QmQCddXesydvzPkr1QDMbKPbS6JBHqSe34RncTARP3ByRz" + ], + "license": "MIT" + }, + "node_modules/@zk-email/ether-email-auth-contracts/src/libraries/DecimalUtils.sol": { + "keccak256": "0x80b98721a7070856b3f000e61a54317ff441564ba5967c8a255c04a450747201", + "urls": [ + "bzz-raw://830b971ed21fd3ac7c944afda51db3401658f9788d6e8eb2e49d849edf0c3467", + "dweb:/ipfs/QmQn1xgS48uTT4k8xCLeQ2oRm9CSDdkAkg11Q2FV6KppMU" + ], + "license": "MIT" + }, + "node_modules/@zk-email/ether-email-auth-contracts/src/utils/Verifier.sol": { + "keccak256": "0xd93cd575c0ffaf3ae142a6450a0c295db4d21033a66ba77667193366b88e0b02", + "urls": [ + "bzz-raw://b353b8d8a3ab7fdffd35a3c19216353960b13309da18842d79dc8d53ba9b3a23", + "dweb:/ipfs/QmauaENbuVPZ7CRcfJkiKLPr8f5ecwAVDgNFjvL7eV5jyH" + ], + "license": "MIT" + }, + "src/EmitEmailCommand.sol": { + "keccak256": "0xf35d0d2444d734afa6d097776b35105714dce6b7f1d14c5999ae6d73201e1005", + "urls": [ + "bzz-raw://b8ef348ff2b3d9b757cacd3311d985b278713629e0eb9e299997b7685f952af6", + "dweb:/ipfs/Qme8wZ7QJV6LDEuVxDkcQpNA4TX5Ms7ri6YRAfuaNnZ8xy" + ], + "license": "MIT" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 6090, + "contract": "src/EmitEmailCommand.sol:EmitEmailCommand", + "label": "verifierAddr", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 6092, + "contract": "src/EmitEmailCommand.sol:EmitEmailCommand", + "label": "dkimAddr", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 6094, + "contract": "src/EmitEmailCommand.sol:EmitEmailCommand", + "label": "emailAuthImplementationAddr", + "offset": 0, + "slot": "2", + "type": "t_address" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + } + } + }, + "ast": { + "absolutePath": "src/EmitEmailCommand.sol", + "id": 6705, + "exportedSymbols": { + "CommandUtils": [ + 5427 + ], + "Create2": [ + 2347 + ], + "ERC1967Proxy": [ + 827 + ], + "EmailAuth": [ + 4801 + ], + "EmailAuthMsg": [ + 4086 + ], + "EmailProof": [ + 5684 + ], + "EmitEmailCommand": [ + 6704 + ], + "IDKIMRegistry": [ + 4054 + ], + "OwnableUpgradeable": [ + 194 + ], + "Strings": [ + 2712 + ], + "UUPSUpgradeable": [ + 1342 + ], + "Verifier": [ + 6081 + ] + }, + "nodeType": "SourceUnit", + "src": "32:8610:28", + "nodes": [ + { + "id": 6083, + "nodeType": "PragmaDirective", + "src": "32:24:28", + "nodes": [], + "literals": [ + "solidity", + "^", + "0.8", + ".12" + ] + }, + { + "id": 6084, + "nodeType": "ImportDirective", + "src": "58:64:28", + "nodes": [], + "absolutePath": "node_modules/@zk-email/ether-email-auth-contracts/src/EmailAuth.sol", + "file": "@zk-email/ether-email-auth-contracts/src/EmailAuth.sol", + "nameLocation": "-1:-1:-1", + "scope": 6705, + "sourceUnit": 4802, + "symbolAliases": [], + "unitAlias": "" + }, + { + "id": 6085, + "nodeType": "ImportDirective", + "src": "123:51:28", + "nodes": [], + "absolutePath": "node_modules/@openzeppelin/contracts/utils/Create2.sol", + "file": "@openzeppelin/contracts/utils/Create2.sol", + "nameLocation": "-1:-1:-1", + "scope": 6705, + "sourceUnit": 2348, + "symbolAliases": [], + "unitAlias": "" + }, + { + "id": 6087, + "nodeType": "ImportDirective", + "src": "175:84:28", + "nodes": [], + "absolutePath": "node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol", + "file": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol", + "nameLocation": "-1:-1:-1", + "scope": 6705, + "sourceUnit": 828, + "symbolAliases": [ + { + "foreign": { + "id": 6086, + "name": "ERC1967Proxy", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 827, + "src": "183:12:28", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "id": 6704, + "nodeType": "ContractDefinition", + "src": "345:8296:28", + "nodes": [ + { + "id": 6090, + "nodeType": "VariableDeclaration", + "src": "377:27:28", + "nodes": [], + "constant": false, + "functionSelector": "663ea2e2", + "mutability": "mutable", + "name": "verifierAddr", + "nameLocation": "392:12:28", + "scope": 6704, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6089, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "377:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "public" + }, + { + "id": 6092, + "nodeType": "VariableDeclaration", + "src": "410:23:28", + "nodes": [], + "constant": false, + "functionSelector": "73357f85", + "mutability": "mutable", + "name": "dkimAddr", + "nameLocation": "425:8:28", + "scope": 6704, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6091, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "410:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "public" + }, + { + "id": 6094, + "nodeType": "VariableDeclaration", + "src": "439:42:28", + "nodes": [], + "constant": false, + "functionSelector": "1098e02e", + "mutability": "mutable", + "name": "emailAuthImplementationAddr", + "nameLocation": "454:27:28", + "scope": 6704, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6093, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "439:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "public" + }, + { + "id": 6100, + "nodeType": "EventDefinition", + "src": "488:75:28", + "nodes": [], + "anonymous": false, + "eventSelector": "645126e6978c1c365d84853d6b5fde98c36802fdbf41bba8d1a8ee915c9ea692", + "name": "StringCommand", + "nameLocation": "494:13:28", + "parameters": { + "id": 6099, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6096, + "indexed": true, + "mutability": "mutable", + "name": "emailAuthAddr", + "nameLocation": "524:13:28", + "nodeType": "VariableDeclaration", + "scope": 6100, + "src": "508:29:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6095, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "508:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6098, + "indexed": true, + "mutability": "mutable", + "name": "command", + "nameLocation": "554:7:28", + "nodeType": "VariableDeclaration", + "scope": 6100, + "src": "539:22:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6097, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "539:6:28", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "507:55:28" + } + }, + { + "id": 6106, + "nodeType": "EventDefinition", + "src": "568:71:28", + "nodes": [], + "anonymous": false, + "eventSelector": "a5c3e1e5fe35e2cf53bcd2d9788d8c914a2c0009059c57a4f81867ef891f953a", + "name": "UintCommand", + "nameLocation": "574:11:28", + "parameters": { + "id": 6105, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6102, + "indexed": true, + "mutability": "mutable", + "name": "emailAuthAddr", + "nameLocation": "602:13:28", + "nodeType": "VariableDeclaration", + "scope": 6106, + "src": "586:29:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6101, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "586:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6104, + "indexed": true, + "mutability": "mutable", + "name": "command", + "nameLocation": "630:7:28", + "nodeType": "VariableDeclaration", + "scope": 6106, + "src": "617:20:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6103, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "617:4:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "585:53:28" + } + }, + { + "id": 6112, + "nodeType": "EventDefinition", + "src": "644:69:28", + "nodes": [], + "anonymous": false, + "eventSelector": "c3ff6c3d86b9cdcc412d73eebae668f46939e7200f0a8b85a9d1b193cb78d9a6", + "name": "IntCommand", + "nameLocation": "650:10:28", + "parameters": { + "id": 6111, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6108, + "indexed": true, + "mutability": "mutable", + "name": "emailAuthAddr", + "nameLocation": "677:13:28", + "nodeType": "VariableDeclaration", + "scope": 6112, + "src": "661:29:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6107, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "661:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6110, + "indexed": true, + "mutability": "mutable", + "name": "command", + "nameLocation": "704:7:28", + "nodeType": "VariableDeclaration", + "scope": 6112, + "src": "692:19:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 6109, + "name": "int", + "nodeType": "ElementaryTypeName", + "src": "692:3:28", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "660:52:28" + } + }, + { + "id": 6118, + "nodeType": "EventDefinition", + "src": "718:75:28", + "nodes": [], + "anonymous": false, + "eventSelector": "d3a48525d8c5ab22221baba6d473309d152050b2bbc71145e26a192ef216e8d1", + "name": "DecimalsCommand", + "nameLocation": "724:15:28", + "parameters": { + "id": 6117, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6114, + "indexed": true, + "mutability": "mutable", + "name": "emailAuthAddr", + "nameLocation": "756:13:28", + "nodeType": "VariableDeclaration", + "scope": 6118, + "src": "740:29:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6113, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "740:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6116, + "indexed": true, + "mutability": "mutable", + "name": "command", + "nameLocation": "784:7:28", + "nodeType": "VariableDeclaration", + "scope": 6118, + "src": "771:20:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6115, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "771:4:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "739:53:28" + } + }, + { + "id": 6124, + "nodeType": "EventDefinition", + "src": "798:99:28", + "nodes": [], + "anonymous": false, + "eventSelector": "1fa54e548d12ab4ab1876c405749e0ef462160262aaa4df2bfd4f4fe9fc7693b", + "name": "EthAddrCommand", + "nameLocation": "804:14:28", + "parameters": { + "id": 6123, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6120, + "indexed": true, + "mutability": "mutable", + "name": "emailAuthAddr", + "nameLocation": "844:13:28", + "nodeType": "VariableDeclaration", + "scope": 6124, + "src": "828:29:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6119, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "828:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6122, + "indexed": true, + "mutability": "mutable", + "name": "command", + "nameLocation": "883:7:28", + "nodeType": "VariableDeclaration", + "scope": 6124, + "src": "867:23:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6121, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "867:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "818:78:28" + } + }, + { + "id": 6133, + "nodeType": "FunctionDefinition", + "src": "1112:94:28", + "nodes": [], + "body": { + "id": 6132, + "nodeType": "Block", + "src": "1170:36:28", + "nodes": [], + "statements": [ + { + "expression": { + "id": 6130, + "name": "verifierAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6090, + "src": "1187:12:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 6129, + "id": 6131, + "nodeType": "Return", + "src": "1180:19:28" + } + ] + }, + "documentation": { + "id": 6125, + "nodeType": "StructuredDocumentation", + "src": "903:204:28", + "text": "@notice Returns the address of the verifier contract.\n @dev This function is virtual and can be overridden by inheriting contracts.\n @return address The address of the verifier contract." + }, + "functionSelector": "2b7ac3f3", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "verifier", + "nameLocation": "1121:8:28", + "parameters": { + "id": 6126, + "nodeType": "ParameterList", + "parameters": [], + "src": "1129:2:28" + }, + "returnParameters": { + "id": 6129, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6128, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6133, + "src": "1161:7:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6127, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1161:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1160:9:28" + }, + "scope": 6704, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 6142, + "nodeType": "FunctionDefinition", + "src": "1413:86:28", + "nodes": [], + "body": { + "id": 6141, + "nodeType": "Block", + "src": "1467:32:28", + "nodes": [], + "statements": [ + { + "expression": { + "id": 6139, + "name": "dkimAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6092, + "src": "1484:8:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 6138, + "id": 6140, + "nodeType": "Return", + "src": "1477:15:28" + } + ] + }, + "documentation": { + "id": 6134, + "nodeType": "StructuredDocumentation", + "src": "1212:196:28", + "text": "@notice Returns the address of the DKIM contract.\n @dev This function is virtual and can be overridden by inheriting contracts.\n @return address The address of the DKIM contract." + }, + "functionSelector": "400ad5ce", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "dkim", + "nameLocation": "1422:4:28", + "parameters": { + "id": 6135, + "nodeType": "ParameterList", + "parameters": [], + "src": "1426:2:28" + }, + "returnParameters": { + "id": 6138, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6137, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6142, + "src": "1458:7:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6136, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1458:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1457:9:28" + }, + "scope": 6704, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 6151, + "nodeType": "FunctionDefinition", + "src": "1758:124:28", + "nodes": [], + "body": { + "id": 6150, + "nodeType": "Block", + "src": "1831:51:28", + "nodes": [], + "statements": [ + { + "expression": { + "id": 6148, + "name": "emailAuthImplementationAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6094, + "src": "1848:27:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 6147, + "id": 6149, + "nodeType": "Return", + "src": "1841:34:28" + } + ] + }, + "documentation": { + "id": 6143, + "nodeType": "StructuredDocumentation", + "src": "1505:248:28", + "text": "@notice Returns the address of the email auth contract implementation.\n @dev This function is virtual and can be overridden by inheriting contracts.\n @return address The address of the email authentication contract implementation." + }, + "functionSelector": "b6201692", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "emailAuthImplementation", + "nameLocation": "1767:23:28", + "parameters": { + "id": 6144, + "nodeType": "ParameterList", + "parameters": [], + "src": "1790:2:28" + }, + "returnParameters": { + "id": 6147, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6146, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6151, + "src": "1822:7:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6145, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1822:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1821:9:28" + }, + "scope": 6704, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 6193, + "nodeType": "FunctionDefinition", + "src": "2745:698:28", + "nodes": [], + "body": { + "id": 6192, + "nodeType": "Block", + "src": "2866:577:28", + "nodes": [], + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 6163, + "name": "accountSalt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6156, + "src": "2935:11:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 6168, + "name": "ERC1967Proxy", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 827, + "src": "3042:12:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ERC1967Proxy_$827_$", + "typeString": "type(contract ERC1967Proxy)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_contract$_ERC1967Proxy_$827_$", + "typeString": "type(contract ERC1967Proxy)" + } + ], + "id": 6167, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "3037:4:28", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 6169, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3037:18:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_contract$_ERC1967Proxy_$827", + "typeString": "type(contract ERC1967Proxy)" + } + }, + "id": 6170, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3056:12:28", + "memberName": "creationCode", + "nodeType": "MemberAccess", + "src": "3037:31:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 6173, + "name": "emailAuthImplementation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6151, + "src": "3134:23:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", + "typeString": "function () view returns (address)" + } + }, + "id": 6174, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3134:25:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "expression": { + "id": 6177, + "name": "EmailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4801, + "src": "3237:9:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_EmailAuth_$4801_$", + "typeString": "type(contract EmailAuth)" + } + }, + "id": 6178, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3247:10:28", + "memberName": "initialize", + "nodeType": "MemberAccess", + "referencedDeclaration": 4201, + "src": "3237:20:28", + "typeDescriptions": { + "typeIdentifier": "t_function_declaration_nonpayable$_t_address_$_t_bytes32_$_t_address_$returns$__$", + "typeString": "function EmailAuth.initialize(address,bytes32,address)" + } + }, + { + "components": [ + { + "id": 6179, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6154, + "src": "3292:5:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6180, + "name": "accountSalt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6156, + "src": "3299:11:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "id": 6183, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "3320:4:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmitEmailCommand_$6704", + "typeString": "contract EmitEmailCommand" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_EmitEmailCommand_$6704", + "typeString": "contract EmitEmailCommand" + } + ], + "id": 6182, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3312:7:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 6181, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3312:7:28", + "typeDescriptions": {} + } + }, + "id": 6184, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3312:13:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 6185, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3291:35:28", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_bytes32_$_t_address_$", + "typeString": "tuple(address,bytes32,address)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_function_declaration_nonpayable$_t_address_$_t_bytes32_$_t_address_$returns$__$", + "typeString": "function EmailAuth.initialize(address,bytes32,address)" + }, + { + "typeIdentifier": "t_tuple$_t_address_$_t_bytes32_$_t_address_$", + "typeString": "tuple(address,bytes32,address)" + } + ], + "expression": { + "id": 6175, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "3189:3:28", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 6176, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3193:10:28", + "memberName": "encodeCall", + "nodeType": "MemberAccess", + "src": "3189:14:28", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 6186, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3189:167:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 6171, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "3094:3:28", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 6172, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3098:6:28", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "3094:10:28", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 6187, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3094:288:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 6165, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "2995:3:28", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 6166, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2999:12:28", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "2995:16:28", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 6188, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2995:409:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6164, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "2964:9:28", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 6189, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2964:458:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 6161, + "name": "Create2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2347, + "src": "2895:7:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Create2_$2347_$", + "typeString": "type(library Create2)" + } + }, + "id": 6162, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2903:14:28", + "memberName": "computeAddress", + "nodeType": "MemberAccess", + "referencedDeclaration": 2332, + "src": "2895:22:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_address_$", + "typeString": "function (bytes32,bytes32) view returns (address)" + } + }, + "id": 6190, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2895:541:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 6160, + "id": 6191, + "nodeType": "Return", + "src": "2876:560:28" + } + ] + }, + "documentation": { + "id": 6152, + "nodeType": "StructuredDocumentation", + "src": "1888:852:28", + "text": "@notice Computes the address for email auth contract using the CREATE2 opcode.\n @dev This function utilizes the `Create2` library to compute the address. The computation uses a provided account address to be recovered, account salt,\n and the hash of the encoded ERC1967Proxy creation code concatenated with the encoded email auth contract implementation\n address and the initialization call data. This ensures that the computed address is deterministic and unique per account salt.\n @param owner The address of the owner of the EmailAuth proxy.\n @param accountSalt A bytes32 salt value defined as a hash of the guardian's email address and an account code. This is assumed to be unique to a pair of the guardian's email address and the wallet address to be recovered.\n @return address The computed address." + }, + "functionSelector": "3a8eab14", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "computeEmailAuthAddress", + "nameLocation": "2754:23:28", + "parameters": { + "id": 6157, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6154, + "mutability": "mutable", + "name": "owner", + "nameLocation": "2795:5:28", + "nodeType": "VariableDeclaration", + "scope": 6193, + "src": "2787:13:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6153, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2787:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6156, + "mutability": "mutable", + "name": "accountSalt", + "nameLocation": "2818:11:28", + "nodeType": "VariableDeclaration", + "scope": 6193, + "src": "2810:19:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 6155, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2810:7:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2777:58:28" + }, + "returnParameters": { + "id": 6160, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6159, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6193, + "src": "2857:7:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6158, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2857:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2856:9:28" + }, + "scope": 6704, + "stateMutability": "view", + "virtual": false, + "visibility": "public" + }, + { + "id": 6233, + "nodeType": "FunctionDefinition", + "src": "3892:401:28", + "nodes": [], + "body": { + "id": 6232, + "nodeType": "Block", + "src": "4007:286:28", + "nodes": [], + "statements": [ + { + "assignments": [ + 6205 + ], + "declarations": [ + { + "constant": false, + "id": 6205, + "mutability": "mutable", + "name": "proxy", + "nameLocation": "4030:5:28", + "nodeType": "VariableDeclaration", + "scope": 6232, + "src": "4017:18:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC1967Proxy_$827", + "typeString": "contract ERC1967Proxy" + }, + "typeName": { + "id": 6204, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 6203, + "name": "ERC1967Proxy", + "nameLocations": [ + "4017:12:28" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 827, + "src": "4017:12:28" + }, + "referencedDeclaration": 827, + "src": "4017:12:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC1967Proxy_$827", + "typeString": "contract ERC1967Proxy" + } + }, + "visibility": "internal" + } + ], + "id": 6226, + "initialValue": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 6211, + "name": "emailAuthImplementation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6151, + "src": "4087:23:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", + "typeString": "function () view returns (address)" + } + }, + "id": 6212, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4087:25:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "expression": { + "id": 6215, + "name": "EmailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4801, + "src": "4158:9:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_EmailAuth_$4801_$", + "typeString": "type(contract EmailAuth)" + } + }, + "id": 6216, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4168:10:28", + "memberName": "initialize", + "nodeType": "MemberAccess", + "referencedDeclaration": 4201, + "src": "4158:20:28", + "typeDescriptions": { + "typeIdentifier": "t_function_declaration_nonpayable$_t_address_$_t_bytes32_$_t_address_$returns$__$", + "typeString": "function EmailAuth.initialize(address,bytes32,address)" + } + }, + { + "components": [ + { + "id": 6217, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6196, + "src": "4197:5:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6218, + "name": "accountSalt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6198, + "src": "4204:11:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "id": 6221, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "4225:4:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmitEmailCommand_$6704", + "typeString": "contract EmitEmailCommand" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_EmitEmailCommand_$6704", + "typeString": "contract EmitEmailCommand" + } + ], + "id": 6220, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4217:7:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 6219, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4217:7:28", + "typeDescriptions": {} + } + }, + "id": 6222, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4217:13:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 6223, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "4196:35:28", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_bytes32_$_t_address_$", + "typeString": "tuple(address,bytes32,address)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_function_declaration_nonpayable$_t_address_$_t_bytes32_$_t_address_$returns$__$", + "typeString": "function EmailAuth.initialize(address,bytes32,address)" + }, + { + "typeIdentifier": "t_tuple$_t_address_$_t_bytes32_$_t_address_$", + "typeString": "tuple(address,bytes32,address)" + } + ], + "expression": { + "id": 6213, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "4126:3:28", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 6214, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4130:10:28", + "memberName": "encodeCall", + "nodeType": "MemberAccess", + "src": "4126:14:28", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 6224, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4126:119:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6208, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "4038:16:28", + "typeDescriptions": { + "typeIdentifier": "t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$827_$", + "typeString": "function (address,bytes memory) payable returns (contract ERC1967Proxy)" + }, + "typeName": { + "id": 6207, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 6206, + "name": "ERC1967Proxy", + "nameLocations": [ + "4042:12:28" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 827, + "src": "4042:12:28" + }, + "referencedDeclaration": 827, + "src": "4042:12:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC1967Proxy_$827", + "typeString": "contract ERC1967Proxy" + } + } + }, + "id": 6210, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "names": [ + "salt" + ], + "nodeType": "FunctionCallOptions", + "options": [ + { + "id": 6209, + "name": "accountSalt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6198, + "src": "4061:11:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "src": "4038:35:28", + "typeDescriptions": { + "typeIdentifier": "t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$827_$salt", + "typeString": "function (address,bytes memory) payable returns (contract ERC1967Proxy)" + } + }, + "id": 6225, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4038:217:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC1967Proxy_$827", + "typeString": "contract ERC1967Proxy" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4017:238:28" + }, + { + "expression": { + "arguments": [ + { + "id": 6229, + "name": "proxy", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6205, + "src": "4280:5:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC1967Proxy_$827", + "typeString": "contract ERC1967Proxy" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ERC1967Proxy_$827", + "typeString": "contract ERC1967Proxy" + } + ], + "id": 6228, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4272:7:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 6227, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4272:7:28", + "typeDescriptions": {} + } + }, + "id": 6230, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4272:14:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 6202, + "id": 6231, + "nodeType": "Return", + "src": "4265:21:28" + } + ] + }, + "documentation": { + "id": 6194, + "nodeType": "StructuredDocumentation", + "src": "3449:438:28", + "text": "@notice Deploys a new proxy contract for email authentication.\n @dev This function uses the CREATE2 opcode to deploy a new ERC1967Proxy contract with a deterministic address.\n @param owner The address of the owner of the EmailAuth proxy.\n @param accountSalt A bytes32 salt value used to ensure the uniqueness of the deployed proxy address.\n @return address The address of the newly deployed proxy contract." + }, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "deployEmailAuthProxy", + "nameLocation": "3901:20:28", + "parameters": { + "id": 6199, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6196, + "mutability": "mutable", + "name": "owner", + "nameLocation": "3939:5:28", + "nodeType": "VariableDeclaration", + "scope": 6233, + "src": "3931:13:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6195, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3931:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6198, + "mutability": "mutable", + "name": "accountSalt", + "nameLocation": "3962:11:28", + "nodeType": "VariableDeclaration", + "scope": 6233, + "src": "3954:19:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 6197, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3954:7:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3921:58:28" + }, + "returnParameters": { + "id": 6202, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6201, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6233, + "src": "3998:7:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6200, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3998:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3997:9:28" + }, + "scope": 6704, + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "id": 6253, + "nodeType": "FunctionDefinition", + "src": "4660:150:28", + "nodes": [], + "body": { + "id": 6252, + "nodeType": "Block", + "src": "4732:78:28", + "nodes": [], + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "hexValue": "4558414d504c45", + "id": 6246, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4778:9:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_4231677ad7f58f2a1415feed71ebef31eb10d6258e6144550b17860465ef4848", + "typeString": "literal_string \"EXAMPLE\"" + }, + "value": "EXAMPLE" + }, + { + "id": 6247, + "name": "templateIdx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6236, + "src": "4789:11:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_4231677ad7f58f2a1415feed71ebef31eb10d6258e6144550b17860465ef4848", + "typeString": "literal_string \"EXAMPLE\"" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 6244, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "4767:3:28", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 6245, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4771:6:28", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "4767:10:28", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 6248, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4767:34:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6243, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "4757:9:28", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 6249, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4757:45:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 6242, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4749:7:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 6241, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4749:7:28", + "typeDescriptions": {} + } + }, + "id": 6250, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4749:54:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 6240, + "id": 6251, + "nodeType": "Return", + "src": "4742:61:28" + } + ] + }, + "documentation": { + "id": 6234, + "nodeType": "StructuredDocumentation", + "src": "4299:356:28", + "text": "@notice Calculates a unique command template ID for template provided by this contract.\n @dev Encodes the email account recovery version ID, \"EXAMPLE\", and the template index,\n then uses keccak256 to hash these values into a uint ID.\n @param templateIdx The index of the command template.\n @return uint The computed uint ID." + }, + "functionSelector": "db4f06d6", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "computeTemplateId", + "nameLocation": "4669:17:28", + "parameters": { + "id": 6237, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6236, + "mutability": "mutable", + "name": "templateIdx", + "nameLocation": "4692:11:28", + "nodeType": "VariableDeclaration", + "scope": 6253, + "src": "4687:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6235, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "4687:4:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4686:18:28" + }, + "returnParameters": { + "id": 6240, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6239, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6253, + "src": "4726:4:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6238, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "4726:4:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4725:6:28" + }, + "scope": 6704, + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + }, + { + "id": 6415, + "nodeType": "FunctionDefinition", + "src": "5068:778:28", + "nodes": [], + "body": { + "id": 6414, + "nodeType": "Block", + "src": "5136:710:28", + "nodes": [], + "statements": [ + { + "assignments": [ + 6266 + ], + "declarations": [ + { + "constant": false, + "id": 6266, + "mutability": "mutable", + "name": "templates", + "nameLocation": "5164:9:28", + "nodeType": "VariableDeclaration", + "scope": 6414, + "src": "5146:27:28", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string[][]" + }, + "typeName": { + "baseType": { + "baseType": { + "id": 6263, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5146:6:28", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "id": 6264, + "nodeType": "ArrayTypeName", + "src": "5146:8:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_storage_$dyn_storage_ptr", + "typeString": "string[]" + } + }, + "id": 6265, + "nodeType": "ArrayTypeName", + "src": "5146:10:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_storage_$dyn_storage_$dyn_storage_ptr", + "typeString": "string[][]" + } + }, + "visibility": "internal" + } + ], + "id": 6273, + "initialValue": { + "arguments": [ + { + "hexValue": "32", + "id": 6271, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5191:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + } + ], + "id": 6270, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "5176:14:28", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr_$", + "typeString": "function (uint256) pure returns (string memory[] memory[] memory)" + }, + "typeName": { + "baseType": { + "baseType": { + "id": 6267, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5180:6:28", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "id": 6268, + "nodeType": "ArrayTypeName", + "src": "5180:8:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_storage_$dyn_storage_ptr", + "typeString": "string[]" + } + }, + "id": 6269, + "nodeType": "ArrayTypeName", + "src": "5180:10:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_storage_$dyn_storage_$dyn_storage_ptr", + "typeString": "string[][]" + } + } + }, + "id": 6272, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5176:17:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5146:47:28" + }, + { + "expression": { + "id": 6282, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 6274, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5203:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6276, + "indexExpression": { + "hexValue": "30", + "id": 6275, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5213:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5203:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "hexValue": "35", + "id": 6280, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5231:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_5_by_1", + "typeString": "int_const 5" + }, + "value": "5" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_5_by_1", + "typeString": "int_const 5" + } + ], + "id": 6279, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "5218:12:28", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$", + "typeString": "function (uint256) pure returns (string memory[] memory)" + }, + "typeName": { + "baseType": { + "id": 6277, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5222:6:28", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "id": 6278, + "nodeType": "ArrayTypeName", + "src": "5222:8:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_storage_$dyn_storage_ptr", + "typeString": "string[]" + } + } + }, + "id": 6281, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5218:15:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "src": "5203:30:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6283, + "nodeType": "ExpressionStatement", + "src": "5203:30:28" + }, + { + "expression": { + "id": 6290, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6284, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5243:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6287, + "indexExpression": { + "hexValue": "30", + "id": 6285, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5253:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5243:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6288, + "indexExpression": { + "hexValue": "30", + "id": 6286, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5256:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5243:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "456d6974", + "id": 6289, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5261:6:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7f7b4020ae177c99f18061953163baf076df909f90be2fc0e7d95662add5f91e", + "typeString": "literal_string \"Emit\"" + }, + "value": "Emit" + }, + "src": "5243:24:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6291, + "nodeType": "ExpressionStatement", + "src": "5243:24:28" + }, + { + "expression": { + "id": 6298, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6292, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5277:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6295, + "indexExpression": { + "hexValue": "30", + "id": 6293, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5287:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5277:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6296, + "indexExpression": { + "hexValue": "31", + "id": 6294, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5290:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5277:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "737472696e67", + "id": 6297, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5295:8:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_97fc46276c172633607a331542609db1e3da793fca183d594ed5a61803a10792", + "typeString": "literal_string \"string\"" + }, + "value": "string" + }, + "src": "5277:26:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6299, + "nodeType": "ExpressionStatement", + "src": "5277:26:28" + }, + { + "expression": { + "id": 6306, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6300, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5313:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6303, + "indexExpression": { + "hexValue": "30", + "id": 6301, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5323:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5313:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6304, + "indexExpression": { + "hexValue": "32", + "id": 6302, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5326:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5313:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "7b737472696e677d", + "id": 6305, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5331:10:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_b0dd9c5dfd6b1348089539c8cd8146a59f1fd23ff2de9c6052e54da8d2a6c0fb", + "typeString": "literal_string \"{string}\"" + }, + "value": "{string}" + }, + "src": "5313:28:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6307, + "nodeType": "ExpressionStatement", + "src": "5313:28:28" + }, + { + "expression": { + "id": 6314, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6308, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5352:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6311, + "indexExpression": { + "hexValue": "31", + "id": 6309, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5362:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5352:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6312, + "indexExpression": { + "hexValue": "30", + "id": 6310, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5365:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5352:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "456d6974", + "id": 6313, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5370:6:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7f7b4020ae177c99f18061953163baf076df909f90be2fc0e7d95662add5f91e", + "typeString": "literal_string \"Emit\"" + }, + "value": "Emit" + }, + "src": "5352:24:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6315, + "nodeType": "ExpressionStatement", + "src": "5352:24:28" + }, + { + "expression": { + "id": 6322, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6316, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5386:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6319, + "indexExpression": { + "hexValue": "31", + "id": 6317, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5396:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5386:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6320, + "indexExpression": { + "hexValue": "31", + "id": 6318, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5399:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5386:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "75696e74", + "id": 6321, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5404:6:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_78b9198c2298bca6916a2669592af279cda8160226cf57bc4580c40c0a8b1713", + "typeString": "literal_string \"uint\"" + }, + "value": "uint" + }, + "src": "5386:24:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6323, + "nodeType": "ExpressionStatement", + "src": "5386:24:28" + }, + { + "expression": { + "id": 6330, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6324, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5420:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6327, + "indexExpression": { + "hexValue": "31", + "id": 6325, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5430:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5420:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6328, + "indexExpression": { + "hexValue": "32", + "id": 6326, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5433:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5420:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "7b75696e747d", + "id": 6329, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5438:8:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_6f5ea6f405f661d5066b9e0ff07a25fd2e0d206057a7fc2dfef33ff65ad22a23", + "typeString": "literal_string \"{uint}\"" + }, + "value": "{uint}" + }, + "src": "5420:26:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6331, + "nodeType": "ExpressionStatement", + "src": "5420:26:28" + }, + { + "expression": { + "id": 6338, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6332, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5457:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6335, + "indexExpression": { + "hexValue": "32", + "id": 6333, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5467:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5457:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6336, + "indexExpression": { + "hexValue": "30", + "id": 6334, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5470:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5457:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "456d6974", + "id": 6337, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5475:6:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7f7b4020ae177c99f18061953163baf076df909f90be2fc0e7d95662add5f91e", + "typeString": "literal_string \"Emit\"" + }, + "value": "Emit" + }, + "src": "5457:24:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6339, + "nodeType": "ExpressionStatement", + "src": "5457:24:28" + }, + { + "expression": { + "id": 6346, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6340, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5491:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6343, + "indexExpression": { + "hexValue": "32", + "id": 6341, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5501:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5491:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6344, + "indexExpression": { + "hexValue": "31", + "id": 6342, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5504:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5491:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "696e74", + "id": 6345, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5509:5:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_92369a0158dcb3f6fc2aca50da098a31dad8f35ad392c261b13e991a688eeeb0", + "typeString": "literal_string \"int\"" + }, + "value": "int" + }, + "src": "5491:23:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6347, + "nodeType": "ExpressionStatement", + "src": "5491:23:28" + }, + { + "expression": { + "id": 6354, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6348, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5524:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6351, + "indexExpression": { + "hexValue": "32", + "id": 6349, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5534:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5524:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6352, + "indexExpression": { + "hexValue": "32", + "id": 6350, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5537:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5524:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "7b696e747d", + "id": 6353, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5542:7:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_96115c52281705004db3ca7f604112b6bc76ae505ed268b2dbee29feb8e7899d", + "typeString": "literal_string \"{int}\"" + }, + "value": "{int}" + }, + "src": "5524:25:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6355, + "nodeType": "ExpressionStatement", + "src": "5524:25:28" + }, + { + "expression": { + "id": 6362, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6356, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5560:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6359, + "indexExpression": { + "hexValue": "33", + "id": 6357, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5570:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5560:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6360, + "indexExpression": { + "hexValue": "30", + "id": 6358, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5573:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5560:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "456d6974", + "id": 6361, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5578:6:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7f7b4020ae177c99f18061953163baf076df909f90be2fc0e7d95662add5f91e", + "typeString": "literal_string \"Emit\"" + }, + "value": "Emit" + }, + "src": "5560:24:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6363, + "nodeType": "ExpressionStatement", + "src": "5560:24:28" + }, + { + "expression": { + "id": 6370, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6364, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5594:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6367, + "indexExpression": { + "hexValue": "33", + "id": 6365, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5604:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5594:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6368, + "indexExpression": { + "hexValue": "31", + "id": 6366, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5607:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5594:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "646563696d616c73", + "id": 6369, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5612:10:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_784c4fb1ab068f6039d5780c68dd0fa2f8742cceb3426d19667778ca7f3518a9", + "typeString": "literal_string \"decimals\"" + }, + "value": "decimals" + }, + "src": "5594:28:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6371, + "nodeType": "ExpressionStatement", + "src": "5594:28:28" + }, + { + "expression": { + "id": 6378, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6372, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5632:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6375, + "indexExpression": { + "hexValue": "33", + "id": 6373, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5642:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5632:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6376, + "indexExpression": { + "hexValue": "32", + "id": 6374, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5645:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5632:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "7b646563696d616c737d", + "id": 6377, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5650:12:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7ca1b14880be6b35dcad0ed1d80b88a8e55c4bb46b7cc562e423f1db809ffb15", + "typeString": "literal_string \"{decimals}\"" + }, + "value": "{decimals}" + }, + "src": "5632:30:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6379, + "nodeType": "ExpressionStatement", + "src": "5632:30:28" + }, + { + "expression": { + "id": 6386, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6380, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5673:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6383, + "indexExpression": { + "hexValue": "34", + "id": 6381, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5683:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5673:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6384, + "indexExpression": { + "hexValue": "30", + "id": 6382, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5686:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5673:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "456d6974", + "id": 6385, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5691:6:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7f7b4020ae177c99f18061953163baf076df909f90be2fc0e7d95662add5f91e", + "typeString": "literal_string \"Emit\"" + }, + "value": "Emit" + }, + "src": "5673:24:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6387, + "nodeType": "ExpressionStatement", + "src": "5673:24:28" + }, + { + "expression": { + "id": 6394, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6388, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5707:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6391, + "indexExpression": { + "hexValue": "34", + "id": 6389, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5717:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5707:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6392, + "indexExpression": { + "hexValue": "31", + "id": 6390, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5720:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5707:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "657468657265756d", + "id": 6393, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5725:10:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_541111248b45b7a8dc3f5579f630e74cb01456ea6ac067d3f4d793245a255155", + "typeString": "literal_string \"ethereum\"" + }, + "value": "ethereum" + }, + "src": "5707:28:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6395, + "nodeType": "ExpressionStatement", + "src": "5707:28:28" + }, + { + "expression": { + "id": 6402, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6396, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5745:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6399, + "indexExpression": { + "hexValue": "34", + "id": 6397, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5755:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5745:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6400, + "indexExpression": { + "hexValue": "32", + "id": 6398, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5758:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5745:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "6164646472657373", + "id": 6401, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5763:10:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_d2ec1bf995bd27eb15a5276b365b86f7983af8baa8cc5ba1f1b43e4b7f977057", + "typeString": "literal_string \"adddress\"" + }, + "value": "adddress" + }, + "src": "5745:28:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6403, + "nodeType": "ExpressionStatement", + "src": "5745:28:28" + }, + { + "expression": { + "id": 6410, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 6404, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5783:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6407, + "indexExpression": { + "hexValue": "34", + "id": 6405, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5793:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5783:12:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + }, + "id": 6408, + "indexExpression": { + "hexValue": "33", + "id": 6406, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5796:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5783:15:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "7b657468416464727d", + "id": 6409, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5801:11:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_f2e1c85895091eca3d9c269e8341e91ae6a32479e6b287a8c8c2fd47eac8b232", + "typeString": "literal_string \"{ethAddr}\"" + }, + "value": "{ethAddr}" + }, + "src": "5783:29:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "id": 6411, + "nodeType": "ExpressionStatement", + "src": "5783:29:28" + }, + { + "expression": { + "id": 6412, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6266, + "src": "5830:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "functionReturnParameters": 6260, + "id": 6413, + "nodeType": "Return", + "src": "5823:16:28" + } + ] + }, + "documentation": { + "id": 6254, + "nodeType": "StructuredDocumentation", + "src": "4816:247:28", + "text": "@notice Returns a two-dimensional array of strings representing the command templates.\n @return string[][] A two-dimensional array of strings, where each inner array represents a set of fixed strings and matchers for a command template." + }, + "functionSelector": "16a8b1a0", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "commandTemplates", + "nameLocation": "5077:16:28", + "parameters": { + "id": 6255, + "nodeType": "ParameterList", + "parameters": [], + "src": "5093:2:28" + }, + "returnParameters": { + "id": 6260, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6259, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6415, + "src": "5117:17:28", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string[][]" + }, + "typeName": { + "baseType": { + "baseType": { + "id": 6256, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5117:6:28", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "id": 6257, + "nodeType": "ArrayTypeName", + "src": "5117:8:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_storage_$dyn_storage_ptr", + "typeString": "string[]" + } + }, + "id": 6258, + "nodeType": "ArrayTypeName", + "src": "5117:10:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_storage_$dyn_storage_$dyn_storage_ptr", + "typeString": "string[][]" + } + }, + "visibility": "internal" + } + ], + "src": "5116:19:28" + }, + "scope": 6704, + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + }, + { + "id": 6577, + "nodeType": "FunctionDefinition", + "src": "5919:1702:28", + "nodes": [], + "body": { + "id": 6576, + "nodeType": "Block", + "src": "6049:1572:28", + "nodes": [], + "statements": [ + { + "assignments": [ + 6427 + ], + "declarations": [ + { + "constant": false, + "id": 6427, + "mutability": "mutable", + "name": "emailAuthAddr", + "nameLocation": "6067:13:28", + "nodeType": "VariableDeclaration", + "scope": 6576, + "src": "6059:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6426, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6059:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 6434, + "initialValue": { + "arguments": [ + { + "id": 6429, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6421, + "src": "6120:5:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "expression": { + "id": 6430, + "name": "emailAuthMsg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6419, + "src": "6139:12:28", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailAuthMsg_$4086_memory_ptr", + "typeString": "struct EmailAuthMsg memory" + } + }, + "id": 6431, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6152:5:28", + "memberName": "proof", + "nodeType": "MemberAccess", + "referencedDeclaration": 4085, + "src": "6139:18:28", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailProof_$5684_memory_ptr", + "typeString": "struct EmailProof memory" + } + }, + "id": 6432, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6158:11:28", + "memberName": "accountSalt", + "nodeType": "MemberAccess", + "referencedDeclaration": 5679, + "src": "6139:30:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 6428, + "name": "computeEmailAuthAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6193, + "src": "6083:23:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes32_$returns$_t_address_$", + "typeString": "function (address,bytes32) view returns (address)" + } + }, + "id": 6433, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6083:96:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6059:120:28" + }, + { + "assignments": [ + 6436 + ], + "declarations": [ + { + "constant": false, + "id": 6436, + "mutability": "mutable", + "name": "templateId", + "nameLocation": "6194:10:28", + "nodeType": "VariableDeclaration", + "scope": 6576, + "src": "6189:15:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6435, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "6189:4:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6440, + "initialValue": { + "arguments": [ + { + "id": 6438, + "name": "templateIdx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6423, + "src": "6225:11:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6437, + "name": "computeTemplateId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6253, + "src": "6207:17:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint256)" + } + }, + "id": 6439, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6207:30:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6189:48:28" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6445, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6442, + "name": "templateId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6436, + "src": "6255:10:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "id": 6443, + "name": "emailAuthMsg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6419, + "src": "6269:12:28", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailAuthMsg_$4086_memory_ptr", + "typeString": "struct EmailAuthMsg memory" + } + }, + "id": 6444, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6282:10:28", + "memberName": "templateId", + "nodeType": "MemberAccess", + "referencedDeclaration": 4074, + "src": "6269:23:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6255:37:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "696e76616c69642074656d706c617465206964", + "id": 6446, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6294:21:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_a46fa541a0a6c87ed1e423c2fd9dc33f0b19b58dcbdd06eb85741662f6bead86", + "typeString": "literal_string \"invalid template id\"" + }, + "value": "invalid template id" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_a46fa541a0a6c87ed1e423c2fd9dc33f0b19b58dcbdd06eb85741662f6bead86", + "typeString": "literal_string \"invalid template id\"" + } + ], + "id": 6441, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "6247:7:28", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 6447, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6247:69:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6448, + "nodeType": "ExpressionStatement", + "src": "6247:69:28" + }, + { + "assignments": [ + 6451 + ], + "declarations": [ + { + "constant": false, + "id": 6451, + "mutability": "mutable", + "name": "emailAuth", + "nameLocation": "6337:9:28", + "nodeType": "VariableDeclaration", + "scope": 6576, + "src": "6327:19:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + }, + "typeName": { + "id": 6450, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 6449, + "name": "EmailAuth", + "nameLocations": [ + "6327:9:28" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4801, + "src": "6327:9:28" + }, + "referencedDeclaration": 4801, + "src": "6327:9:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "visibility": "internal" + } + ], + "id": 6452, + "nodeType": "VariableDeclarationStatement", + "src": "6327:19:28" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6457, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "expression": { + "id": 6453, + "name": "emailAuthAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6427, + "src": "6360:13:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 6454, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6374:4:28", + "memberName": "code", + "nodeType": "MemberAccess", + "src": "6360:18:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6455, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6379:6:28", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "6360:25:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 6456, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6389:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "6360:30:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 6561, + "nodeType": "Block", + "src": "7287:209:28", + "statements": [ + { + "expression": { + "id": 6547, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 6537, + "name": "emailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6451, + "src": "7301:9:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "id": 6543, + "name": "emailAuthAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6427, + "src": "7339:13:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 6542, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7331:7:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 6541, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7331:7:28", + "typeDescriptions": {} + } + }, + "id": 6544, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7331:22:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 6540, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7323:8:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_payable_$", + "typeString": "type(address payable)" + }, + "typeName": { + "id": 6539, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7323:8:28", + "stateMutability": "payable", + "typeDescriptions": {} + } + }, + "id": 6545, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7323:31:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + ], + "id": 6538, + "name": "EmailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4801, + "src": "7313:9:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_EmailAuth_$4801_$", + "typeString": "type(contract EmailAuth)" + } + }, + "id": 6546, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7313:42:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "src": "7301:54:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "id": 6548, + "nodeType": "ExpressionStatement", + "src": "7301:54:28" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 6557, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 6550, + "name": "emailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6451, + "src": "7394:9:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "id": 6551, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7404:10:28", + "memberName": "controller", + "nodeType": "MemberAccess", + "referencedDeclaration": 4105, + "src": "7394:20:28", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$__$returns$_t_address_$", + "typeString": "function () view external returns (address)" + } + }, + "id": 6552, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7394:22:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "id": 6555, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "7428:4:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmitEmailCommand_$6704", + "typeString": "contract EmitEmailCommand" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_EmitEmailCommand_$6704", + "typeString": "contract EmitEmailCommand" + } + ], + "id": 6554, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7420:7:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 6553, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7420:7:28", + "typeDescriptions": {} + } + }, + "id": 6556, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7420:13:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "7394:39:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "696e76616c696420636f6e74726f6c6c6572", + "id": 6558, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7451:20:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_0b1893ecd0fd8d35d6422875b51372b948ec279f8df321bbba3ca7eacbbf8c57", + "typeString": "literal_string \"invalid controller\"" + }, + "value": "invalid controller" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_0b1893ecd0fd8d35d6422875b51372b948ec279f8df321bbba3ca7eacbbf8c57", + "typeString": "literal_string \"invalid controller\"" + } + ], + "id": 6549, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "7369:7:28", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 6559, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7369:116:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6560, + "nodeType": "ExpressionStatement", + "src": "7369:116:28" + } + ] + }, + "id": 6562, + "nodeType": "IfStatement", + "src": "6356:1140:28", + "trueBody": { + "id": 6536, + "nodeType": "Block", + "src": "6392:889:28", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 6463, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "expression": { + "id": 6459, + "name": "emailAuthMsg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6419, + "src": "6431:12:28", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailAuthMsg_$4086_memory_ptr", + "typeString": "struct EmailAuthMsg memory" + } + }, + "id": 6460, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6444:5:28", + "memberName": "proof", + "nodeType": "MemberAccess", + "referencedDeclaration": 4085, + "src": "6431:18:28", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailProof_$5684_memory_ptr", + "typeString": "struct EmailProof memory" + } + }, + "id": 6461, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6450:11:28", + "memberName": "isCodeExist", + "nodeType": "MemberAccess", + "referencedDeclaration": 5681, + "src": "6431:30:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "74727565", + "id": 6462, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6465:4:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "src": "6431:38:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "6973436f64654578697374206d757374206265207472756520666f722074686520666972737420656d61696c", + "id": 6464, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6487:46:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_3d0f994ede94f1c0a805e9a90a90b5be0507ddbf59a80feee98155c705ae9e73", + "typeString": "literal_string \"isCodeExist must be true for the first email\"" + }, + "value": "isCodeExist must be true for the first email" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_3d0f994ede94f1c0a805e9a90a90b5be0507ddbf59a80feee98155c705ae9e73", + "typeString": "literal_string \"isCodeExist must be true for the first email\"" + } + ], + "id": 6458, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "6406:7:28", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 6465, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6406:141:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6466, + "nodeType": "ExpressionStatement", + "src": "6406:141:28" + }, + { + "assignments": [ + 6468 + ], + "declarations": [ + { + "constant": false, + "id": 6468, + "mutability": "mutable", + "name": "proxyAddress", + "nameLocation": "6569:12:28", + "nodeType": "VariableDeclaration", + "scope": 6536, + "src": "6561:20:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6467, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6561:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 6475, + "initialValue": { + "arguments": [ + { + "id": 6470, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6421, + "src": "6622:5:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "expression": { + "id": 6471, + "name": "emailAuthMsg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6419, + "src": "6645:12:28", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailAuthMsg_$4086_memory_ptr", + "typeString": "struct EmailAuthMsg memory" + } + }, + "id": 6472, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6658:5:28", + "memberName": "proof", + "nodeType": "MemberAccess", + "referencedDeclaration": 4085, + "src": "6645:18:28", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailProof_$5684_memory_ptr", + "typeString": "struct EmailProof memory" + } + }, + "id": 6473, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6664:11:28", + "memberName": "accountSalt", + "nodeType": "MemberAccess", + "referencedDeclaration": 5679, + "src": "6645:30:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 6469, + "name": "deployEmailAuthProxy", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6233, + "src": "6584:20:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes32_$returns$_t_address_$", + "typeString": "function (address,bytes32) returns (address)" + } + }, + "id": 6474, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6584:105:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6561:128:28" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 6479, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6477, + "name": "proxyAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6468, + "src": "6728:12:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 6478, + "name": "emailAuthAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6427, + "src": "6744:13:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "6728:29:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "70726f7879206164647265737320646f6573206e6f74206d61746368207769746820656d61696c4175746841646472", + "id": 6480, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6775:49:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_cf7a4dd9c69847ae3d90c7186ce16b246c099259673c33c8c4a92c7774259101", + "typeString": "literal_string \"proxy address does not match with emailAuthAddr\"" + }, + "value": "proxy address does not match with emailAuthAddr" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_cf7a4dd9c69847ae3d90c7186ce16b246c099259673c33c8c4a92c7774259101", + "typeString": "literal_string \"proxy address does not match with emailAuthAddr\"" + } + ], + "id": 6476, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "6703:7:28", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 6481, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6703:135:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6482, + "nodeType": "ExpressionStatement", + "src": "6703:135:28" + }, + { + "expression": { + "id": 6487, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 6483, + "name": "emailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6451, + "src": "6852:9:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 6485, + "name": "proxyAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6468, + "src": "6874:12:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 6484, + "name": "EmailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4801, + "src": "6864:9:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_EmailAuth_$4801_$", + "typeString": "type(contract EmailAuth)" + } + }, + "id": 6486, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6864:23:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "src": "6852:35:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "id": 6488, + "nodeType": "ExpressionStatement", + "src": "6852:35:28" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 6492, + "name": "dkim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6142, + "src": "6928:4:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", + "typeString": "function () view returns (address)" + } + }, + "id": 6493, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6928:6:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 6489, + "name": "emailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6451, + "src": "6901:9:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "id": 6491, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6911:16:28", + "memberName": "initDKIMRegistry", + "nodeType": "MemberAccess", + "referencedDeclaration": 4267, + "src": "6901:26:28", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$__$", + "typeString": "function (address) external" + } + }, + "id": 6494, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6901:34:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6495, + "nodeType": "ExpressionStatement", + "src": "6901:34:28" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 6499, + "name": "verifier", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6133, + "src": "6972:8:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", + "typeString": "function () view returns (address)" + } + }, + "id": 6500, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6972:10:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 6496, + "name": "emailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6451, + "src": "6949:9:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "id": 6498, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6959:12:28", + "memberName": "initVerifier", + "nodeType": "MemberAccess", + "referencedDeclaration": 4309, + "src": "6949:22:28", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$__$", + "typeString": "function (address) external" + } + }, + "id": 6501, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6949:34:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6502, + "nodeType": "ExpressionStatement", + "src": "6949:34:28" + }, + { + "assignments": [ + 6508 + ], + "declarations": [ + { + "constant": false, + "id": 6508, + "mutability": "mutable", + "name": "templates", + "nameLocation": "7015:9:28", + "nodeType": "VariableDeclaration", + "scope": 6536, + "src": "6997:27:28", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string[][]" + }, + "typeName": { + "baseType": { + "baseType": { + "id": 6505, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "6997:6:28", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "id": 6506, + "nodeType": "ArrayTypeName", + "src": "6997:8:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_storage_$dyn_storage_ptr", + "typeString": "string[]" + } + }, + "id": 6507, + "nodeType": "ArrayTypeName", + "src": "6997:10:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_storage_$dyn_storage_$dyn_storage_ptr", + "typeString": "string[][]" + } + }, + "visibility": "internal" + } + ], + "id": 6511, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 6509, + "name": "commandTemplates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6415, + "src": "7027:16:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr_$", + "typeString": "function () pure returns (string memory[] memory[] memory)" + } + }, + "id": 6510, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7027:18:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6997:48:28" + }, + { + "body": { + "id": 6534, + "nodeType": "Block", + "src": "7109:162:28", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 6527, + "name": "idx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6513, + "src": "7198:3:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6526, + "name": "computeTemplateId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6253, + "src": "7180:17:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint256)" + } + }, + "id": 6528, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7180:22:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "baseExpression": { + "id": 6529, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6508, + "src": "7224:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6531, + "indexExpression": { + "id": 6530, + "name": "idx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6513, + "src": "7234:3:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7224:14:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_array$_t_string_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory" + } + ], + "expression": { + "id": 6523, + "name": "emailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6451, + "src": "7127:9:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "id": 6525, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7137:21:28", + "memberName": "insertCommandTemplate", + "nodeType": "MemberAccess", + "referencedDeclaration": 4431, + "src": "7127:31:28", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$returns$__$", + "typeString": "function (uint256,string memory[] memory) external" + } + }, + "id": 6532, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7127:129:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6533, + "nodeType": "ExpressionStatement", + "src": "7127:129:28" + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6519, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6516, + "name": "idx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6513, + "src": "7078:3:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "expression": { + "id": 6517, + "name": "templates", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6508, + "src": "7084:9:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$dyn_memory_ptr", + "typeString": "string memory[] memory[] memory" + } + }, + "id": 6518, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7094:6:28", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "7084:16:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7078:22:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6535, + "initializationExpression": { + "assignments": [ + 6513 + ], + "declarations": [ + { + "constant": false, + "id": 6513, + "mutability": "mutable", + "name": "idx", + "nameLocation": "7069:3:28", + "nodeType": "VariableDeclaration", + "scope": 6535, + "src": "7064:8:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6512, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "7064:4:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6515, + "initialValue": { + "hexValue": "30", + "id": 6514, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7075:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "7064:12:28" + }, + "isSimpleCounterLoop": true, + "loopExpression": { + "expression": { + "id": 6521, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "7102:5:28", + "subExpression": { + "id": 6520, + "name": "idx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6513, + "src": "7102:3:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 6522, + "nodeType": "ExpressionStatement", + "src": "7102:5:28" + }, + "nodeType": "ForStatement", + "src": "7059:212:28" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 6566, + "name": "emailAuthMsg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6419, + "src": "7525:12:28", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailAuthMsg_$4086_memory_ptr", + "typeString": "struct EmailAuthMsg memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_EmailAuthMsg_$4086_memory_ptr", + "typeString": "struct EmailAuthMsg memory" + } + ], + "expression": { + "id": 6563, + "name": "emailAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6451, + "src": "7505:9:28", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EmailAuth_$4801", + "typeString": "contract EmailAuth" + } + }, + "id": 6565, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7515:9:28", + "memberName": "authEmail", + "nodeType": "MemberAccess", + "referencedDeclaration": 4707, + "src": "7505:19:28", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_struct$_EmailAuthMsg_$4086_memory_ptr_$returns$__$", + "typeString": "function (struct EmailAuthMsg memory) external" + } + }, + "id": 6567, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7505:33:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6568, + "nodeType": "ExpressionStatement", + "src": "7505:33:28" + }, + { + "expression": { + "arguments": [ + { + "id": 6570, + "name": "emailAuthAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6427, + "src": "7559:13:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 6571, + "name": "emailAuthMsg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6419, + "src": "7574:12:28", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailAuthMsg_$4086_memory_ptr", + "typeString": "struct EmailAuthMsg memory" + } + }, + "id": 6572, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7587:13:28", + "memberName": "commandParams", + "nodeType": "MemberAccess", + "referencedDeclaration": 4078, + "src": "7574:26:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + { + "id": 6573, + "name": "templateIdx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6423, + "src": "7602:11:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6569, + "name": "_emitEvent", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6703, + "src": "7548:10:28", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_$_t_uint256_$returns$__$", + "typeString": "function (address,bytes memory[] memory,uint256)" + } + }, + "id": 6574, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7548:66:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6575, + "nodeType": "ExpressionStatement", + "src": "7548:66:28" + } + ] + }, + "documentation": { + "id": 6416, + "nodeType": "StructuredDocumentation", + "src": "5852:62:28", + "text": "@notice Emits an event for the command in the given email." + }, + "functionSelector": "20c700c0", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "emitEmailCommand", + "nameLocation": "5928:16:28", + "parameters": { + "id": 6424, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6419, + "mutability": "mutable", + "name": "emailAuthMsg", + "nameLocation": "5974:12:28", + "nodeType": "VariableDeclaration", + "scope": 6577, + "src": "5954:32:28", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailAuthMsg_$4086_memory_ptr", + "typeString": "struct EmailAuthMsg" + }, + "typeName": { + "id": 6418, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 6417, + "name": "EmailAuthMsg", + "nameLocations": [ + "5954:12:28" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4086, + "src": "5954:12:28" + }, + "referencedDeclaration": 4086, + "src": "5954:12:28", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EmailAuthMsg_$4086_storage_ptr", + "typeString": "struct EmailAuthMsg" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6421, + "mutability": "mutable", + "name": "owner", + "nameLocation": "6004:5:28", + "nodeType": "VariableDeclaration", + "scope": 6577, + "src": "5996:13:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6420, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5996:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6423, + "mutability": "mutable", + "name": "templateIdx", + "nameLocation": "6024:11:28", + "nodeType": "VariableDeclaration", + "scope": 6577, + "src": "6019:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6422, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "6019:4:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5944:97:28" + }, + "returnParameters": { + "id": 6425, + "nodeType": "ParameterList", + "parameters": [], + "src": "6049:0:28" + }, + "scope": 6704, + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "id": 6703, + "nodeType": "FunctionDefinition", + "src": "7627:1012:28", + "nodes": [], + "body": { + "id": 6702, + "nodeType": "Block", + "src": "7756:883:28", + "nodes": [], + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6589, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6587, + "name": "templateIdx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6584, + "src": "7770:11:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 6588, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7785:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "7770:16:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6610, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6608, + "name": "templateIdx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6584, + "src": "7941:11:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "31", + "id": 6609, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7956:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "7941:16:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6631, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6629, + "name": "templateIdx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6584, + "src": "8099:11:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "32", + "id": 6630, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8114:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "8099:16:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6652, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6650, + "name": "templateIdx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6584, + "src": "8254:11:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "33", + "id": 6651, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8269:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "src": "8254:16:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6673, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6671, + "name": "templateIdx", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6584, + "src": "8416:11:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "34", + "id": 6672, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8431:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "8416:16:28", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 6696, + "nodeType": "Block", + "src": "8579:54:28", + "statements": [ + { + "expression": { + "arguments": [ + { + "hexValue": "696e76616c69642074656d706c617465496478", + "id": 6693, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8600:21:28", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_b3d7e9164723b6e90f7f0ed43161f12ac122160df99c21ef9fe34a1aa640c473", + "typeString": "literal_string \"invalid templateIdx\"" + }, + "value": "invalid templateIdx" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_b3d7e9164723b6e90f7f0ed43161f12ac122160df99c21ef9fe34a1aa640c473", + "typeString": "literal_string \"invalid templateIdx\"" + } + ], + "id": 6692, + "name": "revert", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -19, + -19 + ], + "referencedDeclaration": -19, + "src": "8593:6:28", + "typeDescriptions": { + "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory) pure" + } + }, + "id": 6694, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8593:29:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6695, + "nodeType": "ExpressionStatement", + "src": "8593:29:28" + } + ] + }, + "id": 6697, + "nodeType": "IfStatement", + "src": "8412:221:28", + "trueBody": { + "id": 6691, + "nodeType": "Block", + "src": "8434:139:28", + "statements": [ + { + "assignments": [ + 6675 + ], + "declarations": [ + { + "constant": false, + "id": 6675, + "mutability": "mutable", + "name": "command", + "nameLocation": "8456:7:28", + "nodeType": "VariableDeclaration", + "scope": 6691, + "src": "8448:15:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6674, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8448:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 6685, + "initialValue": { + "arguments": [ + { + "baseExpression": { + "id": 6678, + "name": "commandParams", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6582, + "src": "8477:13:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + "id": 6680, + "indexExpression": { + "hexValue": "30", + "id": 6679, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8491:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "8477:16:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "components": [ + { + "id": 6682, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8496:7:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 6681, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8496:7:28", + "typeDescriptions": {} + } + } + ], + "id": 6683, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "8495:9:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + } + ], + "expression": { + "id": 6676, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "8466:3:28", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 6677, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8470:6:28", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "8466:10:28", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 6684, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8466:39:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8448:57:28" + }, + { + "eventCall": { + "arguments": [ + { + "id": 6687, + "name": "emailAuthAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6579, + "src": "8539:13:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6688, + "name": "command", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6675, + "src": "8554:7:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 6686, + "name": "EthAddrCommand", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6124, + "src": "8524:14:28", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$", + "typeString": "function (address,address)" + } + }, + "id": 6689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8524:38:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6690, + "nodeType": "EmitStatement", + "src": "8519:43:28" + } + ] + } + }, + "id": 6698, + "nodeType": "IfStatement", + "src": "8250:383:28", + "trueBody": { + "id": 6670, + "nodeType": "Block", + "src": "8272:134:28", + "statements": [ + { + "assignments": [ + 6654 + ], + "declarations": [ + { + "constant": false, + "id": 6654, + "mutability": "mutable", + "name": "command", + "nameLocation": "8291:7:28", + "nodeType": "VariableDeclaration", + "scope": 6670, + "src": "8286:12:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6653, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "8286:4:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6664, + "initialValue": { + "arguments": [ + { + "baseExpression": { + "id": 6657, + "name": "commandParams", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6582, + "src": "8312:13:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + "id": 6659, + "indexExpression": { + "hexValue": "30", + "id": 6658, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8326:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "8312:16:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "components": [ + { + "id": 6661, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8331:4:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 6660, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "8331:4:28", + "typeDescriptions": {} + } + } + ], + "id": 6662, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "8330:6:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "expression": { + "id": 6655, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "8301:3:28", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 6656, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8305:6:28", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "8301:10:28", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 6663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8301:36:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8286:51:28" + }, + { + "eventCall": { + "arguments": [ + { + "id": 6666, + "name": "emailAuthAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6579, + "src": "8372:13:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6667, + "name": "command", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6654, + "src": "8387:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6665, + "name": "DecimalsCommand", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6118, + "src": "8356:15:28", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 6668, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8356:39:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6669, + "nodeType": "EmitStatement", + "src": "8351:44:28" + } + ] + } + }, + "id": 6699, + "nodeType": "IfStatement", + "src": "8095:538:28", + "trueBody": { + "id": 6649, + "nodeType": "Block", + "src": "8117:127:28", + "statements": [ + { + "assignments": [ + 6633 + ], + "declarations": [ + { + "constant": false, + "id": 6633, + "mutability": "mutable", + "name": "command", + "nameLocation": "8135:7:28", + "nodeType": "VariableDeclaration", + "scope": 6649, + "src": "8131:11:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 6632, + "name": "int", + "nodeType": "ElementaryTypeName", + "src": "8131:3:28", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "id": 6643, + "initialValue": { + "arguments": [ + { + "baseExpression": { + "id": 6636, + "name": "commandParams", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6582, + "src": "8156:13:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + "id": 6638, + "indexExpression": { + "hexValue": "30", + "id": 6637, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8170:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "8156:16:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "components": [ + { + "id": 6640, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8175:3:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 6639, + "name": "int", + "nodeType": "ElementaryTypeName", + "src": "8175:3:28", + "typeDescriptions": {} + } + } + ], + "id": 6641, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "8174:5:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + } + ], + "expression": { + "id": 6634, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "8145:3:28", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 6635, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8149:6:28", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "8145:10:28", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 6642, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8145:35:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8131:49:28" + }, + { + "eventCall": { + "arguments": [ + { + "id": 6645, + "name": "emailAuthAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6579, + "src": "8210:13:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6646, + "name": "command", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6633, + "src": "8225:7:28", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 6644, + "name": "IntCommand", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6112, + "src": "8199:10:28", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_int256_$returns$__$", + "typeString": "function (address,int256)" + } + }, + "id": 6647, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8199:34:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6648, + "nodeType": "EmitStatement", + "src": "8194:39:28" + } + ] + } + }, + "id": 6700, + "nodeType": "IfStatement", + "src": "7937:696:28", + "trueBody": { + "id": 6628, + "nodeType": "Block", + "src": "7959:130:28", + "statements": [ + { + "assignments": [ + 6612 + ], + "declarations": [ + { + "constant": false, + "id": 6612, + "mutability": "mutable", + "name": "command", + "nameLocation": "7978:7:28", + "nodeType": "VariableDeclaration", + "scope": 6628, + "src": "7973:12:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6611, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "7973:4:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6622, + "initialValue": { + "arguments": [ + { + "baseExpression": { + "id": 6615, + "name": "commandParams", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6582, + "src": "7999:13:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + "id": 6617, + "indexExpression": { + "hexValue": "30", + "id": 6616, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8013:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7999:16:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "components": [ + { + "id": 6619, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8018:4:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 6618, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "8018:4:28", + "typeDescriptions": {} + } + } + ], + "id": 6620, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "8017:6:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "expression": { + "id": 6613, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "7988:3:28", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 6614, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "7992:6:28", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "7988:10:28", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 6621, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7988:36:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7973:51:28" + }, + { + "eventCall": { + "arguments": [ + { + "id": 6624, + "name": "emailAuthAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6579, + "src": "8055:13:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6625, + "name": "command", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6612, + "src": "8070:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6623, + "name": "UintCommand", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6106, + "src": "8043:11:28", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 6626, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8043:35:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6627, + "nodeType": "EmitStatement", + "src": "8038:40:28" + } + ] + } + }, + "id": 6701, + "nodeType": "IfStatement", + "src": "7766:867:28", + "trueBody": { + "id": 6607, + "nodeType": "Block", + "src": "7788:143:28", + "statements": [ + { + "assignments": [ + 6591 + ], + "declarations": [ + { + "constant": false, + "id": 6591, + "mutability": "mutable", + "name": "command", + "nameLocation": "7816:7:28", + "nodeType": "VariableDeclaration", + "scope": 6607, + "src": "7802:21:28", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6590, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "7802:6:28", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "id": 6601, + "initialValue": { + "arguments": [ + { + "baseExpression": { + "id": 6594, + "name": "commandParams", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6582, + "src": "7837:13:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + "id": 6596, + "indexExpression": { + "hexValue": "30", + "id": 6595, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7851:1:28", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7837:16:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "components": [ + { + "id": 6598, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7856:6:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + }, + "typeName": { + "id": 6597, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "7856:6:28", + "typeDescriptions": {} + } + } + ], + "id": 6599, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "7855:8:28", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + } + ], + "expression": { + "id": 6592, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "7826:3:28", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 6593, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "7830:6:28", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "7826:10:28", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 6600, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7826:38:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7802:62:28" + }, + { + "eventCall": { + "arguments": [ + { + "id": 6603, + "name": "emailAuthAddr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6579, + "src": "7897:13:28", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6604, + "name": "command", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6591, + "src": "7912:7:28", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6602, + "name": "StringCommand", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6100, + "src": "7883:13:28", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (address,string memory)" + } + }, + "id": 6605, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7883:37:28", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6606, + "nodeType": "EmitStatement", + "src": "7878:42:28" + } + ] + } + } + ] + }, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_emitEvent", + "nameLocation": "7636:10:28", + "parameters": { + "id": 6585, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6579, + "mutability": "mutable", + "name": "emailAuthAddr", + "nameLocation": "7664:13:28", + "nodeType": "VariableDeclaration", + "scope": 6703, + "src": "7656:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6578, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7656:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6582, + "mutability": "mutable", + "name": "commandParams", + "nameLocation": "7702:13:28", + "nodeType": "VariableDeclaration", + "scope": 6703, + "src": "7687:28:28", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes[]" + }, + "typeName": { + "baseType": { + "id": 6580, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "7687:5:28", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "id": 6581, + "nodeType": "ArrayTypeName", + "src": "7687:7:28", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr", + "typeString": "bytes[]" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6584, + "mutability": "mutable", + "name": "templateIdx", + "nameLocation": "7730:11:28", + "nodeType": "VariableDeclaration", + "scope": 6703, + "src": "7725:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6583, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "7725:4:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7646:101:28" + }, + "returnParameters": { + "id": 6586, + "nodeType": "ParameterList", + "parameters": [], + "src": "7756:0:28" + }, + "scope": 6704, + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + } + ], + "abstract": false, + "baseContracts": [], + "canonicalName": "EmitEmailCommand", + "contractDependencies": [ + 827 + ], + "contractKind": "contract", + "documentation": { + "id": 6088, + "nodeType": "StructuredDocumentation", + "src": "261:84:28", + "text": "@title Example contract that emits an event for the command in the given email." + }, + "fullyImplemented": true, + "linearizedBaseContracts": [ + 6704 + ], + "name": "EmitEmailCommand", + "nameLocation": "354:16:28", + "scope": 6705, + "usedErrors": [], + "usedEvents": [ + 6100, + 6106, + 6112, + 6118, + 6124 + ] + } + ], + "license": "MIT" + }, + "id": 28 +} \ No newline at end of file diff --git a/example/scripts/package.json b/example/scripts/package.json index 688a5bce..a3ba3471 100644 --- a/example/scripts/package.json +++ b/example/scripts/package.json @@ -6,7 +6,14 @@ "install": "yarn build", "build": "npx tsc" }, - "dependencies": {}, + "dependencies": { + "@zk-email/helpers": "^6.1.5", + "@zk-email/relayer-utils": "^0.3.7", + "axios": "^1.6.7", + "circomlibjs": "^0.1.7", + "dotenv": "^16.4.5", + "viem": "^2.21.25" + }, "devDependencies": { "@babel/core": "^7.22.5", "@babel/preset-env": "^7.22.2", @@ -96,4 +103,4 @@ "prefer-destructuring": "off" } } -} \ No newline at end of file +} diff --git a/example/scripts/src/main.ts b/example/scripts/src/main.ts index e69de29b..b293ae11 100644 --- a/example/scripts/src/main.ts +++ b/example/scripts/src/main.ts @@ -0,0 +1,45 @@ +require("dotenv").config(); +import emailAuthAbi from "../abis/EmailAuth.json"; +import emitEmailCommandAbi from "../abis/EmitEmailCommand.json"; +import { + encodeAbiParameters, + parseAbiParameters, +} from "viem"; +import { AbiFunction } from 'viem'; +import { RelayerInput, CommandParam } from './types'; + +if (!process.env.EMIT_EMAIL_COMMAND_ADDR) { + throw new Error('EMIT_EMAIL_COMMAND_ADDR is not defined'); +} +const emitEmailCommandAddr: string = process.env.EMIT_EMAIL_COMMAND_ADDR; + +enum CommandTypes { + String, + Uint, + Int, + Decimals, + EthAddr, +} + +async function constructInputToRelayer(commandType: CommandTypes, commandValue: string | number | bigint) { + let commandParams: CommandParam[] = []; + switch (commandType) { + case CommandTypes.String: + commandParams.push({ String: commandValue as string }); + break; + case CommandTypes.Uint: + commandParams.push({ Uint: commandValue.toString() }); + break; + case CommandTypes.Int: + commandParams.push({ Int: commandValue.toString() }); + break; + case CommandTypes.Decimals: + commandParams.push({ Decimals: ((commandValue as bigint) * (10n ** 18n)).toString() }); + break; + case CommandTypes.EthAddr: + commandParams.push({ EthAddr: commandValue as string }); + break; + default: + throw new Error('Unsupported command type'); + } +} \ No newline at end of file diff --git a/example/scripts/src/types.ts b/example/scripts/src/types.ts new file mode 100644 index 00000000..48dc5c84 --- /dev/null +++ b/example/scripts/src/types.ts @@ -0,0 +1,26 @@ +import { AbiFunction } from 'viem'; + + +export interface CommandParam { + String?: string; + Uint?: string; + Int?: string; + Decimals?: string; + EthAddr?: string; +} + +export interface RelayerInput { + contractAddress: string; + emailAuthContractAddress: string; + accountCode: string; + codeExistsInEmail: boolean; + functionAbi: AbiFunction; + commandTemplate: string; + commandParams: string[]; + templateId: string; + remainingArgs: CommandParam[]; + emailAddress: string; + subject: string; + body: string; + chain: string; +} \ No newline at end of file diff --git a/example/scripts/yarn.lock b/example/scripts/yarn.lock index 8ca6c370..c770b5f0 100644 --- a/example/scripts/yarn.lock +++ b/example/scripts/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adraffy/ens-normalize@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" + integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== + "@ampproject/remapping@^2.2.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" @@ -973,6 +978,348 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@humanwhocodes/config-array@^0.13.0": version "0.13.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" @@ -992,6 +1339,19 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@iden3/bigarray@0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@iden3/bigarray/-/bigarray-0.0.2.tgz#6fc4ba5be18daf8a26ee393f2fb62b80d98c05e9" + integrity sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g== + +"@iden3/binfileutils@0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@iden3/binfileutils/-/binfileutils-0.0.12.tgz#3772552f57551814ff606fa68ea1e0ef52795ce3" + integrity sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ== + dependencies: + fastfile "0.0.20" + ffjavascript "^0.3.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1232,6 +1592,21 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@mapbox/node-pre-gyp@^1.0": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + "@mswjs/cookies@^0.2.2": version "0.2.2" resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" @@ -1254,6 +1629,18 @@ strict-event-emitter "^0.2.4" web-encoding "^1.1.5" +"@noble/curves@1.6.0", "@noble/curves@^1.4.0", "@noble/curves@~1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.6.0.tgz#be5296ebcd5a1730fccea4786d420f87abfeb40b" + integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ== + dependencies: + "@noble/hashes" "1.5.0" + +"@noble/hashes@1.5.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" + integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1275,6 +1662,21 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@octokit/rest@^15.9.5": + version "15.18.3" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.3.tgz#ff4ecbb784ca286c40cc1d568abceda6d99b36fc" + integrity sha512-oHABAvvC83tPIuvUfWRaw9eLThFrCxBgywl+KvEwfTFjoCrMOfEaMh0r39+Ub/EEbV345GJiMzN+zPZ4kqOvbA== + dependencies: + before-after-hook "^1.1.0" + btoa-lite "^1.0.0" + debug "^3.1.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.0" + lodash "^4.17.4" + node-fetch "^2.1.1" + universal-user-agent "^2.0.0" + url-template "^2.0.8" + "@open-draft/until@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" @@ -1285,6 +1687,28 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== +"@scure/base@~1.1.7", "@scure/base@~1.1.8": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/bip32@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.5.0.tgz#dd4a2e1b8a9da60e012e776d954c4186db6328e6" + integrity sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw== + dependencies: + "@noble/curves" "~1.6.0" + "@noble/hashes" "~1.5.0" + "@scure/base" "~1.1.7" + +"@scure/bip39@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.4.0.tgz#664d4f851564e2e1d4bffa0339f9546ea55960a6" + integrity sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw== + dependencies: + "@noble/hashes" "~1.5.0" + "@scure/base" "~1.1.8" + "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" @@ -1556,11 +1980,45 @@ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== +"@zk-email/helpers@^6.1.5": + version "6.1.8" + resolved "https://registry.yarnpkg.com/@zk-email/helpers/-/helpers-6.1.8.tgz#a0afa1813a4edf19e1ad752fc150caecd2e78163" + integrity sha512-CSRKf4QXnJCZsGosTxAlFcCAmEoZbu/+iIAljCg+pSJApOyzhBnfrRl97Lkq0Sxp0yxvWzq/b/Si50KWhFUnAg== + dependencies: + addressparser "^1.0.1" + atob "^2.1.2" + circomlibjs "^0.1.7" + libmime "^5.2.1" + localforage "^1.10.0" + node-forge "^1.3.1" + pako "^2.1.0" + psl "^1.9.0" + snarkjs "0.7.4" + +"@zk-email/relayer-utils@^0.3.7": + version "0.3.7" + resolved "https://registry.yarnpkg.com/@zk-email/relayer-utils/-/relayer-utils-0.3.7.tgz#a3cdcc02e3607ac2fe9a9c1d90077df702011a02" + integrity sha512-+/SYjuwO22kKp9n0syoOeRoifx7RDzZ8ycr1mAAIpEKgnySibTfGJpcFEkBTpv5eIK/a7vEev8KE6uG1Sj49EQ== + dependencies: + "@mapbox/node-pre-gyp" "^1.0" + cargo-cp-artifact "^0.1" + node-pre-gyp-github "https://github.com/ultamatt/node-pre-gyp-github.git" + "@zxing/text-encoding@0.9.0": version "0.9.0" resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abitype@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.6.tgz#76410903e1d88e34f1362746e2d407513c38565b" + integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -1571,6 +2029,30 @@ acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +addressparser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746" + integrity sha512-aQX7AISOMM7HFE0iZ3+YnD07oIeJqWGVnJ+ZIKaBZAk03ftmVYVqsGas/rbXKR21n4D/hKCSHypvcyOkds/xzg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +agent-base@4, agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1620,6 +2102,19 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1708,6 +2203,16 @@ async@^3.2.3: resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -1715,6 +2220,20 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +axios@^1.6.7: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +b4a@^1.0.1: + version "1.6.7" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== + babel-jest@^29.5.0, babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -1812,6 +2331,27 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +before-after-hook@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" + integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== + +bfj@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== + dependencies: + bluebird "^3.7.2" + check-types "^11.2.3" + hoopy "^0.1.4" + jsonpath "^1.1.1" + tryer "^1.0.1" + binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -1826,6 +2366,46 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +blake-hash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" + integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w== + dependencies: + node-addon-api "^3.0.0" + node-gyp-build "^4.2.2" + readable-stream "^3.6.0" + +blake2b-wasm@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== + dependencies: + b4a "^1.0.1" + nanoassert "^2.0.0" + +blake2b@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" + integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== + dependencies: + blake2b-wasm "^2.4.0" + nanoassert "^2.0.0" + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1848,6 +2428,11 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + browserslist@^4.23.3, browserslist@^4.24.0: version "4.24.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" @@ -1872,6 +2457,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1916,6 +2506,11 @@ caniuse-lite@^1.0.30001663: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz#98e214455329f54bf7a4d70b49c9794f0fbedbed" integrity sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw== +cargo-cp-artifact@^0.1: + version "0.1.9" + resolved "https://registry.yarnpkg.com/cargo-cp-artifact/-/cargo-cp-artifact-0.1.9.tgz#32264a0a48109e26c48da334daff9a1da9d9b7c8" + integrity sha512-6F+UYzTaGB+awsTXg0uSJA1/b/B3DDJzpKVRu0UmyI7DmNeaAl2RFHuTGIN6fEgpadRxoXGb7gbC1xo4C3IdyA== + chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -1943,6 +2538,11 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== + chokidar@^3.4.2: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -1958,11 +2558,33 @@ chokidar@^3.4.2: optionalDependencies: fsevents "~2.3.2" +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +circom_runtime@0.1.25: + version "0.1.25" + resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.1.25.tgz#62a33b371f4633f30238db7a326c43d988e3a170" + integrity sha512-xBGsBFF5Uv6AKvbpgExYqpHfmfawH2HKe+LyjfKSRevqEV8u63i9KGHVIILsbJNW+0c5bm/66f0PUYQ7qZSkJA== + dependencies: + ffjavascript "0.3.0" + +circomlibjs@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" + integrity sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg== + dependencies: + blake-hash "^2.0.0" + blake2b "^2.1.3" + ethers "^5.5.1" + ffjavascript "^0.2.45" + cjs-module-lexer@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" @@ -2033,6 +2655,23 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.17.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2043,6 +2682,11 @@ confusing-browser-globals@^1.0.10: resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -2073,6 +2717,17 @@ create-jest@^29.7.0: jest-util "^29.7.0" prompts "^2.0.1" +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2109,26 +2764,33 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: - ms "^2.1.1" + ms "2.0.0" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: ms "^2.1.3" +debug@^3.1.0, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + dedent@^1.0.0: version "1.5.3" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== -deep-is@^0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -2163,6 +2825,21 @@ define-properties@^1.2.0, define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -2194,7 +2871,12 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -ejs@^3.1.10: +dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +ejs@^3.1.10, ejs@^3.1.6: version "3.1.10" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== @@ -2206,6 +2888,19 @@ electron-to-chromium@^1.5.28: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz#ec41047f0e1446ec5dce78ed5970116533139b88" integrity sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw== +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emittery@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" @@ -2216,6 +2911,18 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +encoding-japanese@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/encoding-japanese/-/encoding-japanese-2.1.0.tgz#5d3c2b652c84ca563783b86907bf5cdfe9a597e2" + integrity sha512-58XySVxUgVlBikBTbQ8WdDxBDHIdXucB16LO5PBHR8t75D54wQrNo4cg+58+R1CtJfKnsVsvt9XlteRaR8xw1w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -2319,6 +3026,18 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" @@ -2339,6 +3058,18 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^1.8.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-airbnb-base@^15.0.0: version "15.0.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" @@ -2463,7 +3194,12 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0: +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== + +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -2482,6 +3218,11 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" @@ -2492,11 +3233,60 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +ethers@^5.5.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -2558,11 +3348,16 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-sta resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fastfile@0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/fastfile/-/fastfile-0.0.20.tgz#794a143d58cfda2e24c298e5ef619c748c8a1879" + integrity sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -2577,6 +3372,33 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +ffjavascript@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.0.tgz#442cd8fbb1ee4cbb1be9d26fd7b2951a1ea45d6a" + integrity sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + +ffjavascript@^0.2.45: + version "0.2.63" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.63.tgz#0c1216a1f123dc9181df69e144473704d2f115eb" + integrity sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + +ffjavascript@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.1.tgz#3761bbb3f4a67b58a94a463080272bf6b5877b03" + integrity sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -2635,6 +3457,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -2642,6 +3469,22 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +form-data@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2672,6 +3515,21 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -2698,6 +3556,13 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -2831,6 +3696,19 @@ has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -2843,16 +3721,61 @@ headers-polyfill@3.2.5: resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.2.5.tgz#6e67d392c9d113d37448fe45014e0afdd168faed" integrity sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA== +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== + dependencies: + agent-base "4" + debug "3.1.0" + +https-proxy-agent@^2.2.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -2870,6 +3793,11 @@ ignore@^5.2.0, ignore@^5.3.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -3079,6 +4007,11 @@ is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: dependencies: call-bind "^1.0.7" +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -3127,6 +4060,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isows@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.6.tgz#0da29d706fa51551c663c627ace42769850f86e7" + integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" @@ -3553,6 +4491,11 @@ js-levenshtein@^1.1.6: resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3610,6 +4553,15 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -3635,11 +4587,53 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +libbase64@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-1.3.0.tgz#053314755a05d2e5f08bbfc48d0290e9322f4406" + integrity sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg== + +libmime@^5.2.1: + version "5.3.5" + resolved "https://registry.yarnpkg.com/libmime/-/libmime-5.3.5.tgz#acd95a32f58dab55c8a9d269c5b4509e7ad6ae31" + integrity sha512-nSlR1yRZ43L3cZCiWEw7ali3jY29Hz9CQQ96Oy+sSspYnIP5N54ucOPHqooBsXzwrX1pwn13VUE05q4WmzfaLg== + dependencies: + encoding-japanese "2.1.0" + iconv-lite "0.6.3" + libbase64 "1.3.0" + libqp "2.1.0" + +libqp@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/libqp/-/libqp-2.1.0.tgz#ce84bffd86b76029032093bd866d316e12a3d3f5" + integrity sha512-O6O6/fsG5jiUVbvdgT7YX3xY3uIadR6wEZ7+vy9u7PKHAlSEB6blvC1o5pHBjgsi95Uo0aiBBdkyFecj6jtb7A== + +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== + dependencies: + immediate "~3.0.5" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +localforage@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -3669,7 +4663,7 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.21: +lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3682,6 +4676,11 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +logplease@^1.2.15: + version "1.2.15" + resolved "https://registry.yarnpkg.com/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" + integrity sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -3689,6 +4688,18 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +macos-release@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.1.tgz#bccac4a8f7b93163a8d163b8ebf385b3c5f55bf9" + integrity sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A== + +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -3726,11 +4737,33 @@ micromatch@^4.0.4: braces "^3.0.3" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3757,6 +4790,36 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" @@ -3792,33 +4855,80 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +nanoassert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -node-fetch@^2.6.7: +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-fetch@^2.1.1, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" +node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-gyp-build@^4.2.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" + integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +"node-pre-gyp-github@git+https://github.com/ultamatt/node-pre-gyp-github.git": + version "1.4.3" + resolved "git+https://github.com/ultamatt/node-pre-gyp-github.git#e4961827f77751489bc8d4760a0479f3f985f34f" + dependencies: + "@octokit/rest" "^15.9.5" + commander "^2.17.0" + mime-types "^2.1.19" + node-releases@^2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -3826,6 +4936,21 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + object-inspect@^1.13.1: version "1.13.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" @@ -3883,7 +5008,7 @@ object.values@^1.2.0: define-properties "^1.2.1" es-object-atoms "^1.0.0" -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -3897,6 +5022,18 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -3924,6 +5061,14 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +os-name@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -3934,6 +5079,11 @@ outvariant@^1.2.1, outvariant@^1.4.0: resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -3967,6 +5117,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pako@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -3994,6 +5149,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -4046,6 +5206,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" @@ -4063,6 +5228,24 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -4078,12 +5261,22 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +r1csfile@0.0.48: + version "0.0.48" + resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.48.tgz#a317fc75407a9da92631666c75bdfc13f0a7835a" + integrity sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw== + dependencies: + "@iden3/bigarray" "0.0.2" + "@iden3/binfileutils" "0.0.12" + fastfile "0.0.20" + ffjavascript "0.3.0" + react-is@^18.0.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -readable-stream@^3.4.0: +readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -4256,21 +5449,36 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^6.3.0, semver@^6.3.1: +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: +semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + set-cookie-parser@^2.4.6: version "2.7.0" resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz#ef5552b56dc01baae102acb5fc9fb8cd060c30f9" @@ -4298,6 +5506,13 @@ set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4305,6 +5520,11 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -4320,7 +5540,7 @@ side-channel@^1.0.4: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -4335,6 +5555,22 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +snarkjs@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.7.4.tgz#b9ad5813f055ab84d33f1831a6f1f34a71b6cd46" + integrity sha512-x4cOCR4YXSyBlLtfnUUwfbZrw8wFd/Y0lk83eexJzKwZB8ELdpH+10ts8YtDsm2/a3WK7c7p514bbE8NpqxW8w== + dependencies: + "@iden3/binfileutils" "0.0.12" + bfj "^7.0.2" + blake2b-wasm "^2.4.0" + circom_runtime "0.1.25" + ejs "^3.1.6" + fastfile "0.0.20" + ffjavascript "0.3.0" + js-sha3 "^0.8.0" + logplease "^1.2.15" + r1csfile "0.0.48" + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -4343,7 +5579,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -4360,6 +5596,13 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + strict-event-emitter@^0.2.4: version "0.2.8" resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" @@ -4380,7 +5623,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4441,6 +5684,11 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -4477,6 +5725,18 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +tar@^6.1.11: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -4525,6 +5785,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" @@ -4567,6 +5832,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -4646,6 +5918,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + undici-types@~6.19.2: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" @@ -4674,6 +5951,13 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +universal-user-agent@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" + integrity sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q== + dependencies: + os-name "^3.0.0" + update-browserslist-db@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" @@ -4689,6 +5973,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== + util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -4714,6 +6003,21 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^2.0.0" +viem@^2.21.25: + version "2.21.25" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.25.tgz#5e4a7c6a8543396f67ef221ea5d2226321f000b8" + integrity sha512-fQbFLVW5RjC1MwjelmzzDygmc2qMfY17NruAIIdYeiB8diQfhqsczU5zdGw/jTbmNXbKoYnSdgqMb8MFZcbZ1w== + dependencies: + "@adraffy/ens-normalize" "1.11.0" + "@noble/curves" "1.6.0" + "@noble/hashes" "1.5.0" + "@scure/bip32" "1.5.0" + "@scure/bip39" "1.4.0" + abitype "1.0.6" + isows "1.0.6" + webauthn-p256 "0.0.10" + ws "8.18.0" + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -4721,6 +6025,18 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" +wasmbuilder@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" + integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA== + +wasmcurves@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" + integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ== + dependencies: + wasmbuilder "0.0.16" + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -4737,6 +6053,19 @@ web-encoding@^1.1.5: optionalDependencies: "@zxing/text-encoding" "0.9.0" +web-worker@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== + +webauthn-p256@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/webauthn-p256/-/webauthn-p256-0.0.10.tgz#877e75abe8348d3e14485932968edf3325fd2fdd" + integrity sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA== + dependencies: + "@noble/curves" "^1.4.0" + "@noble/hashes" "^1.4.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -4772,6 +6101,13 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: gopd "^1.0.1" has-tostringtag "^1.0.2" +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -4779,7 +6115,21 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@^1.2.5: +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +windows-release@^3.1.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" + integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== + dependencies: + execa "^1.0.0" + +word-wrap@^1.2.5, word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== @@ -4815,6 +6165,16 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -4825,6 +6185,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" From dc607f4e408d887f8039447b29c28650af9a3e72 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Wed, 16 Oct 2024 03:51:39 +0700 Subject: [PATCH 120/121] feat: finish e2e test --- .gitignore | 3 +- example/contracts/src/EmitEmailCommand.sol | 10 ++-- packages/relayer/src/chain.rs | 54 +++++++++------------- packages/relayer/src/dkim.rs | 28 +++++++---- packages/relayer/src/handler.rs | 1 - packages/relayer/src/mail.rs | 7 +-- packages/relayer/src/schema.rs | 11 +---- yarn.lock | 4 +- 8 files changed, 56 insertions(+), 62 deletions(-) diff --git a/.gitignore b/.gitignore index 174d6b86..bf6b96e7 100644 --- a/.gitignore +++ b/.gitignore @@ -76,4 +76,5 @@ zkout example/contracts/artifacts example/contracts/cache example/contracts/node_modules -example/scripts/dist \ No newline at end of file +example/scripts/dist +example/contracts/broadcast \ No newline at end of file diff --git a/example/contracts/src/EmitEmailCommand.sol b/example/contracts/src/EmitEmailCommand.sol index 8451c8d2..69f56e22 100644 --- a/example/contracts/src/EmitEmailCommand.sol +++ b/example/contracts/src/EmitEmailCommand.sol @@ -111,27 +111,31 @@ contract EmitEmailCommand { /// @notice Returns a two-dimensional array of strings representing the command templates. /// @return string[][] A two-dimensional array of strings, where each inner array represents a set of fixed strings and matchers for a command template. function commandTemplates() public pure returns (string[][] memory) { - string[][] memory templates = new string[][](2); - templates[0] = new string[](5); + string[][] memory templates = new string[][](5); // Corrected size to 5 + templates[0] = new string[](3); // Corrected size to 3 templates[0][0] = "Emit"; templates[0][1] = "string"; templates[0][2] = "{string}"; + templates[1] = new string[](3); // Added missing initialization templates[1][0] = "Emit"; templates[1][1] = "uint"; templates[1][2] = "{uint}"; + templates[2] = new string[](3); // Added missing initialization templates[2][0] = "Emit"; templates[2][1] = "int"; templates[2][2] = "{int}"; + templates[3] = new string[](3); // Added missing initialization templates[3][0] = "Emit"; templates[3][1] = "decimals"; templates[3][2] = "{decimals}"; + templates[4] = new string[](4); // Corrected size to 4 templates[4][0] = "Emit"; templates[4][1] = "ethereum"; - templates[4][2] = "adddress"; + templates[4][2] = "address"; // Fixed typo: "adddress" to "address" templates[4][3] = "{ethAddr}"; return templates; diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index 64f214fa..0555bece 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use crate::*; -use abi::{Abi, Token}; +use abi::{encode, Abi, ParamType, Token, Tokenize}; use abis::{ECDSAOwnedDKIMRegistry, EmailAuth, EmailAuthMsg, EmailProof}; use anyhow::anyhow; use config::ChainConfig; @@ -15,6 +15,16 @@ const CONFIRMATIONS: usize = 1; type SignerM = SignerMiddleware, LocalWallet>; +struct CustomTokenVec { + tokens: Vec, +} + +impl Tokenize for CustomTokenVec { + fn into_tokens(self) -> Vec { + self.tokens + } +} + /// Represents a client for interacting with the blockchain. #[derive(Debug, Clone)] pub struct ChainClient { @@ -110,29 +120,6 @@ impl ChainClient { Ok(is_valid) } - /// Gets the DKIM from an email auth address. - /// - /// # Arguments - /// - /// * `email_auth_addr` - The email auth address as a string. - /// - /// # Returns - /// - /// A `Result` containing the ECDSA Owned DKIM Registry if successful, or an error if not. - pub async fn get_dkim_from_email_auth( - &self, - email_auth_address: Address, - ) -> Result, anyhow::Error> { - // Create a new EmailAuth contract instance - let contract = EmailAuth::new(email_auth_address, self.client.clone()); - - // Call the dkim_registry_addr method to get the DKIM registry address - let dkim = contract.dkim_registry_addr().call().await?; - - // Create and return a new ECDSAOwnedDKIMRegistry instance - Ok(ECDSAOwnedDKIMRegistry::new(dkim, self.client.clone())) - } - pub async fn call(&self, request: RequestModel, email_auth_msg: EmailAuthMsg) -> Result<()> { let abi = Abi { functions: vec![request.email_tx_auth.function_abi.clone()] @@ -151,26 +138,29 @@ impl ChainClient { abi, self.client.clone(), ); + let function = request.email_tx_auth.function_abi; let remaining_args = request.email_tx_auth.remaining_args; - // Assuming remaining_args is a Vec of some type that can be converted to tokens - let mut tokens = email_auth_msg.to_tokens(); + // Initialize your tokens vector + let mut tokens = Vec::new(); + + // Add the first token (assuming email_auth_msg.to_tokens() returns Vec) + tokens.push(Token::Tuple(email_auth_msg.to_tokens())); // Convert remaining_args to tokens and add them to the tokens vector for arg in remaining_args { - // Convert each arg to a Token. This conversion depends on the type of arg. - // For example, if arg is a string, you might use Token::String(arg). - // Adjust the conversion based on the actual type of arg. let token = Token::from(arg); tokens.push(token); } + let custom_tokens = CustomTokenVec { tokens }; + // Now you can use the tokens vector to call the contract function - let call = contract.method::<_, ()>(&function.name, tokens)?; + let call = contract.method::<_, ()>(&function.name, custom_tokens)?; - let tx = call.send().await?; - let receipt = tx.await?; + let tx = call.send().await?.await?; + info!(LOG, "tx: {:?}", tx.expect("tx not found").transaction_hash); Ok(()) } diff --git a/packages/relayer/src/dkim.rs b/packages/relayer/src/dkim.rs index 6b62d21a..5cfe3a90 100644 --- a/packages/relayer/src/dkim.rs +++ b/packages/relayer/src/dkim.rs @@ -1,5 +1,6 @@ use std::env; +use abis::ECDSAOwnedDKIMRegistry; use anyhow::anyhow; use chain::ChainClient; use ethers::types::Address; @@ -134,7 +135,7 @@ impl<'a> DkimOracleClient<'a> { /// A `Result<()>`. pub async fn check_and_update_dkim( parsed_email: &ParsedEmail, - email_auth_addr: Address, + dkim: Address, chain_client: ChainClient, relayer_state: RelayerState, ) -> Result<()> { @@ -149,9 +150,7 @@ pub async fn check_and_update_dkim( info!(LOG, "domain {:?}", domain); // Get DKIM - let dkim = chain_client - .get_dkim_from_email_auth(email_auth_addr) - .await?; + let dkim = ECDSAOwnedDKIMRegistry::new(dkim, chain_client.client.clone()); info!(LOG, "dkim {:?}", dkim); @@ -182,13 +181,22 @@ pub async fn check_and_update_dkim( // Generate IC agent and create oracle client let ic_agent = DkimOracleClient::gen_agent( - &env::var(relayer_state.config.path.pem).unwrap(), - &env::var(relayer_state.config.icp.ic_replica_url).unwrap(), - )?; - let oracle_client = DkimOracleClient::new( - &env::var(relayer_state.config.icp.canister_id).unwrap(), - &ic_agent, + &relayer_state.config.path.pem, + &relayer_state.config.icp.ic_replica_url, )?; + info!(LOG, "ic_agent {:?}", ic_agent); + + info!( + LOG, + "icp canister id {:?}", &relayer_state.config.icp.canister_id + ); + info!( + LOG, + "icp replica url {:?}", &relayer_state.config.icp.ic_replica_url + ); + + let oracle_client = DkimOracleClient::new(&relayer_state.config.icp.canister_id, &ic_agent)?; + info!(LOG, "oracle_client {:?}", oracle_client); // Request signature from oracle let oracle_result = oracle_client.request_signature(&selector, &domain).await?; diff --git a/packages/relayer/src/handler.rs b/packages/relayer/src/handler.rs index 5974fd7e..b88b9b02 100644 --- a/packages/relayer/src/handler.rs +++ b/packages/relayer/src/handler.rs @@ -255,7 +255,6 @@ pub async fn get_status_handler( })?; let response = json!({ - "status": "success", "message": "request status", "request": request, }); diff --git a/packages/relayer/src/mail.rs b/packages/relayer/src/mail.rs index 17b41d3d..f006658e 100644 --- a/packages/relayer/src/mail.rs +++ b/packages/relayer/src/mail.rs @@ -147,7 +147,7 @@ pub async fn handle_email_event(event: EmailEvent, relayer_state: RelayerState) "requestId": request_id, }); let body_html = render_html( - "acceptance_success.html", + "completion_template.html", render_data, relayer_state.clone(), ) @@ -216,7 +216,8 @@ pub async fn handle_email_event(event: EmailEvent, relayer_state: RelayerState) "error": error, "userEmailAddr": email_addr, }); - let body_html = render_html("error.html", render_data, relayer_state.clone()).await?; + let body_html = + render_html("error_template.html", render_data, relayer_state.clone()).await?; // Create and send the email let email = EmailMessage { @@ -382,7 +383,7 @@ pub async fn handle_email( check_and_update_dkim( &parsed_email, - request.email_tx_auth.email_auth_contract_address, + request.email_tx_auth.dkim_contract_address, chain_client.clone(), relayer_state.clone(), ) diff --git a/packages/relayer/src/schema.rs b/packages/relayer/src/schema.rs index ae2c7423..baf25333 100644 --- a/packages/relayer/src/schema.rs +++ b/packages/relayer/src/schema.rs @@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize}; #[serde(rename_all = "camelCase")] pub struct EmailTxAuthSchema { pub contract_address: Address, - pub email_auth_contract_address: Address, + pub dkim_contract_address: Address, pub account_code: AccountCode, pub code_exists_in_email: bool, pub function_abi: Function, @@ -24,12 +24,3 @@ pub struct EmailTxAuthSchema { pub body: String, pub chain: String, } - -#[derive(Deserialize, Debug, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DKIMSchema { - dkim_contract_address: Address, - selector: String, - domain: String, - chain: String, -} diff --git a/yarn.lock b/yarn.lock index 711032ec..00cc7d2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4046,9 +4046,9 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -"node-pre-gyp-github@git+https://github.com/ultamatt/node-pre-gyp-github.git": +"node-pre-gyp-github@https://github.com/ultamatt/node-pre-gyp-github.git": version "1.4.3" - resolved "git+https://github.com/ultamatt/node-pre-gyp-github.git#e4961827f77751489bc8d4760a0479f3f985f34f" + resolved "https://github.com/ultamatt/node-pre-gyp-github.git#e4961827f77751489bc8d4760a0479f3f985f34f" dependencies: "@octokit/rest" "^15.9.5" commander "^2.17.0" From 5f5f28e548424d6b446c991e7c9847508b533635 Mon Sep 17 00:00:00 2001 From: Aditya Bisht Date: Wed, 16 Oct 2024 23:07:49 +0700 Subject: [PATCH 121/121] feat: add simulation --- Cargo.lock | 1 + packages/relayer/Cargo.toml | 3 +- packages/relayer/config.example.json | 4 +- packages/relayer/src/chain.rs | 78 ++++++++++++++++++++++++++-- packages/relayer/src/config.rs | 2 + packages/relayer/src/mail.rs | 6 ++- 6 files changed, 86 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a23aac9a..3fc993fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3766,6 +3766,7 @@ dependencies = [ [[package]] name = "relayer-utils" version = "0.3.7" +source = "git+https://github.com/zkemail/relayer-utils.git?branch=main#15ec7417a3ce44b03e448ba31f53889e0793c2b3" dependencies = [ "anyhow", "base64 0.21.7", diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index a9fa0964..66aed43b 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -11,8 +11,7 @@ serde_json = "1.0.128" sqlx = { version = "0.8.2", features = ["postgres", "runtime-tokio", "migrate", "uuid", "time", "chrono"] } tokio = { version = "1.40.0", features = ["full"] } tower-http = { version = "0.6.1", features = ["cors"] } -# relayer-utils = { git = "https://github.com/zkemail/relayer-utils.git", branch = "main" } -relayer-utils = { path = "../../../relayer-utils" } +relayer-utils = { git = "https://github.com/zkemail/relayer-utils.git", branch = "main" } slog = { version = "2.7.0", features = [ "max_level_trace", "release_max_level_warn", diff --git a/packages/relayer/config.example.json b/packages/relayer/config.example.json index ce5da39f..d415c77f 100644 --- a/packages/relayer/config.example.json +++ b/packages/relayer/config.example.json @@ -3,6 +3,7 @@ "databaseUrl": "postgres://test@localhost:5432/relayer", "smtpUrl": "http://localhost:3000", "proverUrl": "https://zkemail--email-auth-prover-v1-4-0-flask-app.modal.run", + "alchemyApiKey": "", "paths": { "pem": "./.ic.pem", "emailTemplates": "./email_templates" @@ -16,7 +17,8 @@ "privateKey": "0x...", "rpcUrl": "https://mainnet.infura.io/v3/...", "explorerUrl": "https://etherscan.io/tx/", - "chainId": 1 + "chainId": 1, + "alchemyName": "base-sepolia" } }, "jsonLogger": true diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index 0555bece..e95224a6 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -9,6 +9,8 @@ use ethers::prelude::*; use ethers::signers::Signer; use ethers::utils::hex; use model::RequestModel; +use relayer_utils::{bytes_to_hex, h160_to_hex, u256_to_hex}; +use slog::error; use statics::SHARED_MUTEX; const CONFIRMATIONS: usize = 1; @@ -120,7 +122,12 @@ impl ChainClient { Ok(is_valid) } - pub async fn call(&self, request: RequestModel, email_auth_msg: EmailAuthMsg) -> Result<()> { + pub async fn call( + &self, + request: RequestModel, + email_auth_msg: EmailAuthMsg, + relayer_state: RelayerState, + ) -> Result<()> { let abi = Abi { functions: vec![request.email_tx_auth.function_abi.clone()] .into_iter() @@ -158,9 +165,74 @@ impl ChainClient { // Now you can use the tokens vector to call the contract function let call = contract.method::<_, ()>(&function.name, custom_tokens)?; + let tx = call.clone().tx; + let from = h160_to_hex(&self.client.address()); + let to = h160_to_hex( + tx.to() + .expect("to not found") + .as_address() + .expect("to not found"), + ); + let data = bytes_to_hex(&tx.data().expect("data not found").to_vec()); + + // Call Alchemy to check for asset changes (Make a POST request to Alchemy) + let alchemy_url = format!( + "https://{}.g.alchemy.com/v2/{}", + relayer_state.config.chains[request.email_tx_auth.chain.as_str()].alchemy_name, + relayer_state.config.alchemy_api_key + ); + + // Prepare the JSON body for the POST request using extracted transaction details + let json_body = serde_json::json!({ + "id": 1, + "jsonrpc": "2.0", + "method": "alchemy_simulateAssetChanges", + "params": [ + { + "from": from, + "to": to, + "value": "0x0", + "data": data, + } + ] + }); + + info!(LOG, "Alchemy request: {:?}", json_body); - let tx = call.send().await?.await?; - info!(LOG, "tx: {:?}", tx.expect("tx not found").transaction_hash); + // Send the POST request + let response = relayer_state + .http_client + .post(&alchemy_url) + .header("accept", "application/json") + .header("content-type", "application/json") + .json(&json_body) + .send() + .await?; + + // Handle the response + if response.status().is_success() { + let response_text = response.text().await?; + info!(LOG, "Alchemy response: {:?}", response_text); + + // Parse the response to check if changes is empty + let response_json: serde_json::Value = serde_json::from_str(&response_text)?; + if let Some(changes) = response_json["result"]["changes"].as_array() { + if !changes.is_empty() { + error!(LOG, "Unexpected changes in Alchemy response: {:?}", changes); + return Err(anyhow!("Unexpected changes in Alchemy response")); + } + } + } else { + let error_text = response.text().await?; + error!(LOG, "Alchemy request failed: {:?}", error_text); + } + + let receipt = call.send().await?.await?; + info!( + LOG, + "tx hash: {:?}", + receipt.expect("tx not found").transaction_hash + ); Ok(()) } diff --git a/packages/relayer/src/config.rs b/packages/relayer/src/config.rs index 05bf998b..c7943d74 100644 --- a/packages/relayer/src/config.rs +++ b/packages/relayer/src/config.rs @@ -12,6 +12,7 @@ pub struct Config { pub database_url: String, pub smtp_url: String, pub prover_url: String, + pub alchemy_api_key: String, pub path: PathConfig, pub icp: IcpConfig, pub chains: HashMap, @@ -39,6 +40,7 @@ pub struct ChainConfig { pub rpc_url: String, pub explorer_url: String, pub chain_id: u32, + pub alchemy_name: String, } // Function to load the configuration from a JSON file diff --git a/packages/relayer/src/mail.rs b/packages/relayer/src/mail.rs index f006658e..c787cb21 100644 --- a/packages/relayer/src/mail.rs +++ b/packages/relayer/src/mail.rs @@ -389,9 +389,11 @@ pub async fn handle_email( ) .await?; - let email_auth_msg = get_email_auth_msg(&email, request.clone(), relayer_state).await?; + let email_auth_msg = get_email_auth_msg(&email, request.clone(), relayer_state.clone()).await?; - chain_client.call(request.clone(), email_auth_msg).await?; + chain_client + .call(request.clone(), email_auth_msg, relayer_state) + .await?; Ok(EmailEvent::Completion { email_addr: parsed_email.get_from_addr()?,