diff --git a/.dockerignore b/.dockerignore index 5961d58c..18eb0a1b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -26,6 +26,7 @@ packages/contracts/test/build_integration/*.json packages/contracts/test/build_integration/*.zkey packages/contracts/test/build_integration/*.wasm packages/contracts/test/build_integration/*.txt +packages/contracts/test/EmailAccountRecoveryZkSync # NFT Relayer packages/nft_relayer/sendgrid.env 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-fmt.yml b/.github/workflows/build-fmt.yml new file mode 100644 index 00000000..96ed4530 --- /dev/null +++ b/.github/workflows/build-fmt.yml @@ -0,0 +1,30 @@ +name: Build and Format + +on: [push] + +jobs: + build-and-format: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - run: rustup show + + - name: Install rustfmt and clippy + run: | + rustup component add rustfmt + rustup component add clippy + + - uses: Swatinem/rust-cache@v2 + + - name: Build and check for warnings + env: + RUSTFLAGS: "-D warnings" + run: cargo build --release + + - name: Check formatting + run: cargo fmt -- --check + + - name: Run clippy + run: cargo clippy -- -D warnings 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/.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/unit-tests.yml b/.github/workflows/unit-tests.yml index 29740de9..261da7ae 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] @@ -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 @@ -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: Build contracts + working-directory: packages/contracts + run: yarn build + + - name: Run tests + working-directory: packages/relayer + run: cargo test diff --git a/.gitignore b/.gitignore index 0ee936ed..bf6b96e7 100644 --- a/.gitignore +++ b/.gitignore @@ -31,32 +31,17 @@ packages/contracts/test/build_integration/*.txt packages/contracts/test/test-proofs packages/contracts/deployments -# NFT Relayer -packages/nft_relayer/sendgrid.env -target -packages/nft_relayer/db/* -packages/nft_relayer/*.db -packages/nft_relayer/received_eml/*.eml -packages/nft_relayer/received_eml/*.json -packages/nft_relayer/proofs -packages/nft_relayer/logs -sql_database.db -.sqlx -.ic.pem - # Relayer -packages/relayer/sendgrid.env 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 -sql_database.db -.sqlx +packages/relayer/config.json .ic.pem +# ABIs +packages/relayer/src/abis/* +!packages/realyer/src/abis/mod.rs + # Prover packages/prover/build/* packages/prover/params/*.zkey @@ -80,6 +65,16 @@ book # Vs code settings .vscode +# Editor settings +.idea + # For zksync zkout .cache + +# Example +example/contracts/artifacts +example/contracts/cache +example/contracts/node_modules +example/scripts/dist +example/contracts/broadcast \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 558dfa58..3fc993fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,18 +14,18 @@ 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" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aes" @@ -45,7 +45,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", "once_cell", "version_check", "zerocopy", @@ -83,15 +82,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -101,21 +100,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "ascii" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" - -[[package]] -name = "ascii" -version = "1.1.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii-canvas" @@ -127,71 +114,25 @@ dependencies = [ ] [[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.3.1" +name = "async-lock" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "concurrent-queue", + "event-listener", "event-listener-strategy", - "futures-core", "pin-project-lite", ] -[[package]] -name = "async-imap" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98892ebee4c05fc66757e600a7466f0d9bfcde338f645d64add323789f26cb36" -dependencies = [ - "async-channel 2.3.1", - "base64 0.21.7", - "bytes", - "chrono", - "futures", - "imap-proto", - "log", - "nom", - "once_cell", - "pin-utils", - "self_cell", - "stop-token", - "thiserror", - "tokio", -] - -[[package]] -name = "async-native-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9343dc5acf07e79ff82d0c37899f079db3534d99f189a1837c8e549c99405bec" -dependencies = [ - "native-tls", - "thiserror", - "tokio", - "url", -] - [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -215,14 +156,10 @@ dependencies = [ ] [[package]] -name = "atomic-write-file" -version = "0.1.4" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf54d4588732bdfc5ebc3eb9f74f20e027112fc31de412fc7ff0cd1c6896dae" -dependencies = [ - "nix", - "rand", -] +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "auto_impl" @@ -232,29 +169,30 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "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" -version = "0.6.20" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" dependencies = [ "async-trait", "axum-core", - "bitflags 1.3.2", "bytes", "futures-util", - "http 0.2.12", - "http-body", - "hyper", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-util", "itoa", "matchit", "memchr", @@ -266,28 +204,33 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.1", "tokio", "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] name = "axum-core" -version = "0.3.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", "futures-util", - "http 0.2.12", - "http-body", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", "mime", + "pin-project-lite", "rustversion", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -303,17 +246,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", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -433,8 +376,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", + "arrayvec 0.7.6", + "constant_time_eq 0.3.1", ] [[package]] @@ -455,20 +398,6 @@ 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" @@ -499,9 +428,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" dependencies = [ "serde", ] @@ -529,9 +458,9 @@ dependencies = [ [[package]] name = "cached" -version = "0.46.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c8c50262271cdf5abc979a5f76515c234e764fa025d1ba4862c0f0bcda0e95" +checksum = "a8466736fe5dbcaf8b8ee24f9bbefe43c884dc3e9ff7178da70f55bffca1133c" dependencies = [ "ahash", "hashbrown 0.14.5", @@ -542,50 +471,46 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" dependencies = [ "serde", ] [[package]] name = "candid" -version = "0.9.11" +version = "0.10.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465c1ce01d8089ee5b49ba20d3a9da15a28bba64c35cdff2aa256d37e319625d" +checksum = "6c30ee7f886f296b6422c0ff017e89dd4f831521dfdcc76f3f71aae1ce817222" dependencies = [ "anyhow", "binread", "byteorder", "candid_derive", - "codespan-reporting", - "crc32fast", - "data-encoding", "hex", + "ic_principal", "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" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201ea498d901add0822653ac94cb0f8a92f9b1758a5273f4dafbb6673c9a5020" +checksum = "3de398570c386726e7a59d9887b68763c481477f9a043fb998a2e09d428df1a9" dependencies = [ "lazy_static", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -613,25 +538,19 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.2" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47de7e88bbbd467951ae7f5a6f34f70d1b4d9cfce53d5fd70f74ebe118b3db56" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "jobserver", "libc", - "once_cell", + "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -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", @@ -660,19 +579,13 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -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", ] @@ -691,12 +604,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "chunked_transfer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" - [[package]] name = "cipher" version = "0.4.4" @@ -707,16 +614,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" @@ -769,29 +666,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "combine" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" -dependencies = [ - "ascii 0.9.3", - "byteorder", - "either", - "memchr", - "unreachable", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - [[package]] name = "concurrent-queue" version = "2.5.0" @@ -813,9 +687,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", @@ -838,9 +712,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 +728,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.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -995,7 +869,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -1045,7 +919,7 @@ checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -1111,12 +985,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - [[package]] name = "dotenvy" version = "0.15.7" @@ -1125,9 +993,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" @@ -1200,9 +1068,9 @@ dependencies = [ "base16ct", "crypto-bigint", "digest 0.10.7", - "ff 0.13.0", + "ff", "generic-array", - "group 0.13.0", + "group", "pem-rfc7468", "pkcs8", "rand_core", @@ -1211,22 +1079,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "email-encoding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a87260449b06739ee78d6281c68d2a0ff3e3af64a78df63d3a1aeb3c06997c8a" -dependencies = [ - "base64 0.22.1", - "memchr", -] - -[[package]] -name = "email_address" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1019fa28f600f5b581b7a603d515c3f1635da041ca211b5055804788673abfe" - [[package]] name = "ena" version = "0.14.3" @@ -1435,10 +1287,10 @@ dependencies = [ "proc-macro2", "quote", "regex", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.71", + "syn 2.0.79", "toml", "walkdir", ] @@ -1456,7 +1308,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -1465,7 +1317,7 @@ version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" dependencies = [ - "arrayvec 0.7.4", + "arrayvec 0.7.6", "bytes", "cargo_metadata", "chrono", @@ -1474,15 +1326,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.79", "tempfile", "thiserror", "tiny-keccak", @@ -1497,7 +1349,7 @@ checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" dependencies = [ "chrono", "ethers-core", - "reqwest", + "reqwest 0.11.27", "semver 1.0.23", "serde", "serde_json", @@ -1522,7 +1374,7 @@ dependencies = [ "futures-locks", "futures-util", "instant", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror", @@ -1554,7 +1406,7 @@ dependencies = [ "jsonwebtoken", "once_cell", "pin-project", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror", @@ -1620,12 +1472,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - [[package]] name = "event-listener" version = "5.3.1" @@ -1643,7 +1489,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.3.1", + "event-listener", "pin-project-lite", ] @@ -1659,38 +1505,20 @@ dependencies = [ [[package]] name = "fancy-regex" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" +checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" dependencies = [ "bit-set", - "regex", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", + "regex-automata", + "regex-syntax", ] [[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,9 +1567,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", @@ -1798,21 +1626,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" @@ -1821,9 +1634,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", @@ -1836,9 +1649,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", @@ -1846,15 +1659,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", @@ -1869,14 +1682,14 @@ checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.12.3", + "parking_lot", ] [[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" @@ -1890,26 +1703,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.71", + "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" @@ -1923,9 +1736,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", @@ -1974,9 +1787,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" @@ -1996,83 +1809,13 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "graphql-introspection-query" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2a4732cf5140bd6c082434494f785a19cfb566ab07d1382c3671f5812fed6d" -dependencies = [ - "serde", -] - -[[package]] -name = "graphql-parser" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ebc8013b4426d5b81a4364c419a95ed0b404af2b82e2457de52d9348f0e474" -dependencies = [ - "combine 3.8.1", - "thiserror", -] - -[[package]] -name = "graphql_client" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cdf7b487d864c2939b23902291a5041bc4a84418268f25fda1c8d4e15ad8fa" -dependencies = [ - "graphql_query_derive", - "reqwest", - "serde", - "serde_json", -] - -[[package]] -name = "graphql_client_codegen" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40f793251171991c4eb75bd84bc640afa8b68ff6907bc89d3b712a22f700506" -dependencies = [ - "graphql-introspection-query", - "graphql-parser", - "heck 0.4.1", - "lazy_static", - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn 1.0.109", -] - -[[package]] -name = "graphql_query_derive" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00bda454f3d313f909298f626115092d348bc231025699f557b27e248475f48c" -dependencies = [ - "graphql_client_codegen", - "proc-macro2", - "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,7 +1832,26 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.2.6", + "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", @@ -2104,40 +1866,19 @@ 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#8771fe5a5d54fc03e74dbc8915db5dad3ab46a83" dependencies = [ "blake2", "digest 0.10.7", - "ff 0.13.0", - "group 0.13.0", + "ff", + "group", "halo2derive", "lazy_static", "num-bigint", "num-integer", "num-traits", - "pairing 0.23.0", + "pairing", "pasta_curves", "paste", "rand", @@ -2152,7 +1893,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#8771fe5a5d54fc03e74dbc8915db5dad3ab46a83" dependencies = [ "num-bigint", "num-integer", @@ -2164,9 +1905,9 @@ dependencies = [ [[package]] name = "handlebars" -version = "4.5.0" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" +checksum = "ce25b617d1375ef96eeb920ae717e3da34a02fc979fe632c75128350f9e1f74a" dependencies = [ "log", "pest", @@ -2192,6 +1933,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" @@ -2203,9 +1950,9 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ "hashbrown 0.14.5", ] @@ -2215,9 +1962,6 @@ name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] [[package]] name = "heck" @@ -2231,6 +1975,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" @@ -2255,6 +2005,11 @@ dependencies = [ "digest 0.10.7", ] +[[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" @@ -2308,11 +2063,34 @@ 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" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -2330,20 +2108,41 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", - "http-body", + "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio", "tower-service", "tracing", "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", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -2352,10 +2151,28 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper", - "rustls", + "hyper 0.14.30", + "rustls 0.21.12", "tokio", - "tokio-rustls", + "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", + "webpki-roots 0.26.6", ] [[package]] @@ -2365,17 +2182,52 @@ 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-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-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +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-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", @@ -2396,30 +2248,32 @@ dependencies = [ [[package]] name = "ic-agent" -version = "0.30.2" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "263d5c7b295ba69eac0692e6f6b35a01ca323889d10612c0f8c8fd223b0bfec5" +checksum = "3fd3fdf5e5c4f4a9fe5ca612f0febd22dcb161d2f2b75b0142326732be5e4978" dependencies = [ + "async-lock", "backoff", "cached", "candid", "ed25519-consensus", "futures-util", "hex", - "http 0.2.12", - "http-body", + "http 1.1.0", + "http-body 1.0.1", "ic-certification", "ic-transport-types", "ic-verify-bls-signature", "k256", "leb128", - "pem 2.0.1", + "p256", + "pem 3.0.4", "pkcs8", "rand", "rangemap", - "reqwest", - "ring 0.16.20", - "rustls-webpki", + "reqwest 0.12.8", + "ring 0.17.8", + "rustls-webpki 0.102.8", "sec1", "serde", "serde_bytes", @@ -2435,9 +2289,9 @@ dependencies = [ [[package]] name = "ic-certification" -version = "1.3.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c04340437a32c8b9c80d36f09715909c1e0a755327503a2e2906dcd662ba4e" +checksum = "e64ee3d8b6e81b51f245716d3e0badb63c283c00f3c9fb5d5219afc30b5bf821" dependencies = [ "hex", "serde", @@ -2447,9 +2301,9 @@ dependencies = [ [[package]] name = "ic-transport-types" -version = "0.30.2" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2be3fc4f0641a8c3967fbc8ab52b08bc6d13bf65fb2460b090710374be49b1" +checksum = "875dc4704780383112e8e8b5063a1b98de114321d0c7d3e7f635dcf360a57fba" dependencies = [ "candid", "hex", @@ -2464,73 +2318,86 @@ dependencies = [ [[package]] name = "ic-utils" -version = "0.30.2" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd6fac62c95df9f963c8a941431d86308c864ba1e9001da75843d79a355fb68" +checksum = "2fa832296800758c9c921dd1704985ded6b3e6fbc3aee409727eb1f00d69a595" dependencies = [ "async-trait", "candid", + "futures-util", "ic-agent", "once_cell", "semver 1.0.23", "serde", "serde_bytes", - "strum 0.24.1", - "strum_macros 0.24.3", + "sha2 0.10.8", + "strum", + "strum_macros", "thiserror", "time", + "tokio", ] [[package]] name = "ic-verify-bls-signature" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583b1c03380cf86059160cc6c91dcbf56c7b5f141bf3a4f06bc79762d775fac4" +checksum = "d420b25c0091059f6c3c23a21427a81915e6e0aca3b79e0d403ed767f286a3b9" dependencies = [ - "bls12_381", + "hex", + "ic_bls12_381", "lazy_static", - "pairing 0.22.0", - "sha2 0.9.9", + "pairing", + "rand", + "sha2 0.10.8", ] [[package]] -name = "idna" -version = "0.2.3" +name = "ic_bls12_381" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "22c65787944f32af084dffd0c68c1e544237b76e215654ddea8cd9f527dd8b69" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "digest 0.10.7", + "ff", + "group", + "pairing", + "rand_core", + "subtle", ] [[package]] -name = "idna" -version = "0.3.0" +name = "ic_principal" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "1762deb6f7c8d8c2bdee4b6c5a47b60195b74e9b5280faa5ba29692f8e17429c" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "crc32fast", + "data-encoding", + "serde", + "sha2 0.10.8", + "thiserror", ] [[package]] name = "idna" -version = "0.5.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ + "matches", "unicode-bidi", "unicode-normalization", ] [[package]] -name = "imap-proto" -version = "0.16.5" +name = "idna" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de555d9526462b6f9ece826a26fb7c67eca9a0245bd9ff84fa91972a5d5d8856" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "nom", + "unicode-bidi", + "unicode-normalization", ] [[package]] @@ -2589,12 +2456,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -2621,7 +2488,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.7", + "socket2", "widestring", "windows-sys 0.48.0", "winreg", @@ -2629,17 +2496,17 @@ 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" -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", ] @@ -2663,47 +2530,34 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jni" -version = "0.21.1" +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ - "cesu8", - "cfg-if", - "combine 4.6.7", - "jni-sys", - "log", - "thiserror", - "walkdir", - "windows-sys 0.45.0", + "either", ] [[package]] -name = "jni-sys" -version = "0.3.0" +name = "itoa" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[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", ] @@ -2724,9 +2578,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", @@ -2790,37 +2644,11 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" -[[package]] -name = "lettre" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bd09637ae3ec7bd605b8e135e757980b3968430ff2b1a4a94fb7769e50166d" -dependencies = [ - "async-trait", - "base64 0.21.7", - "email-encoding", - "email_address", - "fastrand 1.9.0", - "futures-io", - "futures-util", - "hostname", - "httpdate", - "idna 0.3.0", - "mime", - "native-tls", - "nom", - "once_cell", - "quoted_printable 0.4.8", - "socket2 0.4.10", - "tokio", - "tokio-native-tls", -] - [[package]] name = "libc" -version = "0.2.155" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libloading" @@ -2850,9 +2678,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.27.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ "cc", "pkg-config", @@ -2898,22 +2726,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", -] - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", + "quoted_printable", ] [[package]] @@ -2934,16 +2753,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" @@ -2966,6 +2775,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" @@ -2974,22 +2793,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "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]] @@ -3009,12 +2829,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - [[package]] name = "neon" version = "0.10.1" @@ -3062,18 +2876,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nix" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "cfg_aliases", - "libc", -] - [[package]] name = "nom" version = "7.1.3" @@ -3092,7 +2894,6 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", - "rand", "serde", ] @@ -3156,95 +2957,45 @@ 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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.71", -] - -[[package]] -name = "oauth2" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c38841cdd844847e3e7c8d29cef9dcfed8877f8f56f9071f77843ecf3baf937f" -dependencies = [ - "base64 0.13.1", - "chrono", - "getrandom", - "http 0.2.12", - "rand", - "reqwest", - "serde", - "serde_json", - "serde_path_to_error", - "sha2 0.10.8", - "thiserror", - "url", -] - -[[package]] -name = "objc" -version = "0.2.7" +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "malloc_buf", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] name = "object" -version = "0.36.1" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +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 = "opaque-debug" @@ -3258,7 +3009,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" dependencies = [ - "arrayvec 0.7.4", + "arrayvec 0.7.6", "auto_impl", "bytes", "ethereum-types", @@ -3279,9 +3030,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 +3051,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -3311,9 +3062,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", @@ -3328,12 +3079,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] -name = "pairing" -version = "0.22.0" +name = "p256" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ - "group 0.12.1", + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.8", ] [[package]] @@ -3342,7 +3096,7 @@ 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 +3105,7 @@ version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ - "arrayvec 0.7.4", + "arrayvec 0.7.6", "bitvec", "byte-slice-cast", "impl-trait-for-tuples", @@ -3365,7 +3119,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", @@ -3373,20 +3127,9 @@ dependencies = [ [[package]] name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.11.2" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -3395,21 +3138,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core 0.9.10", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -3420,7 +3149,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.2", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -3443,8 +3172,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", @@ -3496,11 +3225,11 @@ dependencies = [ [[package]] name = "pem" -version = "2.0.1" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b13fe415cdf3c8e44518e18a7c95a13431d9bdf6d15367d82b23c377fdd441a" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "serde", ] @@ -3521,9 +3250,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.11" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" +checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" dependencies = [ "memchr", "thiserror", @@ -3532,9 +3261,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.11" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" +checksum = "4d3a6e3394ec80feb3b6393c725571754c6188490265c61aaf260810d6b95aa0" dependencies = [ "pest", "pest_generator", @@ -3542,22 +3271,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.11" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" +checksum = "94429506bde1ca69d1b5601962c73f4172ab4726571a59ea95931218cb0e930e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] name = "pest_meta" -version = "2.7.11" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" +checksum = "ac8a071862e93690b6e34e9a5fb8e33ff3734473ac0245b27232222c4906a33f" dependencies = [ "once_cell", "pest", @@ -3571,7 +3300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.2.6", + "indexmap 2.6.0", ] [[package]] @@ -3614,7 +3343,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -3637,22 +3366,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.71", + "syn 2.0.79", ] [[package]] @@ -3690,17 +3419,17 @@ 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" -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 +3443,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" @@ -3737,12 +3469,21 @@ dependencies = [ [[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.79", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", ] [[package]] @@ -3761,28 +3502,18 @@ 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]] 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", ] @@ -3805,9 +3536,9 @@ dependencies = [ [[package]] name = "psm" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" dependencies = [ "cc", ] @@ -3825,25 +3556,67 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] -name = "quote" -version = "1.0.36" +name = "quinn" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" dependencies = [ - "proc-macro2", + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.14", + "socket2", + "thiserror", + "tokio", + "tracing", ] [[package]] -name = "quoted_printable" -version = "0.4.8" +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" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3866219251662ec3b26fc217e3e05bf9c4f84325234dfb96bf0bf840889e49" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] [[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" @@ -3896,12 +3669,6 @@ 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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - [[package]] name = "rayon" version = "1.10.0" @@ -3924,36 +3691,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -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.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" 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 +3711,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", @@ -3974,9 +3723,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", @@ -3985,84 +3734,62 @@ 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" -version = "1.1.0" +version = "0.1.0" dependencies = [ "anyhow", - "async-imap", - "async-native-tls", - "async-trait", "axum", - "base64 0.21.7", "candid", "chrono", - "dotenv", "ethers", - "ff 0.13.0", - "file-rotate", - "function_name", - "futures", - "graphql_client", "handlebars", - "hex", - "http 1.1.0", "ic-agent", "ic-utils", "lazy_static", - "lettre", - "num-bigint", - "num-traits", - "oauth2", - "rand", "regex", "relayer-utils", - "reqwest", + "reqwest 0.12.8", "serde", "serde_json", - "sled", "slog", - "slog-async", - "slog-json", - "slog-term", "sqlx", - "tiny_http", "tokio", "tower-http", "uuid 1.10.0", - "webbrowser", ] [[package]] name = "relayer-utils" -version = "0.1.0" -source = "git+https://github.com/zkemail/relayer-utils?rev=2c3e9b8#2c3e9b80ae043cd038cd5c55279c60b1578587f7" +version = "0.3.7" +source = "git+https://github.com/zkemail/relayer-utils.git?branch=main#15ec7417a3ce44b03e448ba31f53889e0793c2b3" dependencies = [ "anyhow", "base64 0.21.7", "cfdkim", "ethers", - "fancy-regex", "file-rotate", - "halo2curves 0.4.0", + "halo2curves", "hex", + "hmac-sha256", "itertools 0.10.5", "lazy_static", + "mailparse", "neon", "num-bigint", "num-traits", "once_cell", "poseidon-rs", "rand_core", + "regex", + "reqwest 0.11.27", "rsa", "serde", "serde_json", - "serde_regex", - "sha2 0.10.8", "slog", "slog-async", "slog-json", @@ -4082,12 +3809,59 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", - "http-body", - "hyper", - "hyper-rustls", - "hyper-tls", + "http-body 0.4.6", + "hyper 0.14.30", + "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 0.21.12", + "rustls-pemfile 1.0.4", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.4", + "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-channel", + "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", @@ -4096,16 +3870,18 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls", - "rustls-pemfile", + "quinn", + "rustls 0.23.14", + "rustls-pemfile 2.2.0", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", - "system-configuration", + "sync_wrapper 1.0.1", + "system-configuration 0.6.1", "tokio", "tokio-native-tls", - "tokio-rustls", + "tokio-rustls 0.26.0", "tokio-util", "tower-service", "url", @@ -4113,8 +3889,8 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots", - "winreg", + "webpki-roots 0.26.6", + "windows-registry", ] [[package]] @@ -4226,6 +4002,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" @@ -4234,18 +4016,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.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -4262,10 +4044,24 @@ 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", + "ring 0.17.8", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -4275,6 +4071,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" @@ -4285,6 +4096,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" @@ -4333,7 +4155,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", @@ -4341,11 +4163,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4398,9 +4220,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,20 +4233,14 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", ] -[[package]] -name = "self_cell" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" - [[package]] name = "semver" version = "0.9.0" @@ -4463,9 +4279,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.204" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] @@ -4502,22 +4318,23 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -4532,16 +4349,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" @@ -4550,14 +4357,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] name = "serde_spanned" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -4630,6 +4437,12 @@ dependencies = [ "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" @@ -4676,22 +4489,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "sled" -version = "0.34.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" -dependencies = [ - "crc32fast", - "crossbeam-epoch", - "crossbeam-utils", - "fs2", - "fxhash", - "libc", - "log", - "parking_lot 0.11.2", -] - [[package]] name = "slog" version = "2.7.0" @@ -4740,15 +4537,8 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ - "libc", - "winapi", + "serde", ] [[package]] @@ -4802,9 +4592,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", @@ -4812,9 +4602,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" +checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" dependencies = [ "sqlx-core", "sqlx-macros", @@ -4825,27 +4615,27 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" +checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" dependencies = [ - "ahash", "atoi", "byteorder", "bytes", + "chrono", "crc", "crossbeam-queue", - "dotenvy", "either", - "event-listener 2.5.3", + "event-listener", "futures-channel", "futures-core", "futures-intrusive", "futures-io", "futures-util", + "hashbrown 0.14.5", "hashlink", "hex", - "indexmap 2.2.6", + "indexmap 2.6.0", "log", "memchr", "once_cell", @@ -4857,35 +4647,36 @@ dependencies = [ "smallvec", "sqlformat", "thiserror", + "time", "tokio", "tokio-stream", "tracing", "url", + "uuid 1.10.0", ] [[package]] name = "sqlx-macros" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" +checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 1.0.109", + "syn 2.0.79", ] [[package]] name = "sqlx-macros-core" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" +checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" dependencies = [ - "atomic-write-file", "dotenvy", "either", - "heck 0.4.1", + "heck 0.5.0", "hex", "once_cell", "proc-macro2", @@ -4897,7 +4688,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 1.0.109", + "syn 2.0.79", "tempfile", "tokio", "url", @@ -4905,15 +4696,16 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" +checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" dependencies = [ "atoi", - "base64 0.21.7", + "base64 0.22.1", "bitflags 2.6.0", "byteorder", "bytes", + "chrono", "crc", "digest 0.10.7", "dotenvy", @@ -4941,20 +4733,23 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror", + "time", "tracing", + "uuid 1.10.0", "whoami", ] [[package]] name = "sqlx-postgres" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" +checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" dependencies = [ "atoi", - "base64 0.21.7", + "base64 0.22.1", "bitflags 2.6.0", "byteorder", + "chrono", "crc", "dotenvy", "etcetera", @@ -4974,23 +4769,25 @@ dependencies = [ "rand", "serde", "serde_json", - "sha1", "sha2 0.10.8", "smallvec", "sqlx-core", "stringprep", "thiserror", + "time", "tracing", + "uuid 1.10.0", "whoami", ] [[package]] name = "sqlx-sqlite" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" +checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" dependencies = [ "atoi", + "chrono", "flume", "futures-channel", "futures-core", @@ -5001,23 +4798,25 @@ dependencies = [ "log", "percent-encoding", "serde", + "serde_urlencoded", "sqlx-core", + "time", "tracing", "url", - "urlencoding", + "uuid 1.10.0", ] [[package]] name = "stacker" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" +checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" dependencies = [ "cc", "cfg-if", "libc", "psm", - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -5026,18 +4825,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "stop-token" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af91f480ee899ab2d9f8435bfdfc14d08a5754bd9d3fef1f1a1c23336aad6c8b" -dependencies = [ - "async-channel 1.9.0", - "cfg-if", - "futures-core", - "pin-project-lite", -] - [[package]] name = "string_cache" version = "0.8.7" @@ -5046,7 +4833,7 @@ checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot 0.12.3", + "parking_lot", "phf_shared 0.10.0", "precomputed-hash", ] @@ -5062,32 +4849,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 +4868,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -5125,7 +4893,7 @@ dependencies = [ "fs2", "hex", "once_cell", - "reqwest", + "reqwest 0.11.27", "semver 1.0.23", "serde", "serde_json", @@ -5148,9 +4916,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.71" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -5174,6 +4942,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" @@ -5182,7 +4959,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]] @@ -5195,6 +4983,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" @@ -5209,14 +5007,15 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", - "fastrand 2.1.0", + "fastrand", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5230,33 +5029,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.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.62" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -5309,18 +5099,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "tiny_http" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" -dependencies = [ - "ascii 1.1.0", - "chunked_transfer", - "httpdate", - "log", -] - [[package]] name = "tinyvec" version = "1.8.0" @@ -5338,32 +5116,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", + "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.7", + "socket2", "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.79", ] [[package]] @@ -5382,15 +5159,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", @@ -5405,18 +5193,18 @@ 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]] 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", @@ -5427,70 +5215,48 @@ 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.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.13", + "winnow", ] [[package]] name = "tower" -version = "0.4.13" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper 0.1.2", "tokio", "tower-layer", "tower-service", @@ -5499,15 +5265,13 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.4.2" -source = "git+https://github.com/tower-rs/tower-http.git?rev=f33c3e038dc85b8d064541e915d501f9c9e6a6b4#f33c3e038dc85b8d064541e915d501f9c9e6a6b4" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8437150ab6bbc8c5f0f519e3d5ed4aa883a83dd4cdd3d1b21f9482936046cb97" dependencies = [ "bitflags 2.6.0", "bytes", - "futures-core", - "futures-util", - "http 0.2.12", - "http-body", + "http 1.1.0", "pin-project-lite", "tower-layer", "tower-service", @@ -5515,15 +5279,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 +5309,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -5603,7 +5367,7 @@ dependencies = [ "ipconfig", "lazy_static", "lru-cache", - "parking_lot 0.12.3", + "parking_lot", "resolv-conf", "smallvec", "thiserror", @@ -5631,7 +5395,7 @@ dependencies = [ "httparse", "log", "rand", - "rustls", + "rustls 0.21.12", "sha1", "thiserror", "url", @@ -5652,9 +5416,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -5676,48 +5440,42 @@ 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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unicode_categories" @@ -5725,15 +5483,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -dependencies = [ - "void", -] - [[package]] name = "unroll" version = "0.1.5" @@ -5765,15 +5514,8 @@ dependencies = [ "form_urlencoded", "idna 0.5.0", "percent-encoding", - "serde", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "utf-8" version = "0.7.6" @@ -5795,6 +5537,10 @@ name = "uuid" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +dependencies = [ + "getrandom", + "serde", +] [[package]] name = "vcpkg" @@ -5804,15 +5550,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "void" -version = "1.0.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" @@ -5847,11 +5587,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 +5600,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.79", "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 +5627,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 +5637,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.79", "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,20 +5671,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", + "syn 2.0.79", ] [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" dependencies = [ "futures-util", "js-sys", @@ -5953,44 +5695,36 @@ dependencies = [ [[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", ] [[package]] -name = "webbrowser" -version = "0.8.15" +name = "webpki-roots" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b" -dependencies = [ - "core-foundation", - "home", - "jni", - "log", - "ndk-context", - "objc", - "raw-window-handle", - "url", - "web-sys", -] +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.25.4" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +dependencies = [ + "rustls-pki-types", +] [[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", "wasite", ] @@ -6018,11 +5752,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]] @@ -6041,12 +5775,33 @@ dependencies = [ ] [[package]] -name = "windows-sys" -version = "0.45.0" +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 = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-targets 0.42.2", + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -6068,18 +5823,12 @@ dependencies = [ ] [[package]] -name = "windows-targets" -version = "0.42.2" +name = "windows-sys" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.52.6", ] [[package]] @@ -6113,12 +5862,6 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -6131,12 +5874,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -6149,12 +5886,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -6173,12 +5904,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -6191,12 +5916,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -6209,12 +5928,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -6227,12 +5940,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -6247,18 +5954,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.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -6313,6 +6011,7 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] @@ -6324,7 +6023,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.79", ] [[package]] @@ -6355,11 +6054,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#531575345558ba938675d725bd54df45c866ef74" dependencies = [ "fancy-regex", - "itertools 0.10.5", + "itertools 0.13.0", "js-sys", "serde", "serde-wasm-bindgen", @@ -6390,9 +6089,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/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" 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"] 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/Relayer.Dockerfile b/Relayer.Dockerfile index fd362f3b..1dafb15e 100644 --- a/Relayer.Dockerfile +++ b/Relayer.Dockerfile @@ -1,5 +1,5 @@ # Use the base image -FROM bisht13/ar-relayer-base:latest +FROM bisht13/relayer-base # 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/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/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/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 new file mode 100644 index 00000000..69f56e22 --- /dev/null +++ b/example/contracts/src/EmitEmailCommand.sol @@ -0,0 +1,216 @@ +// 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 { + 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 + ); + + 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. + 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("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[][](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] = "address"; // Fixed typo: "adddress" to "address" + 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/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 new file mode 100644 index 00000000..a3ba3471 --- /dev/null +++ b/example/scripts/package.json @@ -0,0 +1,106 @@ +{ + "name": "@zk-email/ether-email-auth-example-scripts", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "install": "yarn build", + "build": "npx tsc" + }, + "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", + "@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" + } + } +} diff --git a/example/scripts/src/main.ts b/example/scripts/src/main.ts new file mode 100644 index 00000000..b293ae11 --- /dev/null +++ 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/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..c770b5f0 --- /dev/null +++ b/example/scripts/yarn.lock @@ -0,0 +1,6214 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# 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" + 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== + +"@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" + 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== + +"@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" + 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" + +"@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" + 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" + +"@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" + 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" + +"@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" + 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== + +"@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" + 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== + +"@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" + 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== + +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" + 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" + +"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" + 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== + +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" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + 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" + 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== + +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" + 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" + +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" + 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" + +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" + 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" + +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" + 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== + +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" + 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== + +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" + 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" + +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" + 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== + +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" + 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== + +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" + 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@^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" + 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.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.0.0" + +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: + 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" + +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" + 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" + +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== + 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== + +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" + 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== + +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" + 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" + +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" + 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== + +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" + 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@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== + +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@^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" + 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== + +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" + 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, 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" + 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" + +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" + 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== + +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" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + 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" + 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== + +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" + 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@^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" + 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" + +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" + 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== + +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" + 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== + +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" + 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@^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" + 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== + +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" + 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-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" + 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== + +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" + 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" + +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" + 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, lodash@^4.17.4: + 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" + +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" + 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" + 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" + 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" + +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" + 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== + +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" + 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== + +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== + +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" + 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" + 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" + 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, 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== + 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.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" + 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-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" + 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-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" + 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== + +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" + 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@^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" + 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== + +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" + 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" + +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" + 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== + +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.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== + 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", "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== + +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.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" + 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@^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" + 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" + 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" + 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.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== + +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== + +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" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +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== + +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" + +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" + 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@^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== + 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-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" + 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== + +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" + 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== + +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" + 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-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" + 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" + +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" + 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== + +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" + 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" + +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" + 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" + +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" + 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" + 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" + 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" + +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" + 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@^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" + 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" + 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== + +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" + +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" + 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== + +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" + 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== diff --git a/kubernetes/cloudbuild-base.yml b/kubernetes/cloudbuild-base.yml new file mode 100644 index 00000000..0bd58620 --- /dev/null +++ b/kubernetes/cloudbuild-base.yml @@ -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/kubernetes/cloudbuild-relayer.yml b/kubernetes/cloudbuild-relayer.yml new file mode 100644 index 00000000..baab474d --- /dev/null +++ b/kubernetes/cloudbuild-relayer.yml @@ -0,0 +1,21 @@ +options: + machineType: 'N1_HIGHCPU_32' +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:v2', + '-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:v2', + ] 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.staging.yml b/kubernetes/relayer.staging.yml new file mode 100644 index 00000000..cf985be4 --- /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: "" + REGEX_JSON_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:v2 + 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 4a5b6448..d4edc713 100644 --- a/kubernetes/relayer.yml +++ b/kubernetes/relayer.yml @@ -11,12 +11,13 @@ data: CHAIN_RPC_EXPLORER: "" CHAIN_ID: "" WEB_SERVER_ADDRESS: "" - CIRCUITS_DIR_PATH: "" + REGEX_JSON_DIR_PATH: "" EMAIL_TEMPLATES_PATH: "" CANISTER_ID: "" 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-3: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 @@ -119,7 +114,7 @@ spec: mountPath: "/relayer/packages/relayer/.ic.pem" subPath: ".ic.pem" - name: smtp-container - image: bisht13/relayer-smtp-new:latest + image: bisht13/relayer-smtp:latest ports: - containerPort: 8080 envFrom: @@ -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 @@ -144,6 +133,30 @@ spec: - key: ICPEM path: ".ic.pem" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: relayer-imap + namespace: ar-base-sepolia + labels: + app: relayer +spec: + selector: + matchLabels: + app: relayer-imap + template: + metadata: + labels: + app: relayer-imap + spec: + containers: + - name: imap-container + image: bisht13/relayer-imap-new:latest + envFrom: + - secretRef: + name: relayer-imap-secret + --- apiVersion: v1 kind: Service 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/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/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 99f7d7fe..a563ac3c 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -4,14 +4,15 @@ "version": "1.0.0", "scripts": { "build": "mkdir -p build && circom src/email_auth.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", + "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=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" }, "dependencies": { "@zk-email/circuits": "=6.1.5", - "@zk-email/relayer-utils": "=0.2.4", + "@zk-email/relayer-utils": "=0.3.7", "@zk-email/zk-regex-circom": "=2.1.1", "commander": "^11.0.0", "snarkjs": "^0.7.4" diff --git a/packages/circuits/scripts/dev-setup.ts b/packages/circuits/scripts/dev-setup.ts index e8466c31..de0c7175 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(); @@ -40,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"); @@ -135,19 +140,34 @@ 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); - const emailAuthR1csPath = path.join(buildDir, "email_auth.r1cs"); - if (!fs.existsSync(emailAuthR1csPath)) { - throw new Error(`${emailAuthR1csPath} does not exist.`); + 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.`); + } + 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.`); + } + 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/circuits/scripts/gen_input.ts b/packages/circuits/scripts/gen_input.ts index 899ea05d..66350409 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"); @@ -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,49 @@ 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 genEmailAuthInput(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, + shaPrecomputeSelector: '(
]*>)' + }); + console.log(circuitInputs.padded_body.length); + 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/circuits/src/email_auth_template.circom b/packages/circuits/src/email_auth_template.circom index 13069d82..9a07d485 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 @@ -46,7 +46,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; @@ -55,7 +55,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; @@ -69,7 +69,6 @@ template EmailAuth(n, k, max_header_bytes, max_subject_bytes, recipient_enabled) 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 @@ -182,7 +181,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 +// * 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 +// * 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. + 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 + signal input command_idx; // index of the command in the body + /// 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); + 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_command[command_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, is_qp_encoded, 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; + if (is_qp_encoded == 1) { + email_verifier.decodedEmailBodyIn <== padded_cleaned_body; + } + 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 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); + + // 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 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); + + 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]; + 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; + + // Extract the command from the body + 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 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 <== 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 <== 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]; + } + signal masked_command_bytes[max_command_bytes]; + for(var i = 0; i < max_command_bytes; 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_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); + } + is_code_exist * (1 - code_regex_out) === 0; + signal replaced_code_regex_reveal[max_body_bytes]; + for(var i=0; i]*>)" }, { "is_public": true, - "regex_def": "[0-9]+" + "regex_def": "[^<>/]+" }, { "is_public": false, - "regex_def": "." + "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..3c4de75f --- /dev/null +++ b/packages/circuits/src/regexes/command_regex.circom @@ -0,0 +1,1365 @@ +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[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 < 56; i++) { + states[0][i] <== 0; + } + + for (var i = 0; i < num_bytes; i++) { + state_changed[i] = MultiOR(55); + 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[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[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] <== 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; + 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[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[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[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[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] <== 125; + eq[12][i] = IsEqual(); + eq[12][i].in[0] <== in[i]; + eq[12][i].in[1] <== 126; + eq[13][i] = IsEqual(); + eq[13][i].in[0] <== in[i]; + 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[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] <== 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] <== 110; + eq[17][i] = IsEqual(); + eq[17][i].in[0] <== in[i]; + eq[17][i].in[1] <== 111; + eq[18][i] = IsEqual(); + eq[18][i].in[0] <== in[i]; + eq[18][i].in[1] <== 112; + eq[19][i] = IsEqual(); + eq[19][i].in[0] <== in[i]; + eq[19][i].in[1] <== 113; + eq[20][i] = IsEqual(); + eq[20][i].in[0] <== in[i]; + eq[20][i].in[1] <== 114; + eq[21][i] = IsEqual(); + eq[21][i].in[0] <== in[i]; + eq[21][i].in[1] <== 115; + eq[22][i] = IsEqual(); + eq[22][i].in[0] <== in[i]; + eq[22][i].in[1] <== 116; + eq[23][i] = IsEqual(); + eq[23][i].in[0] <== in[i]; + eq[23][i].in[1] <== 117; + eq[24][i] = IsEqual(); + eq[24][i].in[0] <== in[i]; + eq[24][i].in[1] <== 119; + eq[25][i] = IsEqual(); + eq[25][i].in[0] <== in[i]; + eq[25][i].in[1] <== 120; + eq[26][i] = IsEqual(); + eq[26][i].in[0] <== in[i]; + 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] <== 106; + eq[28][i] = IsEqual(); + eq[28][i].in[0] <== in[i]; + 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][21]; + and[46][i].b <== eq[29][i].out; + and[47][i] = AND(); + and[47][i].a <== states[i][22]; + and[47][i].b <== eq[29][i].out; + and[48][i] = AND(); + 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] <== 225; + eq[31][i] = IsEqual(); + eq[31][i].in[0] <== in[i]; + eq[31][i].in[1] <== 226; + eq[32][i] = IsEqual(); + eq[32][i].in[0] <== in[i]; + eq[32][i].in[1] <== 227; + eq[33][i] = IsEqual(); + eq[33][i].in[0] <== in[i]; + eq[33][i].in[1] <== 228; + eq[34][i] = IsEqual(); + eq[34][i].in[0] <== in[i]; + eq[34][i].in[1] <== 229; + eq[35][i] = IsEqual(); + eq[35][i].in[0] <== in[i]; + eq[35][i].in[1] <== 230; + eq[36][i] = IsEqual(); + eq[36][i].in[0] <== in[i]; + eq[36][i].in[1] <== 231; + eq[37][i] = IsEqual(); + eq[37][i].in[0] <== in[i]; + eq[37][i].in[1] <== 232; + eq[38][i] = IsEqual(); + eq[38][i].in[0] <== in[i]; + eq[38][i].in[1] <== 233; + eq[39][i] = IsEqual(); + eq[39][i].in[0] <== in[i]; + 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 <== 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[28][i].out; + and[51][i].b <== lt[29][i].out; + and[52][i] = AND(); + and[52][i].a <== states[i][16]; + and[52][i].b <== and[51][i].out; + and[53][i] = AND(); + 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][18]; + multi_or[11][i] = MultiOR(16); + 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][19]; + and[55][i].b <== multi_or[10][i].out; + and[56][i] = AND(); + 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][21]; + and[57][i].b <== multi_or[10][i].out; + and[58][i] = AND(); + 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][23]; + and[59][i].b <== multi_or[10][i].out; + and[60][i] = AND(); + 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][11]; + and[61][i].b <== eq[60][i].out; + and[62][i] = AND(); + and[62][i].a <== states[i][19]; + and[62][i].b <== eq[60][i].out; + and[63][i] = AND(); + 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][21]; + and[64][i].b <== eq[60][i].out; + and[65][i] = AND(); + 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][23]; + and[66][i].b <== eq[60][i].out; + and[67][i] = AND(); + 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][11]; + and[68][i].b <== eq[61][i].out; + and[69][i] = AND(); + 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][20]; + and[70][i].b <== eq[61][i].out; + and[71][i] = AND(); + 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][22]; + and[72][i].b <== eq[61][i].out; + and[73][i] = AND(); + 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][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 <== 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][19]; + and[76][i].b <== multi_or[15][i].out; + and[77][i] = AND(); + 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][21]; + and[78][i].b <== multi_or[15][i].out; + and[79][i] = AND(); + 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][23]; + and[80][i].b <== multi_or[15][i].out; + and[81][i] = AND(); + 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][11]; + and[82][i].b <== eq[65][i].out; + and[83][i] = AND(); + and[83][i].a <== states[i][19]; + and[83][i].b <== eq[65][i].out; + and[84][i] = AND(); + 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][21]; + and[85][i].b <== eq[65][i].out; + and[86][i] = AND(); + 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][23]; + and[87][i].b <== eq[65][i].out; + and[88][i] = AND(); + 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][11]; + and[89][i].b <== eq[66][i].out; + and[90][i] = AND(); + 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][20]; + and[91][i].b <== eq[66][i].out; + and[92][i] = AND(); + and[92][i].a <== states[i][21]; + and[92][i].b <== eq[66][i].out; + and[93][i] = AND(); + 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][23]; + and[94][i].b <== eq[66][i].out; + and[95][i] = AND(); + 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][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][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][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][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][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][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 <== lt[30][i].out; + and[102][i].b <== lt[31][i].out; + and[103][i] = AND(); + 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][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][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 <== 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 <== lt[34][i].out; + and[107][i].b <== lt[35][i].out; + and[108][i] = AND(); + 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][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][25]; + and[110][i].b <== and[30][i].out; + and[111][i] = AND(); + 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][29]; + and[112][i].b <== and[14][i].out; + and[113][i] = AND(); + 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][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][25]; + and[115][i].b <== multi_or[10][i].out; + and[116][i] = AND(); + 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][32]; + and[117][i].b <== and[14][i].out; + and[118][i] = AND(); + 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][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][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][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][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][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][26]; + and[124][i].b <== and[30][i].out; + and[125][i] = AND(); + 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][37]; + and[126][i].b <== and[14][i].out; + and[127][i] = AND(); + 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][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][26]; + and[129][i].b <== multi_or[10][i].out; + and[130][i] = AND(); + 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][40]; + and[131][i].b <== and[14][i].out; + and[132][i] = AND(); + 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][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][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][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][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 <== 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][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][42]; + and[139][i].b <== multi_or[27][i].out; + and[140][i] = AND(); + 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][34]; + and[141][i].b <== and[30][i].out; + and[142][i] = AND(); + 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][44]; + and[143][i].b <== and[32][i].out; + and[144][i] = AND(); + and[144][i].a <== states[i][45]; + and[144][i].b <== and[14][i].out; + and[145][i] = AND(); + 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][34]; + and[146][i].b <== eq[29][i].out; + and[147][i] = AND(); + 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][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[10][i].out; + and[150][i] = AND(); + 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][48]; + and[151][i].b <== and[14][i].out; + and[152][i] = AND(); + 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][34]; + and[153][i].b <== eq[60][i].out; + and[154][i] = AND(); + 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][34]; + and[155][i].b <== eq[61][i].out; + and[156][i] = AND(); + 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][34]; + and[157][i].b <== multi_or[15][i].out; + and[158][i] = AND(); + 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][34]; + and[159][i].b <== eq[65][i].out; + and[160][i] = AND(); + 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][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][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][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][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][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][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]; + 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]; + 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]; + } + + component is_accepted = MultiOR(num_bytes+1); + for (var i = 0; i <= num_bytes; i++) { + 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][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][55], is_consecutive[msg_bytes-1-i][1]]); + } + // 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: [(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]; + } +} \ 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 new file mode 100644 index 00000000..9e38853d --- /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, 1); \ 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 d8526337..693ba1a4 100644 --- a/packages/circuits/tests/email_auth.test.ts +++ b/packages/circuits/tests/email_auth.test.ts @@ -3,396 +3,520 @@ 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 - ); - }); + let circuit; + beforeAll(async () => { + const option = { + include: path.join(__dirname, "../../../node_modules"), + recompile: true, + }; + 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 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, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + 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 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 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, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + 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 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 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, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + 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 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 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, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + 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 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 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, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + 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 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 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, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + 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 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(); - }); + 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 genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 1024, + ignoreBodyHashCheck: true, + }); + 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(); + }); - 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 genEmailAuthInput(emailFilePath, accountCode); - 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 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 genEmailAuthInput(emailFilePath, accountCode); - 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 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 genEmailAuthInput(emailFilePath, accountCode); - 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 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 genEmailAuthInput(emailFilePath, accountCode); - 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 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 genEmailAuthInput(emailFilePath, accountCode); - 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", 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 genEmailAuthInput(emailFilePath, accountCode); - circuitInputs.code_idx = 1024 * 4; - 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/email_auth_with_body_parsing.test.ts b/packages/circuits/tests/email_auth_with_body_parsing.test.ts new file mode 100644 index 00000000..df9a8239 --- /dev/null +++ b/packages/circuits/tests/email_auth_with_body_parsing.test.ts @@ -0,0 +1,481 @@ +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, + "./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 circuitInputs = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + 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 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 circuitInputs = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + 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 = 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 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(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 = 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, + "./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 circuitInputs = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + 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 = 1725333972n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Send 0.1 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(0n).toEqual( + witness[ + 1 + domainFields.length + 3 + maskedCommandFields.length + 1 + ] + ); + }); + + 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" + ); + const emailRaw = readFileSync(emailFilePath, "utf8"); + const parsedEmail = await relayerUtils.parseEmail(emailRaw); + + const accountCode = await relayerUtils.genAccountCode(); + const circuitInputs = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + 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 = 1725333989n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Swap 1 ETH to DAI"; + 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(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 circuitInputs = + await genEmailCircuitInput(emailFilePath, accountCode, { + maxHeaderLength: 640, + maxBodyLength: 768, + ignoreBodyHashCheck: false, + }); + 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 = 1725334002n; + expect(timestamp).toEqual(witness[1 + domainFields.length + 2]); + + const maskedCommand = "Send 1 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(0n).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..acc2a526 --- /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 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=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=f9Hc/nL83NGWPdJxrViC0AIkkQ4clr94hybomVgejcc=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + 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=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 5614622812f47-3e009055345sor978536b6e.8.2024.09.02.20.26.13 + for + (Google Transport Security); + 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=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=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=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=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=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 ([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); + 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 + +--===============2959808677043960680== +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 +--===============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 new file mode 100644 index 00000000..acbdc814 --- /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 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=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=kMJCDTrnZkOSpmyPJBDtHkISRN8g4Yz0r8180BggkYs=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + 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=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-2057e0422a7sor20920025ad.10.2024.09.02.20.26.29 + for + (Google Transport Security); + 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=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=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=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=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=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 ([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); + 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 + +--===============0042709324325514954== +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 +--===============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 new file mode 100644 index 00000000..73597d3e --- /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 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=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=f8710STYOn4HlDHwwdcTMiys25mwsCzNla6ZCLV3yMg=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + 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=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-2055fc5719dsor28201735ad.15.2024.09.02.20.26.42 + for + (Google Transport Security); + 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=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=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=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=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=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 ([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); + 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 + +--===============0987519910738789604== +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 +--===============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 new file mode 100644 index 00000000..a8ce5724 --- /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 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=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=LfVYp25jYyoop0tyJg90MQNaEpNP30xYSQbkPrcxeys=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + 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=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 d9443c01a7336-20545567fe2sor26776665ad.0.2024.09.02.20.27.10 + for + (Google Transport Security); + 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=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=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=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=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=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 ([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); + 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 + +--===============8219893973391566718== +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 01eb9b204= +cc24c3baee11accc37d253a9c53e92b1a2cc07763475c135d575b76
=20 +

Thank you!

+ + + =20 +--===============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 new file mode 100644 index 00000000..6c690e76 --- /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 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=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=WgHRFiGakPoqy0EgpGEskuPH5Lowb5jxC1QjM/mOplQ=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + 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=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 d2e1a72fcca58-715e57a3b0dsor4931608b3a.12.2024.09.02.20.27.36 + for + (Google Transport Security); + 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=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=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=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=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=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 ([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); + 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 + +--===============2480312449962561214== +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 0x04884491560f38342= +C56E26BDD0fEAbb68E2d2FC code 01eb9b204cc24c3baee11accc37d253a9c53e92b1a2cc0= +7763475c135d575b76
=20 +

Thank you!

+ + + =20 +--===============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 new file mode 100644 index 00000000..739cea3b --- /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 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=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=pgWkiyvv1a5DWOqSsp+0OWFkqbooRoO1bv8OEpIkz1c=; + fh=QOoFRDdHXpnQH3LJHwmsRKR4EZHwtZQ4a9eIuVllZDs=; + 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=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-715e56aa50fsor4396307b3a.8.2024.09.02.20.27.54 + for + (Google Transport Security); + 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=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=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=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=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=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 ([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); + 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 + +--===============3823408927414188670== +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 +--===============3823408927414188670==-- 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]); + } + } + }); }); diff --git a/packages/circuits/tests/recipient_enabled.test.ts b/packages/circuits/tests/recipient_enabled.test.ts index d38fe35a..bfefeb27 100644 --- a/packages/circuits/tests/recipient_enabled.test.ts +++ b/packages/circuits/tests/recipient_enabled.test.ts @@ -2,291 +2,376 @@ 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] + ); + }); - 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 emailAuthInput = await genEmailAuthInput(emailFilePath, accountCode); - 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(); - }); + 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/.env.sample b/packages/contracts/.env.example similarity index 100% rename from packages/contracts/.env.sample rename to packages/contracts/.env.example 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 406c6006..0df21735 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -25,12 +25,12 @@ $ 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`. +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`. @@ -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. @@ -292,7 +292,7 @@ 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 @@ -303,12 +303,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 +323,7 @@ EmailAuth.t.sol - testAuthEmail() - testExpectRevertAuthEmailEmailNullifierAlreadyUsed() - testExpectRevertAuthEmailInvalidEmailProof() -- testExpectRevertAuthEmailInvalidSubject() +- testExpectRevertAuthEmailInvalidCommand() - testExpectRevertAuthEmailInvalidTimestamp() EmailAuthWithUserOverrideableDkim.t.sol @@ -332,7 +332,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 @@ -352,20 +352,136 @@ 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. +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 +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 7ff2e1a0..4edb0e0e 100644 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -21,12 +21,19 @@ solc = "0.8.26" build_info = true extra_output = ["storageLayout"] -# For missing libraries, please comment out this if you use foundry-zksync +# 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/SubjectUtils.sol:SubjectUtils:0x981e3df952358a57753c7b85de7949da4abcf54a" +# "{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}" @@ -36,11 +43,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 44bae057..3fc1d004 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,16 +1,12 @@ { "name": "@zk-email/ether-email-auth-contracts", - "version": "1.0.0", + "version": "0.0.2-preview", "license": "MIT", "scripts": { "build": "forge build --skip '*ZKSync*'", "zkbuild": "forge build --zksync", - "test": "forge test --no-match-test \"testIntegration\" --skip '*ZKSync*'", - "zktest": "forge test --no-match-test \"testIntegration\" --system-mode=true --zksync --gas-limit 1000000000 --chain 300", - "build": "forge build --skip '*ZKSync*'", - "zkbuild": "forge build --zksync", - "test": "forge test --no-match-test \"testIntegration\" --skip '*ZKSync*'", - "zktest": "forge test --no-match-test \"testIntegration\" --system-mode=true --zksync --gas-limit 1000000000 --chain 300", + "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": { @@ -24,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 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..c69db0f2 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"; @@ -34,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))); @@ -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)); @@ -103,7 +108,7 @@ contract Deploy is Script { abi.encodeCall( recoveryControllerImpl.initialize, ( - signer, + initialOwner, address(verifier), address(dkim), address(emailAuthImpl) @@ -138,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 6767cc5f..60b5484b 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"; @@ -36,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))); @@ -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)); @@ -116,7 +121,7 @@ contract Deploy is Script { abi.encodeCall( recoveryControllerZKSyncImpl.initialize, ( - signer, + initialOwner, address(verifier), address(dkim), address(emailAuthImpl), @@ -152,7 +157,7 @@ contract Deploy is Script { address(simpleWalletImpl), abi.encodeCall( simpleWalletImpl.initialize, - (signer, address(recoveryControllerZKSync)) + (initialOwner, address(recoveryControllerZKSync)) ) ); simpleWallet = SimpleWallet(payable(address(simpleWalletProxy))); 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)); diff --git a/packages/contracts/src/EmailAccountRecovery.sol b/packages/contracts/src/EmailAccountRecovery.sol index c1a87acd..d1754387 100644 --- a/packages/contracts/src/EmailAccountRecovery.sol +++ b/packages/contracts/src/EmailAccountRecovery.sol @@ -44,53 +44,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; @@ -124,11 +124,7 @@ abstract contract EmailAccountRecovery { emailAuthImplementation(), abi.encodeCall( EmailAuth.initialize, - ( - recoveredAccount, - accountSalt, - address(this) - ) + (recoveredAccount, accountSalt, address(this)) ) ) ) @@ -142,7 +138,7 @@ abstract contract EmailAccountRecovery { /// @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 recoveredAccount, + address recoveredAccount, bytes32 accountSalt ) internal virtual returns (address) { ERC1967Proxy proxy = new ERC1967Proxy{salt: accountSalt}( @@ -155,10 +151,10 @@ abstract contract EmailAccountRecovery { return address(proxy); } - /// @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 @@ -175,10 +171,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 @@ -197,13 +193,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"); @@ -217,24 +213,27 @@ abstract contract EmailAccountRecovery { EmailAuth guardianEmailAuth; if (guardian.code.length == 0) { - address proxyAddress = deployEmailAuthProxy(recoveredAccount, emailAuthMsg.proof.accountSalt); + address proxyAddress = deployEmailAuthProxy( + recoveredAccount, + emailAuthMsg.proof.accountSalt + ); guardianEmailAuth = EmailAuth(proxyAddress); 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 { @@ -251,22 +250,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"); @@ -296,7 +295,7 @@ abstract contract EmailAccountRecovery { processRecovery( guardian, templateIdx, - emailAuthMsg.subjectParams, + emailAuthMsg.commandParams, emailAuthMsg.proof.emailNullifier ); } diff --git a/packages/contracts/src/EmailAccountRecoveryZKSync.sol b/packages/contracts/src/EmailAccountRecoveryZKSync.sol index fbd14a68..95ec720b 100644 --- a/packages/contracts/src/EmailAccountRecoveryZKSync.sol +++ b/packages/contracts/src/EmailAccountRecoveryZKSync.sol @@ -9,13 +9,13 @@ 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 = 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. @@ -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 +} diff --git a/packages/contracts/src/EmailAuth.sol b/packages/contracts/src/EmailAuth.sol index 19297fd7..07b883b6 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 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; } /// @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,32 +222,32 @@ contract EmailAuth is OwnableUpgradeable, UUPSUpgradeable { "invalid timestamp" ); require( - bytes(emailAuthMsg.proof.maskedSubject).length <= - verifier.SUBJECT_BYTES(), - "invalid masked subject length" + bytes(emailAuthMsg.proof.maskedCommand).length <= + verifier.COMMAND_BYTES(), + "invalid masked command length" ); require( - emailAuthMsg.skipedSubjectPrefix < verifier.SUBJECT_BYTES(), - "invalid size of the skipped subject prefix" + emailAuthMsg.skippedCommandPrefix < verifier.COMMAND_BYTES(), + "invalid size of the skipped command prefix" ); - // Construct an expectedSubject from template and the values of emailAuthMsg.subjectParams. - string memory trimmedMaskedSubject = removePrefix( - emailAuthMsg.proof.maskedSubject, - emailAuthMsg.skipedSubjectPrefix + // Construct an expectedCommand from template and the values of emailAuthMsg.commandParams. + string memory trimmedMaskedCommand = removePrefix( + emailAuthMsg.proof.maskedCommand, + emailAuthMsg.skippedCommandPrefix ); - string memory expectedSubject = ""; + string memory expectedCommand = ""; for (uint stringCase = 0; stringCase < 3; stringCase++) { - expectedSubject = SubjectUtils.computeExpectedSubject( - emailAuthMsg.subjectParams, + expectedCommand = CommandUtils.computeExpectedCommand( + emailAuthMsg.commandParams, template, stringCase ); - if (Strings.equal(expectedSubject, trimmedMaskedSubject)) { + if (Strings.equal(expectedCommand, trimmedMaskedCommand)) { break; } if (stringCase == 2) { - revert("invalid subject"); + revert("invalid command"); } } 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/libraries/SubjectUtils.sol b/packages/contracts/src/libraries/CommandUtils.sol similarity index 83% rename from packages/contracts/src/libraries/SubjectUtils.sol rename to packages/contracts/src/libraries/CommandUtils.sol index 84823931..71fba9d9 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}"; @@ -102,16 +102,16 @@ 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 - /// @param stringCase Case of the string - 0:checksumed, 1: lowercase, 2: uppercase - 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 + /// @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, uint stringCase - ) 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; @@ -119,31 +119,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 = addressToHexString(param, stringCase); @@ -153,17 +153,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/Groth16Verifier.sol b/packages/contracts/src/utils/Groth16Verifier.sol index 68dce985..ef38a3b4 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 = 15319578088144148433870292454392579210531397678084258888038350512286180645447; - uint256 constant deltax2 = 1086199161593118582719091177042876064789126336461297231728792628701689859806; - uint256 constant deltay1 = 4446519589909698948619442693220675737896467901545229603388595770900353019149; - uint256 constant deltay2 = 8139820593384559533426709059696820531467462438480254791000622464992960199684; - - - uint256 constant IC0x = 13986287304781811629818135937460078168318260622373795543277096066372223143543; - uint256 constant IC0y = 15894331243762149015069486145475096510770522826153695662065578862511865498937; - - uint256 constant IC1x = 6657352747838160193290269178909503517423918732593479650799343149184802404227; - uint256 constant IC1y = 17531545371284544846757265261390554928852673143570772606416106283932089249579; - - uint256 constant IC2x = 16051798939592501067339450771812211828093389728707303947187369590196641845613; - uint256 constant IC2y = 10642771260914469864609917257305668847488863380437098896048772227333105938215; - - uint256 constant IC3x = 11516771157572865390427149046363199727462471754207638386939698647160647244244; - uint256 constant IC3y = 17750959699385211687017966515706019664346563638845176389048062816482362876919; - - uint256 constant IC4x = 16585945905928734303656632207622552215825428661762022954125060983592130784974; - uint256 constant IC4y = 3229598948329671362480222913836846699152815669479715539731783730018250763823; - - uint256 constant IC5x = 2735854243292750270201823836486550894787960439689214123103674588113028210303; - uint256 constant IC5y = 10229313779238541038726274141671860314069645438049912809508167509745776241686; - - uint256 constant IC6x = 14190416281134666159920819160995974222908686549823480648732091214431137294963; - uint256 constant IC6y = 9029501137578433593499338927272434967030906660585173877815017333537018567602; - - uint256 constant IC7x = 12170260117675309582350267080302912575028682087359352382893089877455951772473; - uint256 constant IC7y = 20464605792252479349840655650760617496046593314952148684746613675335058350942; - - uint256 constant IC8x = 4668263935738216597600035713072363446560555431149535779407481594748353348299; - uint256 constant IC8y = 6761669100053229151181201776369124528384949481913373501345799877551671442490; - - uint256 constant IC9x = 17613426733350227864491099426537059832375604576663256857363196285633689216670; - uint256 constant IC9y = 5805908718695762877817749042508472227770796644334990955096436485320700026010; - - uint256 constant IC10x = 1007270225032823010989311002543641079754257589690234134844035082768426542620; - uint256 constant IC10y = 21475642872129196888302396594264201358769263783216674834698667474324214197953; - - uint256 constant IC11x = 15081923087373370787973554347749696256252721214961183946262805192094431665288; - uint256 constant IC11y = 16680069154888020053830495566095733479743182649643804408659380808462437769348; - - uint256 constant IC12x = 7353920573820203673864179902327357836943865465363806932276427158533966054007; - uint256 constant IC12y = 4906960257966631805968560571985842137400392165080887614941226783003180438368; - - uint256 constant IC13x = 4533862304475638755375693106780349782380565190034231050848543922795764879802; - uint256 constant IC13y = 598446044155555715891219562107384479652732465225600288479065093170075495657; - - uint256 constant IC14x = 7122480915086391928930945426177923412929688778313549168236076125436940484112; - uint256 constant IC14y = 9038961138446510912414783948801197218570794393245280448178371602457294281632; - - uint256 constant IC15x = 6714101981980268884481533101476229027015190942378292707659542820827021193397; - uint256 constant IC15y = 11272887771609959733703167827323622301549783063678829277178890525700670890129; - - uint256 constant IC16x = 20437112715761765707147148391773769986470432308919910067302657232573395960162; - uint256 constant IC16y = 15321179474484971518132512130588191553678751040283340303685576790320739150657; - - uint256 constant IC17x = 19219092435091423465633523463253249487338506702794487406401643619518191650129; - uint256 constant IC17y = 17282626638553680622130806938296519057489422178618812871701640691501519771672; - - uint256 constant IC18x = 16606183112206685785600995921349860405026995817135601022134279364752803469536; - uint256 constant IC18y = 16043499772242927375270363061004003839285471350971879635887182974533742603287; - - uint256 constant IC19x = 1210707359308302969770163002263119043614552129675869248158635495219906105852; - uint256 constant IC19y = 12680511356057658336130187063160473463083334743891046286452211277763548137276; - - uint256 constant IC20x = 11086125674217491500739269827053901222271696690174050254374133368712953243088; - uint256 constant IC20y = 6053103800204978405773186514845086084032005357588363656542377416178871564775; - - uint256 constant IC21x = 14748494146527412772741859783064786419256684299339014876234608950795174044510; - uint256 constant IC21y = 8712883247211066789641782294202642212131980591356063435892043611448376329402; - - uint256 constant IC22x = 11839379700336717343079420809622942111687375327897345508451774961872673770316; - uint256 constant IC22y = 8895701596719783222411291561512126156358240424160295697039536555088618180915; - - uint256 constant IC23x = 18344723580640218566078573334781871542714315793755378650476142891258578517167; - uint256 constant IC23y = 6037447496975377303076282689670453476478799098316334507779292520966118416141; - - uint256 constant IC24x = 1219018687863146079804927794790349811713233524506071692145203043151155579912; - uint256 constant IC24y = 12259329329644691804803466046583012104373647543094116751541858451574329049339; - - uint256 constant IC25x = 18616266469772173270024938497854580018451184027620595567381348061717260755876; - uint256 constant IC25y = 13657793433977158706390923089623450140219483127718023788044217038622204508743; - - uint256 constant IC26x = 12727423626475319557504848343871689884624000795573098126755145386839939527511; - uint256 constant IC26y = 2938262592563768549228983305699572862280081061292424052023446347112367143549; - - uint256 constant IC27x = 21487591408762398705234938070547673395123973173141617628201773263097079121694; - uint256 constant IC27y = 12720246748523909661755448585533297402316709697570936404470276522191359637563; - - uint256 constant IC28x = 16467178226026300059831605377943086050334723191464668213518101445484504783848; - uint256 constant IC28y = 9139131916495414634537516523354727831542697092324217153640571950935058484467; - - uint256 constant IC29x = 11813394657812788297263465566473337219295871229603907247462957762987163286727; - uint256 constant IC29y = 2333466569019313289053951330259295038552214976343543633683510156531235807982; - - uint256 constant IC30x = 5758319522107086585563855735449863655068464994393372981823525634565012585161; - uint256 constant IC30y = 281303738559625778766939028867621386494750433481191839742375920626126152406; - - uint256 constant IC31x = 10766255441893413771043297335573055973288564739850120191905483233382630740246; - uint256 constant IC31y = 8012588191039935342856190453376510257080197619321852273994553617995812833773; - - uint256 constant IC32x = 13740647652203492799542105246627141268848155986372129145815588390071245063824; - uint256 constant IC32y = 12989805147963975539185412669782613149167981050611353053030652178298637898321; - - uint256 constant IC33x = 11678473503165871308190682100052535955722167524502187482920769926720343167599; - uint256 constant IC33y = 13548393914151182724283386224251830133662331816742832947222699249802146353834; - - uint256 constant IC34x = 20746424191835410865488887203537015077703505567964632145891041247460534632431; - uint256 constant IC34y = 14888985375914925013094608784755252069956164909406628467775584250729953169513; - - + 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 = + 10433082117781289465772979793225448958552973147056379387107424694719430078183; + uint256 constant deltax2 = + 7275826864108750902980191877201544327099639445097295071715716197584022501217; + uint256 constant deltay1 = + 12045503589921692978672400276439014666986009309508030338062238114576580523348; + uint256 constant deltay2 = + 5167266045144281780726036397587954855586209241615262341293096620571928275241; + + uint256 constant IC0x = + 14420976692606365609454257135434328632805959473973286981673284088060119898838; + uint256 constant IC0y = + 3237727173942946479267676846429217525953135300179916547171195052204761246016; + + uint256 constant IC1x = + 11242243116165410418833602736488883618535128769898487771024836696023857465078; + uint256 constant IC1y = + 3944125875514495469428761178435611665072101970023736373804875966482548972424; + + uint256 constant IC2x = + 13444687970779241874983655345748698054742845164432935489947273666155122460289; + uint256 constant IC2y = + 21224652167029042637908968340315123408212528634456523234010312093840631034658; + + uint256 constant IC3x = + 6223278095306548402665889948737566703639314941454342116499455309193776009394; + uint256 constant IC3y = + 3166189940732838088289487889047362887677679902266639433494062252267843006033; + + uint256 constant IC4x = + 10816631512908557343349023271022520591434729012608504881463056258162562470478; + uint256 constant IC4y = + 7553268499036051315278338406042049999218595304176271777756017758867657854668; + + uint256 constant IC5x = + 4071416866028362268560008820862586961030580397814903526444213717756336978375; + uint256 constant IC5y = + 5882120478213084184478310869582676016227773303131677302373100370040076790180; + + uint256 constant IC6x = + 11734717795004643123638327357128685172014034657612399074715429226722658631266; + uint256 constant IC6y = + 16373602507399860749002874686406539840487965214428380629195095307329304471831; + + uint256 constant IC7x = + 17995242574665353969882544970809346971980578867255316834879417403787422177779; + uint256 constant IC7y = + 19598869527810550137301357794896707958610742032745888008070796990675647167438; + + uint256 constant IC8x = + 15333007330168660247285804146177263702283991094081656975888675677742499858801; + uint256 constant IC8y = + 3622983327849337081794030911901750861761088652919413360963959440884276356515; + + uint256 constant IC9x = + 14592598453216971911118910753077725013203270532742585163748407745719533451518; + uint256 constant IC9y = + 1732486974024268892903158999835737802052796658580804609834621732126532847367; + + uint256 constant IC10x = + 9608760299311764957965020896382267062379773438090355782074251684342995171221; + uint256 constant IC10y = + 18768971212393705710205169899071271227246850342771830091251994505002517649543; + + uint256 constant IC11x = + 18229713854414772793917571039862241859243290635273907596834836608693704592373; + uint256 constant IC11y = + 1354957943711196195900175201625492118583365814055323140317564226352214552501; + + uint256 constant IC12x = + 4540048316384448988784022044695474025704244408393204872837050282034324974955; + uint256 constant IC12y = + 12889131931011399139025112922332330923524276708703486137710524916145921772003; + + uint256 constant IC13x = + 10260170402680733092165416374102715050316461777911507389592209476741076666114; + uint256 constant IC13y = + 10621497058496187206533851857372855187411269122792661496327887622312773096373; + + uint256 constant IC14x = + 4211461709999443083034879779565627271437397337531026812125070026750873693080; + uint256 constant IC14y = + 18467608266766262084409632308104903215532489446465294776664019514313833622275; + + uint256 constant IC15x = + 9139115676316577941242771581653053080955401927531325123468615971408706509241; + uint256 constant IC15y = + 9164313109700564988896172664560830764060639180869132590006516315434795315437; + + uint256 constant IC16x = + 8055062813885465561166049536110231123741745748861232693686007271655092618041; + uint256 constant IC16y = + 4510221627106525233912238941858162972422084397106560474450183916928061274103; + + uint256 constant IC17x = + 1507186560667512546403688953670998250315628457214357234952217475451563331987; + uint256 constant IC17y = + 17071593518480573061174595519667499531902707878706006270613337175041459137032; + + uint256 constant IC18x = + 16762847668396014973033660303062581513242379616013803571550493698889447450812; + uint256 constant IC18y = + 17006420456782153650908127824637694821957086423954188936477697337268237314792; + + uint256 constant IC19x = + 17577663376594144399743129857840103856635877754916782842519048073412103543225; + uint256 constant IC19y = + 21284834289036339572765424015780927653463792202070493220185327060720557536153; + + uint256 constant IC20x = + 16974417587802350668283436092050410822135612040525093207677793563266434898899; + uint256 constant IC20y = + 10577911945362631640255946262746706583221370481437827188366150551549490701563; + + uint256 constant IC21x = + 7648089745961110787060572088126537400868566614244157722652493282774570897306; + uint256 constant IC21y = + 5771535376772212949945259105932244016275600714895136777592719710059589930578; + + uint256 constant IC22x = + 14921736432665742630629608167623006910311804948046840596497195761330490353359; + uint256 constant IC22y = + 14215720104074512767679668828223147475518903442603114867950535356580700634265; + + uint256 constant IC23x = + 14807951812496054917199644721274028450973199590549199626326743360499724939100; + uint256 constant IC23y = + 13396573693115293914922022639761946049996991749562789764893885956377368829023; + + uint256 constant IC24x = + 946959077341401468258673477010661575493350299894729588837485560993685482032; + uint256 constant IC24y = + 20570356357018532028601279688731350534146086904670254722628961938492868330345; + + uint256 constant IC25x = + 2148991523060877253038248533639729462350984432768284099241119419519252893539; + uint256 constant IC25y = + 19770588615554020041636512722294181393662192009340177424932751009199907422519; + + uint256 constant IC26x = + 3747878854274778152623809873153099102641291773237420658483003597255752380852; + uint256 constant IC26y = + 9101065225212227091551571514843375002653632703977216400939979268283954265300; + + uint256 constant IC27x = + 21031066699877095106651494566013301499428447799745230410837452349553101774320; + uint256 constant IC27y = + 16064211054461593402319195858630318172586733205260338032143803066661211213772; + + uint256 constant IC28x = + 7134851187269606902216669356694699867879169670464902433281001074684321873924; + uint256 constant IC28y = + 8200092285454074110879487215112662564626493123135666536713788988496182625169; + + uint256 constant IC29x = + 16783075251656600287266260045074464061567969583063942600473764372418413016777; + uint256 constant IC29y = + 16335574261246374092454229631189633336308135807569085967237651070836039968818; + + uint256 constant IC30x = + 18767147382384409410413363730064028585638124996514027800481404559552256526; + uint256 constant IC30y = + 5893729199256651364790555780931353184898130539524140758522955719432990189455; + + uint256 constant IC31x = + 16673100255008534170974248428282891797220989026129402665363975376767488775417; + uint256 constant IC31y = + 11242595605003176651284733632654591951414346866379786815099235732235467678271; + + uint256 constant IC32x = + 14304354639208062657751514661745433699866474083874289024775056731428339652996; + uint256 constant IC32y = + 21067499116906247821838563471313426612497479641552212451088084053907374443686; + + uint256 constant IC33x = + 14695351664477545562934225515932933391739717812930861530027307263509227127839; + uint256 constant IC33y = + 13797285223976228908447726624003414144346497900738839904003106351418953773996; + + uint256 constant IC34x = + 16696383166685664550749463360579321447259768183797789828152025370318762267913; + uint256 constant IC34y = + 5539498916849826447504399176766255291145081992895211478547376199843753155197; + // 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 2ccff85d..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"; @@ -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 @@ -17,20 +17,23 @@ struct EmailProof { } contract Verifier is OwnableUpgradeable, UUPSUpgradeable { - Groth16Verifier groth16Verifier; + IGroth16Verifier groth16Verifier; 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() {} /// @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( @@ -42,7 +45,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++) { @@ -52,16 +55,16 @@ contract Verifier is OwnableUpgradeable, UUPSUpgradeable { pubSignals[DOMAIN_FIELDS + 1] = uint256(proof.emailNullifier); pubSignals[DOMAIN_FIELDS + 2] = uint256(proof.timestamp); stringFields = _packBytes2Fields( - bytes(proof.maskedSubject), - SUBJECT_BYTES + bytes(proof.maskedCommand), + 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/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/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/EmailAccountRecovery_acceptanceSubjectTemplates.t.sol b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_acceptanceSubjectTemplates.t.sol index 71ebc88b..7e596e79 100644 --- a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_acceptanceSubjectTemplates.t.sol +++ b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_acceptanceSubjectTemplates.t.sol @@ -9,18 +9,18 @@ import {StructHelper} from "../helpers/StructHelper.sol"; import {SimpleWallet} from "../helpers/SimpleWallet.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -contract EmailAccountRecoveryTest_acceptanceSubjectTemplates is StructHelper { +contract EmailAccountRecoveryTest_acceptanceCommandTemplates is StructHelper { constructor() {} function setUp() public override { super.setUp(); } - function testAcceptanceSubjectTemplates() public { + function testAcceptanceCommandTemplates() public { skipIfZkSync(); - + 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"); diff --git a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_completeRecovery.t.sol b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_completeRecovery.t.sol index b76c15b7..00ba5401 100644 --- a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_completeRecovery.t.sol +++ b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_completeRecovery.t.sol @@ -50,9 +50,9 @@ contract EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), @@ -94,10 +94,10 @@ contract EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), diff --git a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_handleAcceptance.t.sol b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_handleAcceptance.t.sol index 2bda3928..5d3e3428 100644 --- a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_handleAcceptance.t.sol +++ b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_handleAcceptance.t.sol @@ -37,7 +37,7 @@ contract EmailAccountRecoveryTest_handleAcceptance is StructHelper { function testHandleAcceptance() public { skipIfZkSync(); - + requestGuardian(); console.log("guardian", guardian); @@ -54,9 +54,9 @@ contract EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), @@ -97,9 +97,9 @@ contract EmailAccountRecoveryTest_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 EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), @@ -147,7 +147,7 @@ contract EmailAccountRecoveryTest_handleAcceptance is StructHelper { vm.stopPrank(); } - function testExpectRevertHandleAcceptanceInvalidSubjectParams() public { + function testExpectRevertHandleAcceptanceInvalidCommandParams() public { skipIfZkSync(); requestGuardian(); @@ -164,10 +164,10 @@ contract EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), @@ -176,7 +176,7 @@ contract EmailAccountRecoveryTest_handleAcceptance is StructHelper { ); vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid subject params")); + vm.expectRevert(bytes("invalid command params")); recoveryController.handleAcceptance(emailAuthMsg, templateIdx); vm.stopPrank(); } @@ -200,9 +200,9 @@ contract EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), diff --git a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_handleRecovery.t.sol b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_handleRecovery.t.sol index f497a36e..ccaca48e 100644 --- a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_handleRecovery.t.sol +++ b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_handleRecovery.t.sol @@ -52,9 +52,9 @@ contract EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), @@ -98,10 +98,10 @@ contract EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), @@ -155,10 +155,10 @@ contract EmailAccountRecoveryTest_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 EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), @@ -241,10 +241,10 @@ contract EmailAccountRecoveryTest_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 EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), @@ -313,7 +313,7 @@ contract EmailAccountRecoveryTest_handleRecovery is StructHelper { vm.stopPrank(); } - function testExpectRevertHandleRecoveryInvalidSubjectParams() public { + function testExpectRevertHandleRecoveryInvalidCommandParams() public { skipIfZkSync(); handleAcceptance(); @@ -337,11 +337,11 @@ contract EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), @@ -350,7 +350,7 @@ contract EmailAccountRecoveryTest_handleRecovery is StructHelper { ); vm.startPrank(someRelayer); - vm.expectRevert(bytes("invalid subject params")); + vm.expectRevert(bytes("invalid command params")); recoveryController.handleRecovery(emailAuthMsg, templateIdx); vm.stopPrank(); } @@ -373,10 +373,10 @@ contract EmailAccountRecoveryTest_handleRecovery 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()), @@ -414,10 +414,10 @@ contract EmailAccountRecoveryTest_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(recoveryController.emailAuthImplementationAddr()), diff --git a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_recoverySubjectTemplates.t.sol b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_recoverySubjectTemplates.t.sol index 50e720ac..db7a925c 100644 --- a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_recoverySubjectTemplates.t.sol +++ b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_recoverySubjectTemplates.t.sol @@ -9,18 +9,18 @@ import {StructHelper} from "../helpers/StructHelper.sol"; import {SimpleWallet} from "../helpers/SimpleWallet.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -contract EmailAccountRecoveryTest_recoverySubjectTemplates is StructHelper { +contract EmailAccountRecoveryTest_recoveryCommandTemplates is StructHelper { constructor() {} function setUp() public override { super.setUp(); } - function testRecoverySubjectTemplates() public { + function testRecoveryCommandTemplates() public { skipIfZkSync(); - - setUp(); - string[][] memory res = recoveryController.recoverySubjectTemplates(); + + setUp(); + string[][] memory res = recoveryController.recoveryCommandTemplates(); assertEq(res[0][0], "Set"); assertEq(res[0][1], "the"); assertEq(res[0][2], "new"); diff --git a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_rejectRecovery.t.sol b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_rejectRecovery.t.sol index 2c554711..d11b52c3 100644 --- a/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_rejectRecovery.t.sol +++ b/packages/contracts/test/EmailAccountRecovery/EmailAccountRecovery_rejectRecovery.t.sol @@ -9,7 +9,9 @@ import {StructHelper} from "../helpers/StructHelper.sol"; import {SimpleWallet} from "../helpers/SimpleWallet.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -contract EmailAccountRecoveryForRejectRecoveryTest_rejectRecovery is StructHelper { +contract EmailAccountRecoveryForRejectRecoveryTest_rejectRecovery is + StructHelper +{ constructor() {} function setUp() public override { @@ -49,12 +51,12 @@ contract EmailAccountRecoveryForRejectRecoveryTest_rejectRecovery is StructHelpe 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 +109,10 @@ contract EmailAccountRecoveryForRejectRecoveryTest_rejectRecovery is StructHelpe 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()), diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_completeRecovery.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZKSync_completeRecovery.t.sol index 6713f75e..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()), @@ -74,9 +74,14 @@ contract EmailAccountRecoveryZKSyncTest_completeRecovery is StructHelper { function handleRecovery() public { handleAcceptance(); - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), + recoveryControllerZKSync.isRecovering(address(simpleWallet)), + false + ); + assertEq( + recoveryControllerZKSync.currentTimelockOfAccount( + address(simpleWallet) + ), 0 ); assertEq(simpleWallet.owner(), deployer); @@ -94,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()), @@ -109,7 +114,10 @@ contract EmailAccountRecoveryZKSyncTest_completeRecovery is StructHelper { recoveryControllerZKSync.handleRecovery(emailAuthMsg, templateIdx); vm.stopPrank(); - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), true); + assertEq( + recoveryControllerZKSync.isRecovering(address(simpleWallet)), + true + ); assertEq(simpleWallet.owner(), deployer); assertEq( recoveryControllerZKSync.newSignerCandidateOfAccount( @@ -118,7 +126,9 @@ contract EmailAccountRecoveryZKSyncTest_completeRecovery is StructHelper { newSigner ); assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), + recoveryControllerZKSync.currentTimelockOfAccount( + address(simpleWallet) + ), block.timestamp + recoveryControllerZKSync.timelockPeriodOfAccount( address(simpleWallet) @@ -131,9 +141,14 @@ contract EmailAccountRecoveryZKSyncTest_completeRecovery is StructHelper { handleRecovery(); - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), true); assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), + recoveryControllerZKSync.isRecovering(address(simpleWallet)), + true + ); + assertEq( + recoveryControllerZKSync.currentTimelockOfAccount( + address(simpleWallet) + ), block.timestamp + recoveryControllerZKSync.timelockPeriodOfAccount( address(simpleWallet) @@ -155,9 +170,14 @@ contract EmailAccountRecoveryZKSyncTest_completeRecovery is StructHelper { ); vm.stopPrank(); - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), + recoveryControllerZKSync.isRecovering(address(simpleWallet)), + false + ); + assertEq( + recoveryControllerZKSync.currentTimelockOfAccount( + address(simpleWallet) + ), 0 ); assertEq(simpleWallet.owner(), newSigner); @@ -174,9 +194,14 @@ contract EmailAccountRecoveryZKSyncTest_completeRecovery is StructHelper { handleAcceptance(); - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), false); assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), + recoveryControllerZKSync.isRecovering(address(simpleWallet)), + false + ); + assertEq( + recoveryControllerZKSync.currentTimelockOfAccount( + address(simpleWallet) + ), 0 ); assertEq(simpleWallet.owner(), deployer); @@ -204,9 +229,14 @@ contract EmailAccountRecoveryZKSyncTest_completeRecovery is StructHelper { handleRecovery(); - assertEq(recoveryControllerZKSync.isRecovering(address(simpleWallet)), true); assertEq( - recoveryControllerZKSync.currentTimelockOfAccount(address(simpleWallet)), + recoveryControllerZKSync.isRecovering(address(simpleWallet)), + true + ); + assertEq( + recoveryControllerZKSync.currentTimelockOfAccount( + address(simpleWallet) + ), block.timestamp + recoveryControllerZKSync.timelockPeriodOfAccount( address(simpleWallet) 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/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_acceptanceSubjectTemplates.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_acceptanceCommandTemplates.t.sol similarity index 78% rename from packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_acceptanceSubjectTemplates.t.sol rename to packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_acceptanceCommandTemplates.t.sol index 9290a69c..81d9a67c 100644 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_acceptanceSubjectTemplates.t.sol +++ b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_acceptanceCommandTemplates.t.sol @@ -9,18 +9,20 @@ import {StructHelper} from "../helpers/StructHelper.sol"; import {SimpleWallet} from "../helpers/SimpleWallet.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -contract EmailAccountRecoveryZKSyncTest_acceptanceSubjectTemplates is StructHelper { +contract EmailAccountRecoveryZKSyncTest_acceptanceCommandTemplates is + StructHelper +{ constructor() {} function setUp() public override { super.setUp(); } - function testAcceptanceSubjectTemplates() public { + function testAcceptanceCommandTemplates() public { skipIfNotZkSync(); 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"); diff --git a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_recoverySubjectTemplates.t.sol b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_recoveryCommandTemplates.t.sol similarity index 79% rename from packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_recoverySubjectTemplates.t.sol rename to packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_recoveryCommandTemplates.t.sol index 051c655b..62271e43 100644 --- a/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_recoverySubjectTemplates.t.sol +++ b/packages/contracts/test/EmailAccountRecoveryZkSync/EmailAccountRecoveryZkSync_recoveryCommandTemplates.t.sol @@ -9,18 +9,20 @@ import {StructHelper} from "../helpers/StructHelper.sol"; import {SimpleWallet} from "../helpers/SimpleWallet.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -contract EmailAccountRecoveryZKSyncTest_recoverySubjectTemplates is StructHelper { +contract EmailAccountRecoveryZKSyncTest_recoveryCommandTemplates is + StructHelper +{ constructor() {} function setUp() public override { super.setUp(); } - function testRecoverySubjectTemplates() public { + function testRecoveryCommandTemplates() public { skipIfNotZkSync(); - - setUp(); - string[][] memory res = recoveryController.recoverySubjectTemplates(); + + setUp(); + string[][] memory res = recoveryController.recoveryCommandTemplates(); assertEq(res[0][0], "Set"); assertEq(res[0][1], "the"); assertEq(res[0][2], "new"); diff --git a/packages/contracts/test/EmailAuth.t.sol b/packages/contracts/test/EmailAuth.t.sol index 7ba173aa..d4010ff5 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(); @@ -432,9 +432,9 @@ contract EmailAuthTest is StructHelper { vm.stopPrank(); } - function testExpectRevertAuthEmailInvalidMaskedSubjectLength() public { + function testExpectRevertAuthEmailInvalidMaskedCommandLength() public { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); vm.stopPrank(); @@ -444,18 +444,20 @@ contract EmailAuthTest is StructHelper { ); assertEq(emailAuth.lastTimestamp(), 0); - // Set masked subject length to 606, which should be 605 or less defined in the verifier. - emailAuthMsg.proof.maskedSubject = string(new bytes(606)); + // 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 subject length")); + vm.expectRevert(bytes("invalid masked command length")); emailAuth.authEmail(emailAuthMsg); vm.stopPrank(); } - function testExpectRevertAuthEmailInvalidSizeOfTheSkippedSubjectPrefix() public { + function testExpectRevertAuthEmailInvalidSizeOfTheSkippedCommandPrefix() + public + { vm.startPrank(deployer); - _testInsertSubjectTemplate(); + _testInsertCommandTemplate(); EmailAuthMsg memory emailAuthMsg = buildEmailAuthMsg(); vm.stopPrank(); @@ -465,11 +467,11 @@ contract EmailAuthTest is StructHelper { ); assertEq(emailAuth.lastTimestamp(), 0); - // Set skipped subject prefix length to 605, it should be less than 605. - emailAuthMsg.skipedSubjectPrefix = 605; + // 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 subject prefix")); + vm.expectRevert(bytes("invalid size of the skipped command prefix")); emailAuth.authEmail(emailAuthMsg); 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 b17fc0cf..bc463d34 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"; @@ -76,9 +77,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)); } @@ -141,7 +146,7 @@ contract IntegrationTest is Test { console.log("SimpleWallet is at ", address(simpleWallet)); assertEq( address(simpleWallet), - 0xeb8E21A363Dce22ff6057dEEF7c074062037F571 + 0xf22ECf2028fe74129dB8e8946b56bef0cD8Ecd5E ); address simpleWalletOwner = simpleWallet.owner(); @@ -163,7 +168,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( @@ -176,7 +181,7 @@ contract IntegrationTest is Test { emailProof.publicKeyHash = bytes32(vm.parseUint(pubSignals[9])); emailProof.timestamp = vm.parseUint(pubSignals[11]); emailProof - .maskedSubject = "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; @@ -184,7 +189,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" ) ); @@ -210,14 +215,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, + skippedCommandPrefix: 0, proof: emailProof }); recoveryController.handleAcceptance(emailAuthMsg, templateIdx); @@ -245,7 +250,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[])); @@ -257,7 +262,7 @@ contract IntegrationTest is Test { // 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 is account 9 emailProof - .maskedSubject = "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])); @@ -269,7 +274,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" ) ); @@ -283,17 +288,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, + skippedCommandPrefix: 0, proof: emailProof }); recoveryController.handleRecovery(emailAuthMsg, templateIdx); diff --git a/packages/contracts/test/IntegrationZKSync.t.sol b/packages/contracts/test/IntegrationZKSync.t.sol index f30cc72b..806b8696 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(); @@ -164,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( @@ -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; @@ -185,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" ) ); @@ -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); @@ -246,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_public.json" ) ); pubSignals = abi.decode(vm.parseJson(publicInputFile), (string[])); @@ -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])); @@ -270,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" ) ); @@ -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); 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/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==-- diff --git a/packages/contracts/test/emails/8453/accept.eml b/packages/contracts/test/emails/8453/accept.eml index 1cc21c9b..ff7fc182 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:a05:6400:28a:b0:271:da57:79 with SMTP id hs10csp865237ecb; - Sun, 8 Sep 2024 17:38:53 -0700 (PDT) -X-Received: by 2002:a05:6358:9143:b0:1b8:226a:2622 with SMTP id e5c5f4694b2df-1b84beaea04mr864194555d.21.1725842333641; - Sun, 08 Sep 2024 17:38:53 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725842333; cv=none; +Delivered-To: suegamisora@gmail.com +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=Eo8FQDuq26qqB1YlOaTQ5KkpTWjMuduMUW/YTGvZXhX88eYKZsBZHO1Qgucz7eT4GP - lxiIeLbUjVkJU/kbWNOLusUabrsuMYm3UnOTVeiTZBX8LtHpy8/kWi72IiL0/wpszOB6 - M+CKFud0FgParMBL/FeowgITRN2lfSXXcrEFE7OJ46OUeZTkZH6o5klmAxRaP/WWnK7Q - Lv72Pleqdm7epcpoduR2K5V2t4WD/6hEhqFxkJQf3LfxOAIRYXX2brBpCKGNN7AmnMGJ - 1j4yTPYwX3FjSYBB0dFgRQpO7JqUQuoIWQWuE2IsFf8MowINFSOfzG2HGLCptV7GBdu8 - nR5g== + 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=to:subject:message-id:date:from:mime-version:dkim-signature; - bh=u3BMBmOH3oo7W5+AST9Mudcc8sUjkyZ9Ee118Aw1hRA=; - fh=OYPr0JdXtRRlM3Htj/E6+khbD9huvtdqkRTmPoW0wko=; - b=S7CO2YA0iDfPdwyRITTdtNCwpPJQ8OA27yWCiXjsYME+l2C6U73hWlxoUbTO8XqTOL - sQEE4O8zwppLIWznAgRsdXQ5tvcJjn8J+hRO/sDeiGAfeMVyKOXBFWfGwUpbUHHBZ1wS - 6rS2zhzDcrjm6qmnqUY+AeptvSkeb46ECH+QIutZ3BU8iXIe6xYhf7XL/5AkoSrrrTf6 - 4gmti0p2vUJcV+Npyb7QHzcW+AjCFpLPtvkDXRJMHeFxKlMFiaiiugn7vOk1yjxCSaVn - ahfeCUgcBSwkAp03icM2nTpYCVr6Ou0/ZOS74+yal0VsHbQkKAk6Xr6qP4AwCowX0Sc/ - //0w==; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=UtwrridezOg1yynyK4xAGQzZRbhS0kPTHkNHUnvvunw=; + fh=r9ZW45D/4i7BIl/4UeFGrkYKwbplztqhOVKfbV+WD3I=; + 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=RwyfZUyf; - 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=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: +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 af79cd13be357-7a9a7a73740sor176146885a.19.2024.09.08.17.38.53 - for + by mx.google.com with SMTPS id 98e67ed59e1d1-2db05482b66sor2447718a91.3.2024.09.10.07.09.58 + for (Google Transport Security); - Sun, 08 Sep 2024 17:38:53 -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 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=RwyfZUyf; - 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=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=1725842333; x=1726447133; dara=google.com; - h=to:subject:message-id:date:from:mime-version:from:to:cc:subject + 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=u3BMBmOH3oo7W5+AST9Mudcc8sUjkyZ9Ee118Aw1hRA=; - b=RwyfZUyfwOg5nNyFlHnCyClaJ27wgLGNekZls/hqRQSxYrc25H+aqdjBkpubBKuvpj - E0COKCv052KffeYVWD5/xcmIxNXpX7ZVv923i65P8ObFCVtt02qpyTarw2GYO9QXPtIa - roA2+VV0W7gEoQl1iSeQckJrRtt/9+nZwdZY/0/uAROHnOeKlvWjA4bikh74EZtjJg2E - jetr3A8eh2+yJ2EeXknJCZSX+QUpwJEjxnOju+tSiUH3ojAxjD9gnx86ZWVGSsaeUjP1 - +PlSjabZVDmkrOSq1HMj5fGpWCKDGQsvKa9MKLrwwzQBrEp0DE4TDhoR6TWN7znLdKgv - AXxw== + 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=1725842333; x=1726447133; - h=to:subject:message-id:date:from:mime-version:x-gm-message-state + 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=u3BMBmOH3oo7W5+AST9Mudcc8sUjkyZ9Ee118Aw1hRA=; - b=OEx1J3HwB0T1PRnrPhqrVXxq2fd4HehGlOGD8qyfS8tuRl6sdyKsrF+wgTVNyWcwCM - uY9ZRVCFTb5/2/Z9n6O8dRV9JWsnK7hb7NYSmD/s2zaPFtfTIYBafm5TW+3uaPjQ25Gf - /5sGy64lE5uOegFmf12PkWKIQwgs1ytMLQ/PN24tjIS142p6Fj2Ns1f1CvV6ySttUO7i - btVq9zrBUNrsB88II+0srbEnYVrMIspUp4bMXgLiRuRjU53tiIXoZe9QqZrY3ZT1SXvq - cURQ3X5zoMg2FIJT7qLyRG9xa8bbq+uaszbjE6n/AmxowT6VzPJebE12Z7wvvGKs0+qs - RfZw== -X-Gm-Message-State: AOJu0Yyf0PsSEn60KLTqdIQcs8o4LO7Pa3spSzQjW1mUOwM8e/WTWsW0 - Zqu6dlktj82yEUBmOe30+KU4qyJ/WS4/FFRyayQDHrEK7IZEZIsaGDdPQpcmIOx+d+ZhxJLePKe - xsurjVlEiLeE9Va+J0s6JwZm7dG3X -X-Google-Smtp-Source: AGHT+IElTLWDEBfxtyVnOba2cERBK6YgvSGie3f/wnb+tcjM9hAUxYGKZci+WQB/O7imoT0PysrYKS2H8UaDLXML0Ew= -X-Received: by 2002:a05:620a:1910:b0:79f:12fb:ed1 with SMTP id - af79cd13be357-7a9a38a8187mr646569985a.16.1725842332968; Sun, 08 Sep 2024 - 17:38:52 -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 98e67ed59e1d1-2db0419d202sm6478512a91.16.2024.09.10.07.09.56 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + 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: "emailwallet.relayer.2" -Date: Mon, 9 Sep 2024 09:38:42 +0900 -Message-ID: -Subject: Accept guardian request for 0xeb8E21A363Dce22ff6057dEEF7c074062037F571 - Code 1162ebff40918afe5305e68396f0283eb675901d0387f97d21928d423aaa0b54 -To: rrelayerbob@gmail.com -Content-Type: multipart/alternative; boundary="00000000000031f01c0621a4fbb6" +From: emaiwallet.alice@gmail.com +To: suegamisora@gmail.com +Subject: Email Account Recovery Test1 ---00000000000031f01c0621a4fbb6 -Content-Type: text/plain; charset="UTF-8" - - - ---00000000000031f01c0621a4fbb6 -Content-Type: text/html; charset="UTF-8" +--===============6570435142598105272== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 -

---00000000000031f01c0621a4fbb6-- + + +

Hello!

+

This is a test email with a basic HTML body.

+
+
Accept guardian request for 0xf22ECf2028fe74129= +dB8e8946b56bef0cD8Ecd5E Code 1162ebff40918afe5305e68396f0283eb675901d0387f9= +7d21928d423aaa0b54
+
+ + + =20 +--===============6570435142598105272==-- diff --git a/packages/contracts/test/emails/8453/recovery.eml b/packages/contracts/test/emails/8453/recovery.eml index 0be721ce..b21a41bf 100644 --- a/packages/contracts/test/emails/8453/recovery.eml +++ b/packages/contracts/test/emails/8453/recovery.eml @@ -1,89 +1,101 @@ -Delivered-To: rrelayerbob@gmail.com -Received: by 2002:a05:6400:28a:b0:271:da57:79 with SMTP id hs10csp865517ecb; - Sun, 8 Sep 2024 17:39:56 -0700 (PDT) -X-Received: by 2002:a05:6102:e0f:b0:49c:1bc:1eff with SMTP id ada2fe7eead31-49c01bc22femr2263104137.28.1725842396118; - Sun, 08 Sep 2024 17:39:56 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725842396; cv=none; +Delivered-To: suegamisora@gmail.com +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=D41hDnFU3G2f/9wRCrVHNx7sasI4u/B06uRAaZgq+tOf6E/zpCTbGcMG2Qk83mFEIM - L00rZK/B4/akwHdjQW8Iel1GwfkdJNHEM+XGiEW6641RId75OwQC2kMG/m+fHakpBsLU - Xpcq4RjCaKJ1WqwkhYjrHxpH/ScVA1vp5sLVbHaymmFVYtC3ztYrVhyYnuKrUjgnAqdR - +PelC5UCIbuORBiLbdTc+cCzQIJV4OlI+u641PQJwrs67H2UrgZnyl6cXMcPNJrzXZiw - oKoD/mTHXGmPY+k6vO23OFy6fU63scpYc6i29ZIuseE2X6+CBodBAtPiYFmeK+hUxTDP - R1SQ== + 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=to:subject:message-id:date:from:mime-version:dkim-signature; - bh=mvDapCNNa9oKBO12XFAqF92pzaTTjGLTiE2clMtdRzM=; - fh=OYPr0JdXtRRlM3Htj/E6+khbD9huvtdqkRTmPoW0wko=; - b=a9iG6t8RdHTSDJrDnbsG10Kdnq2Es9QDHumVktkIoOi0UF2vf5YprDs0nj7OFSPoCc - nAZAZvIwB8fL4f+cqM+ZIWzFjplOY1tfspreWsfZkxDUrhKNUhhiuyVI3JkdY/BMeCJ2 - mim96jnyH3ckvBPgeJdiCkZWknstuQrce1CQyfp64rUB0WQ4MgdgyPYBLSrbc2ZfQo3r - jahYqae1lJTY37m29wLIMh/vix2SJutq47+/St2rIk59SpgTz3xIJSPKI76ovOBR3sbU - /PjYxt8wFw2eP0g/etqbGS1sxVdu4UMWDqXpCrEQ63bTlfgTpwrYMh9ugZNfG4kHxD96 - 3uAA==; + h=subject:to:from:mime-version:date:message-id:dkim-signature; + bh=DmuuCSkWIuDD9dHgMJvud0Des6CJSRGWEXWicibZGr0=; + fh=r9ZW45D/4i7BIl/4UeFGrkYKwbplztqhOVKfbV+WD3I=; + 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=RfgErx0i; - 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=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: +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 af79cd13be357-7a9a7a296c5sor198986385a.15.2024.09.08.17.39.55 - for + by mx.google.com with SMTPS id 41be03b00d2f7-7d823cf3ccasor2234239a12.4.2024.09.10.07.10.18 + for (Google Transport Security); - Sun, 08 Sep 2024 17:39:56 -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 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=RfgErx0i; - 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=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=1725842395; x=1726447195; dara=google.com; - h=to:subject:message-id:date:from:mime-version:from:to:cc:subject + 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=mvDapCNNa9oKBO12XFAqF92pzaTTjGLTiE2clMtdRzM=; - b=RfgErx0ifG4YFDsIv9nxEu9TStTl0mBznYQZMMwT6Dpn3diDq+uhHBN2bRDMAT0dYv - 5w88/E+d8oLyhT6/TBlkps9ahwTKkfOZUCi4UUmBx2n/p+5uYTAVLP9Fv29PtgQFHnDe - qySfOEb7NKj8LR22QXYRUxRLN/jhmskaIpg9fs+HmC7jU4+fpoFmpoIgWb8rGI/uzip8 - pZYYEvVICaXHH3E4aRMps28DY2VYHBycwlC+a4+O0Ui7Ctpay0eALDUq20YrqimKBa+K - 72gp//f9/UMHuG581IRQDiqE3pPz+Cx8KYc0z7DYbEF1YknhJG7gwdOwPJzGjv2LVeps - o3xg== + 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=1725842395; x=1726447195; - h=to:subject:message-id:date:from:mime-version:x-gm-message-state + 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=mvDapCNNa9oKBO12XFAqF92pzaTTjGLTiE2clMtdRzM=; - b=GWRnggEPlVvXAqrwoXCKq4ZOgguVgZiZb4jQpoFHV+/oc9UYFBSsN9b5B+OUaj2F0N - G6nv2u7c346WsoIfb3kCvyqwQbZBP1Kzcb/n3DUW7CjlE2VSz6BOOrPQxLl5nshDU1Du - QGGoGjE4+dzEZBdYjJVFSq2L1DJilntkNAFS1ff9DaGqOCEEftx0Y/MfFumclnwZ5VYR - C2+o9qH45iwtw88mBsfJ7Yl7OoI9w10NuuraYQcoeu72zwmb30E2uHfUe5osGldslgXJ - RcGV8JsFGwAJJUbmr/4HZFQDt3EMeydn7KkieTgi41fExIj5ZC3VhEt1rw4PTdqcTbSG - mEdQ== -X-Gm-Message-State: AOJu0YzZrLLg8bVVKkxvRm1k5x4qHXit4w1BuMonhJq6LxOP+DHivono - +8JABSGbjSpXofT9yUe7vRgJ5G3KTm5sIL9UP2ZOxlI4c3j37jmENGKx2sb/T9IdgYq1A3890fY - 2SoTWndVkyH23ZCxWm/36uVvQOyum -X-Google-Smtp-Source: AGHT+IGhU+pRzJcpq3/XnnchlgpJSMnc3PvuTm0gfTpuyITwadr4gnoO1o/F4dGPxxKl9Epjas8+m4UXLqVKM8yWsCo= -X-Received: by 2002:a05:620a:2901:b0:7a2:1bc:fc1e with SMTP id - af79cd13be357-7a99739b7bbmr1356449485a.61.1725842395467; Sun, 08 Sep 2024 - 17:39:55 -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 41be03b00d2f7-7d8241bf55dsm4904204a12.49.2024.09.10.07.10.16 + for + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + 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: "emailwallet.relayer.2" -Date: Mon, 9 Sep 2024 09:39:44 +0900 -Message-ID: -Subject: Set the new signer of 0xeb8E21A363Dce22ff6057dEEF7c074062037F571 to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 -To: rrelayerbob@gmail.com -Content-Type: multipart/alternative; boundary="000000000000eb98600621a4fedf" +From: emaiwallet.alice@gmail.com +To: suegamisora@gmail.com +Subject: Email Account Recovery Test2 ---000000000000eb98600621a4fedf -Content-Type: text/plain; charset="UTF-8" - - - ---000000000000eb98600621a4fedf -Content-Type: text/html; charset="UTF-8" +--===============0526941080473938676== +Content-Type: text/html; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 -

---000000000000eb98600621a4fedf-- + + +

Hello!

+

This is a test email with a basic HTML body.

+
+
Set the new signer of 0xf22ECf2028fe74129dB8e89= +46b56bef0cD8Ecd5E to 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
+
+ + + =20 +--===============0526941080473938676==-- diff --git a/packages/contracts/test/helpers/DeploymentHelper.sol b/packages/contracts/test/helpers/DeploymentHelper.sol index dc345500..b96894d1 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 {EmailAuth, EmailAuthMsg} from "../../src/EmailAuth.sol"; import {Verifier, EmailProof} from "../../src/utils/Verifier.sol"; +import {Groth16Verifier} from "../../src/utils/Groth16Verifier.sol"; import {ECDSAOwnedDKIMRegistry} from "../../src/utils/ECDSAOwnedDKIMRegistry.sol"; import {UserOverrideableDKIMRegistry} from "@zk-email/contracts/UserOverrideableDKIMRegistry.sol"; import {SimpleWallet} from "./SimpleWallet.sol"; @@ -43,8 +44,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"; @@ -101,9 +102,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)); } @@ -115,8 +120,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(); @@ -136,7 +141,6 @@ contract DeploymentHelper is Test { payable(address(recoveryControllerProxy)) ); - // Create SimpleWallet simpleWalletImpl = new SimpleWallet(); address recoveryControllerAddress = address(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/RecoveryControllerZKSync.sol b/packages/contracts/test/helpers/RecoveryControllerZKSync.sol index f9a7a67c..14e15a9c 100644 --- a/packages/contracts/test/helpers/RecoveryControllerZKSync.sol +++ b/packages/contracts/test/helpers/RecoveryControllerZKSync.sol @@ -6,7 +6,10 @@ import {EmailAccountRecoveryZKSync} from "../../src/EmailAccountRecoveryZKSync.s import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {SimpleWallet} from "./SimpleWallet.sol"; -contract RecoveryControllerZKSync is OwnableUpgradeable, EmailAccountRecoveryZKSync { +contract RecoveryControllerZKSync is + OwnableUpgradeable, + EmailAccountRecoveryZKSync +{ enum GuardianStatus { NONE, REQUESTED, @@ -49,7 +52,7 @@ contract RecoveryControllerZKSync is OwnableUpgradeable, EmailAccountRecoveryZKS return isActivatedOfAccount[recoveredAccount]; } - function acceptanceSubjectTemplates() + function acceptanceCommandTemplates() public pure override @@ -65,7 +68,7 @@ contract RecoveryControllerZKSync is OwnableUpgradeable, EmailAccountRecoveryZKS return templates; } - function recoverySubjectTemplates() + function recoveryCommandTemplates() public pure override @@ -84,22 +87,22 @@ contract RecoveryControllerZKSync is OwnableUpgradeable, EmailAccountRecoveryZKS 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 { @@ -123,10 +126,10 @@ contract RecoveryControllerZKSync is OwnableUpgradeable, EmailAccountRecoveryZKS 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"); @@ -135,17 +138,17 @@ contract RecoveryControllerZKSync is OwnableUpgradeable, EmailAccountRecoveryZKS "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( @@ -153,8 +156,8 @@ contract RecoveryControllerZKSync is OwnableUpgradeable, EmailAccountRecoveryZKS "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/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); + } } diff --git a/packages/contracts/test/helpers/StructHelper.sol b/packages/contracts/test/helpers/StructHelper.sol index cae1eb2f..e8c75761 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, + skippedCommandPrefix: 0, proof: emailProof }); 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 dcbe183f..a64ef96e 100644 --- a/packages/contracts/test/script/ChangeOwners.t.sol +++ b/packages/contracts/test/script/ChangeOwnersScript.t.sol @@ -10,7 +10,7 @@ import {ChangeOwners} from "../../script/ChangeOwners.s.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {StructHelper} from "../helpers/StructHelper.sol"; -contract ChangeOwnersTest is StructHelper { +contract ChangeOwnersScriptTest is StructHelper { function setUp() public override { vm.setEnv( "PRIVATE_KEY", diff --git a/packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistry.t.sol b/packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistryScript.t.sol similarity index 93% rename from packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistry.t.sol rename to packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistryScript.t.sol index 26bc8797..46218861 100644 --- a/packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistry.t.sol +++ b/packages/contracts/test/script/ChangeSignerInECDSAOwnedDKIMRegistryScript.t.sol @@ -9,7 +9,7 @@ import {ChangeSigner} from "../../script/ChangeSignerInECDSAOwnedDKIMRegistry.s. import {ECDSAOwnedDKIMRegistry} from "../../src/utils/ECDSAOwnedDKIMRegistry.sol"; import {StructHelper} from "../helpers/StructHelper.sol"; -contract ChangeSignerInECDSAOwnedDKIMRegistryTest is StructHelper { +contract ChangeSignerInECDSAOwnedDKIMRegistryScriptTest is StructHelper { function setUp() public override { vm.setEnv( "PRIVATE_KEY", @@ -21,7 +21,7 @@ contract ChangeSignerInECDSAOwnedDKIMRegistryTest is StructHelper { function test_run() public { skipIfZkSync(); - + Deploy deploy = new Deploy(); deploy.run(); ChangeSigner changeSigner = new ChangeSigner(); 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 0c90097a..7b7e22b5 100644 --- a/packages/contracts/test/script/ChangeSourceInForwardDKIMRegistry.t.sol +++ b/packages/contracts/test/script/ChangeSourceInForwardDKIMRegistryScript.t.sol @@ -10,7 +10,7 @@ import {ChangeSource} from "../../script/ChangeSourceInForwardDKIMRegistry.s.sol import {ForwardDKIMRegistry} from "../../src/utils/ForwardDKIMRegistry.sol"; import {StructHelper} from "../helpers/StructHelper.sol"; -contract ChangeSourceInForwardDKIMRegistryTest is StructHelper { +contract ChangeSourceInForwardDKIMRegistryScriptTest is StructHelper { function setUp() public override { vm.setEnv( "PRIVATE_KEY", diff --git a/packages/contracts/test/script/DeployCommons.t.sol b/packages/contracts/test/script/DeployCommonsScript.t.sol similarity index 56% rename from packages/contracts/test/script/DeployCommons.t.sol rename to packages/contracts/test/script/DeployCommonsScript.t.sol index a9ff89b2..4767fd66 100644 --- a/packages/contracts/test/script/DeployCommons.t.sol +++ b/packages/contracts/test/script/DeployCommonsScript.t.sol @@ -4,24 +4,21 @@ pragma solidity ^0.8.12; import "forge-std/Test.sol"; import "forge-std/console.sol"; -import { Deploy } from "../../script/DeployCommons.s.sol"; -import { StructHelper } from "../helpers/StructHelper.sol"; +import {Deploy} from "../../script/DeployCommons.s.sol"; +import {StructHelper} from "../helpers/StructHelper.sol"; -contract DeployCommonsTest is StructHelper { +contract DeployCommonsScriptTest is StructHelper { function setUp() public override { vm.setEnv( - "PRIVATE_KEY", + "PRIVATE_KEY", "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" ); - vm.setEnv( - "SIGNER", - "0x69bec2dd161d6bbcc91ec32aa44d9333ebc864c0" - ); + vm.setEnv("SIGNER", "0x69bec2dd161d6bbcc91ec32aa44d9333ebc864c0"); } function test_run() public { skipIfZkSync(); - + Deploy deploy = new Deploy(); deploy.run(); } 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 6a66b7f1..33294a01 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 {StructHelper} from "../helpers/StructHelper.sol"; -contract DeployRecoveryControllerTest is StructHelper { +contract DeployRecoveryControllerScriptTest is StructHelper { function setUp() public override { vm.setEnv( "PRIVATE_KEY", @@ -18,7 +18,7 @@ contract DeployRecoveryControllerTest is StructHelper { function test_run() public { skipIfZkSync(); - + Deploy deploy = new Deploy(); deploy.run(); require( @@ -39,16 +39,4 @@ contract DeployRecoveryControllerTest is StructHelper { "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 62% rename from packages/contracts/test/script/DeploySimpleWallet.t.sol rename to packages/contracts/test/script/DeploySimpleWalletScript.t.sol index a0bbf164..82bdcc2f 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 { StructHelper } from "../helpers/StructHelper.sol"; +import {Deploy} from "../../script/DeployCommons.s.sol"; +import {StructHelper} from "../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 cafb6610..d2ec7274 100644 --- a/packages/contracts/test/script/RenounceOwners.t.sol +++ b/packages/contracts/test/script/RenounceOwnersScript.t.sol @@ -10,7 +10,7 @@ import {RenounceOwners} from "../../script/RenounceOwners.s.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {StructHelper} from "../helpers/StructHelper.sol"; -contract RenounceOwnersTest is StructHelper { +contract RenounceOwnersScriptTest is StructHelper { function setUp() public override { 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 862eba32..c6ac7b36 100644 --- a/packages/contracts/test/script/Upgrades.t.sol +++ b/packages/contracts/test/script/UpgradesScript.t.sol @@ -11,7 +11,7 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {StructHelper} from "../helpers/StructHelper.sol"; -contract UpgradesTest is StructHelper { +contract UpgradesScriptTest is StructHelper { uint256 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; @@ -25,7 +25,7 @@ contract UpgradesTest is StructHelper { function test_run() public { skipIfZkSync(); - + Deploy deploy = new Deploy(); deploy.run(); vm.setEnv("SOURCE_DKIM", vm.toString(vm.envAddress("ECDSA_DKIM"))); diff --git a/packages/prover/Dockerfile b/packages/prover/Dockerfile index 256a6db4..97296dd7 100644 --- a/packages/prover/Dockerfile +++ b/packages/prover/Dockerfile @@ -1,50 +1,67 @@ -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 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 -# 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=1Ybtxe1TCVUtHzCPUs9cuZAGbM-MVwigE" +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 d182cc81..eb4c1f74 100644 --- a/packages/prover/core.py +++ b/packages/prover/core.py @@ -3,11 +3,11 @@ 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: - 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") @@ -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 b8266f1e..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=1Ybtxe1TCVUtHzCPUs9cuZAGbM-MVwigE" +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 54b93b3d..44d95f58 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.1.0") +app = modal.App("email-auth-prover-v1.4.0") image = modal.Image.from_dockerfile("Dockerfile") @@ -15,8 +15,10 @@ mounts=[ modal.Mount.from_local_python_packages("core"), ], - cpu=14, + cpu=16, + gpu="any", secrets=[modal.Secret.from_name("gc-ether-email-auth-prover")], + keep_warm=True ) @modal.wsgi_app() def flask_app(): @@ -45,17 +47,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) diff --git a/packages/relayer/.env.example b/packages/relayer/.env.example deleted file mode 100644 index fe8fd1be..00000000 --- a/packages/relayer/.env.example +++ /dev/null @@ -1,21 +0,0 @@ -EMAIL_ACCOUNT_RECOVERY_VERSION_ID= # Version ID of the email account recovery. -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. - -SMTP_SERVER= - -PROVER_ADDRESS="https://zkemail--email-auth-prover-v1-0-4-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/ - -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 diff --git a/packages/relayer/CODING_GUIDELINES.md b/packages/relayer/CODING_GUIDELINES.md new file mode 100644 index 00000000..93043ca2 --- /dev/null +++ b/packages/relayer/CODING_GUIDELINES.md @@ -0,0 +1,98 @@ +# Coding Guidelines for Relayer + +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 + +- **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/packages/relayer/CONTRIBUTING.md b/packages/relayer/CONTRIBUTING.md new file mode 100644 index 00000000..b249c89d --- /dev/null +++ b/packages/relayer/CONTRIBUTING.md @@ -0,0 +1,116 @@ +# 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](#contributing-to-relayer) + - [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/packages/relayer/Cargo.lock b/packages/relayer/Cargo.lock new file mode 100644 index 00000000..69b1b3d4 --- /dev/null +++ b/packages/relayer/Cargo.lock @@ -0,0 +1,5142 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "async-trait" +version = "0.1.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "axum" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 1.0.1", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq 0.3.1", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2", + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +dependencies = [ + "serde", +] + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.23", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfdkim" +version = "0.3.3" +source = "git+https://github.com/zkemail/dkim.git#3b1cfd75e2afad12fbc1e8ece50e93e51415118b" +dependencies = [ + "base64 0.21.7", + "chrono", + "console_error_panic_hook", + "ed25519-dalek", + "futures", + "getrandom", + "indexmap 1.9.3", + "js-sys", + "mailparse", + "nom", + "quick-error 2.0.1", + "regex", + "rsa", + "serde_json", + "sha-1", + "sha2", + "slog", + "trust-dns-resolver", + "wasm-bindgen", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "charset" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f927b07c74ba84c7e5fe4db2baeb3e996ab2688992e39ac68ce3220a677c7e" +dependencies = [ + "base64 0.22.1", + "encoding_rs", +] + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "coins-bip32" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58", + "coins-core", + "digest", + "hmac", + "k256", + "serde", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-bip39" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58", + "digest", + "generic-array", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3", + "thiserror", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-hex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +dependencies = [ + "serde", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" +dependencies = [ + "base64 0.21.7", + "bytes", + "hex", + "k256", + "log", + "rand", + "rlp", + "serde", + "sha3", + "zeroize", +] + +[[package]] +name = "enum-as-inner" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "eth-keystore" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3", + "thiserror", + "uuid 0.8.2", +] + +[[package]] +name = "ethabi" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +dependencies = [ + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror", + "uint", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" +dependencies = [ + "const-hex", + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" +dependencies = [ + "Inflector", + "const-hex", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "reqwest", + "serde", + "serde_json", + "syn 2.0.79", + "toml", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" +dependencies = [ + "Inflector", + "const-hex", + "ethers-contract-abigen", + "ethers-core", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.79", +] + +[[package]] +name = "ethers-core" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array", + "k256", + "num_enum", + "once_cell", + "open-fastrlp", + "rand", + "rlp", + "serde", + "serde_json", + "strum", + "syn 2.0.79", + "tempfile", + "thiserror", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" +dependencies = [ + "chrono", + "ethers-core", + "reqwest", + "semver 1.0.23", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.21.7", + "bytes", + "const-hex", + "enr", + "ethers-core", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "http 0.2.12", + "instant", + "jsonwebtoken", + "once_cell", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "const-hex", + "elliptic-curve", + "eth-keystore", + "ethers-core", + "rand", + "sha2", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" +dependencies = [ + "cfg-if", + "const-hex", + "dirs", + "dunce", + "ethers-core", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver 1.0.23", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[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 = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "file-rotate" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3ed82142801f5b1363f7d463963d114db80f467e860b1cd82228eaebc627a0" +dependencies = [ + "chrono", + "flate2", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.6.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "halo2curves" +version = "0.7.0" +source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#8771fe5a5d54fc03e74dbc8915db5dad3ab46a83" +dependencies = [ + "blake2", + "digest", + "ff", + "group", + "halo2derive", + "lazy_static", + "num-bigint", + "num-integer", + "num-traits", + "pairing", + "pasta_curves", + "paste", + "rand", + "rand_core", + "rayon", + "sha2", + "static_assertions", + "subtle", + "unroll", +] + +[[package]] +name = "halo2derive" +version = "0.1.0" +source = "git+https://github.com/privacy-scaling-explorations/halo2curves.git#8771fe5a5d54fc03e74dbc8915db5dad3ab46a83" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "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", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.30", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "hyper-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + +[[package]] +name = "ipnet" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" + +[[package]] +name = "is-terminal" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +dependencies = [ + "hermit-abi 0.4.0", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +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 = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.7", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lalrpop" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set", + "ena", + "itertools 0.11.0", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin 0.9.8", +] + +[[package]] +name = "libc" +version = "0.2.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "libloading" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "mailparse" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da03d5980411a724e8aaf7b61a7b5e386ec55a7fb49ee3d0ff79efc7e5e7c7e" +dependencies = [ + "charset", + "data-encoding", + "quoted_printable", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[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 = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "neon" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e15415261d880aed48122e917a45e87bb82cf0260bb6db48bbab44b7464373" +dependencies = [ + "neon-build", + "neon-macros", + "neon-runtime", + "semver 0.9.0", + "smallvec", +] + +[[package]] +name = "neon-build" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bac98a702e71804af3dacfde41edde4a16076a7bbe889ae61e56e18c5b1c811" + +[[package]] +name = "neon-macros" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7288eac8b54af7913c60e0eb0e2a7683020dffa342ab3fd15e28f035ba897cf" +dependencies = [ + "quote", + "syn 1.0.109", + "syn-mid", +] + +[[package]] +name = "neon-runtime" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4676720fa8bb32c64c3d9f49c47a47289239ec46b4bdb66d0913cc512cb0daca" +dependencies = [ + "cfg-if", + "libloading", + "smallvec", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "serde", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "object" +version = "0.36.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff", + "group", + "lazy_static", + "rand", + "static_assertions", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.6.0", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "poseidon-rs" +version = "1.0.0" +source = "git+https://github.com/zkemail/poseidon-rs.git#fe5ce2634c27326219d4faf75beb73b40a0beb7d" +dependencies = [ + "getrandom", + "halo2curves", + "once_cell", + "serde", + "thiserror", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +dependencies = [ + "proc-macro2", + "syn 2.0.79", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +dependencies = [ + "bitflags 2.6.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quoted_printable" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "640c9bd8497b02465aeef5375144c26062e0dcd5939dfcbb0f5db76cb8c17c73" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "relayer" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "chrono", + "relayer-utils", + "serde", + "serde_json", + "slog", + "sqlx", + "tokio", + "tower-http", + "uuid 1.10.0", +] + +[[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", + "cfdkim", + "ethers", + "file-rotate", + "halo2curves", + "hex", + "hmac-sha256", + "itertools 0.10.5", + "lazy_static", + "neon", + "num-bigint", + "num-traits", + "once_cell", + "poseidon-rs", + "rand_core", + "regex", + "rsa", + "serde", + "serde_json", + "slog", + "slog-async", + "slog-json", + "slog-term", + "tokio", + "zk-regex-apis", +] + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration", + "tokio", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error 1.2.3", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "serde", + "sha2", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.23", +] + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scale-info" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" +dependencies = [ + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slog" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" + +[[package]] +name = "slog-async" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c8038f898a2c79507940990f05386455b3a317d8f18d4caea7cbc3d5096b84" +dependencies = [ + "crossbeam-channel", + "slog", + "take_mut", + "thread_local", +] + +[[package]] +name = "slog-json" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e1e53f61af1e3c8b852eef0a9dee29008f55d6dd63794f3f12cef786cf0f219" +dependencies = [ + "serde", + "serde_json", + "slog", + "time", +] + +[[package]] +name = "slog-term" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e022d0b998abfe5c3782c1f03551a596269450ccd677ea51c56f8b214610e8" +dependencies = [ + "is-terminal", + "slog", + "term", + "thread_local", + "time", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools 0.11.0", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlformat" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" +dependencies = [ + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" +dependencies = [ + "atoi", + "byteorder", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.14.5", + "hashlink", + "hex", + "indexmap 2.6.0", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.79", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" +dependencies = [ + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.79", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.6.0", + "byteorder", + "bytes", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.6.0", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "tracing", + "url", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.79", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svm-rs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" +dependencies = [ + "dirs", + "fs2", + "hex", + "once_cell", + "reqwest", + "semver 1.0.23", + "serde", + "serde_json", + "sha2", + "thiserror", + "url", + "zip", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-mid" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea305d57546cc8cd04feb14b62ec84bf17f50e3f7b12560d7bfa9265f39d9ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sync_wrapper" +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" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", +] + +[[package]] +name = "tokio-util" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap 2.6.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 0.1.2", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8437150ab6bbc8c5f0f519e3d5ed4aa883a83dd4cdd3d1b21f9482936046cb97" +dependencies = [ + "bitflags 2.6.0", + "bytes", + "http 1.1.0", + "pin-project-lite", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "trust-dns-proto" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.2.3", + "ipnet", + "lazy_static", + "rand", + "smallvec", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" +dependencies = [ + "cfg-if", + "futures-util", + "ipconfig", + "lazy_static", + "lru-cache", + "parking_lot", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", + "trust-dns-proto", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 0.2.12", + "httparse", + "log", + "rand", + "rustls", + "sha1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "unroll" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad948c1cb799b1a70f836077721a92a35ac177d4daddf4c20a633786d4cf618" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna 0.5.0", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", + "serde", +] + +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +dependencies = [ + "getrandom", + "serde", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if", + "once_cell", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.79", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "wasm-bindgen-test" +version = "0.3.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68497a05fb21143a08a7d24fc81763384a3072ee43c44e86aad1744d6adef9d9" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "minicov", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8220be1fa9e4c889b30fd207d4906657e7e90b12e0e6b0c8b8d8709f5de021" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", +] + +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper 0.6.0", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq 0.1.5", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zk-regex-apis" +version = "2.1.1" +source = "git+https://github.com/zkemail/zk-regex.git#531575345558ba938675d725bd54df45c866ef74" +dependencies = [ + "fancy-regex", + "itertools 0.13.0", + "js-sys", + "serde", + "serde-wasm-bindgen", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-test", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/packages/relayer/Cargo.toml b/packages/relayer/Cargo.toml index 2ce3120e..66aed43b 100644 --- a/packages/relayer/Cargo.toml +++ b/packages/relayer/Cargo.toml @@ -1,60 +1,31 @@ [package] name = "relayer" -version = "1.1.0" +version = "0.1.0" edition = "2021" [dependencies] -tower-http = { version = "0.4", git = "https://github.com/tower-rs/tower-http.git", features = [ - "cors", -], rev = "f33c3e038dc85b8d064541e915d501f9c9e6a6b4" } -tokio = { version = "1.0", features = ["full"] } -sled = "0.34.2" -anyhow = "1.0.75" -dotenv = "0.15.0" -oauth2 = "4.3.0" -async-imap = { version = "0.9.1", default-features = false, features = [ - "runtime-tokio", -] } -async-native-tls = { version = "0.5.0", default-features = false, features = [ - "runtime-tokio", -] } -serde = { version = "1.0", features = ["derive"] } -webbrowser = "0.8.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"] } -relayer-utils = { git = "https://github.com/zkemail/relayer-utils", rev = "2c3e9b8" } -futures = "0.3.28" -sqlx = { version = "=0.7.3", features = ["postgres", "runtime-tokio"] } -regex = "1.10.2" -axum = "0.6.20" -rand = "0.8.5" -reqwest = "0.11.22" -num-bigint = { version = "0.4", features = ["rand"] } -num-traits = "0.2.16" -hex = "0.4.3" -chrono = "0.4.31" -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" +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", "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" } slog = { version = "2.7.0", features = [ "max_level_trace", "release_max_level_warn", ] } -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" +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" +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.10" +ethers = "2.0.14" diff --git a/packages/relayer/README.md b/packages/relayer/README.md index e0ef2c5f..291fc5b8 100644 --- a/packages/relayer/README.md +++ b/packages/relayer/README.md @@ -1,233 +1 @@ -This is a Relayer server implementation in Rust for email-based account recovery. - -## How to Run the Relayer -You can run the relayer either on your local environments or cloud instances (we are using GCP). -### Local -1. Clone the repo, https://github.com/zkemail/ether-email-auth. -2. Install dependencies. - 1. `cd ether-email-auth` and run `yarn`. -3. If you have not deployed common contracts, build contract artifacts and deploy required contracts. - 1. `cd packages/contracts` and run `forge build`. - 2. Set the env file in `packages/contracts/.env`, an example env file is as follows, - - ```jsx - LOCALHOST_RPC_URL=http://127.0.0.1:8545 - SEPOLIA_RPC_URL=https://sepolia.base.org - MAINNET_RPC_URL=https://mainnet.base.org - - 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" - ``` - 3. Run `forge script script/DeployCommons.s.sol:Deploy -vvvv --rpc-url $RPC_URL --broadcast` to get `ECDSAOwnedDKIMRegistry`, `Verifier`, `EmailAuth implementation` and `SimpleWallet implementation`. -4. Install PostgreSQL and create a database. - 1. `psql -U -d postgres` to login to administrative PostgreSQL user. Replace **``** with the administrative PostgreSQL user (commonly **`postgres`**). - 2. Create a new user, `CREATE USER my_new_user WITH PASSWORD 'my_secure_password';`, `ALTER USER my_new_user CREATEDB;`. - 3. Exit `psql` and now create a new database, `psql -U new_user -d postgres` followed by `CREATE DATABASE my_new_database;`. -5. Run the prover. - 1. `cd packages/prover` and `python local.py`, let this run async. -6. Run the relayer. - 1. `cd packages/relayer`. - 2. Set the env file, an example env file is as follows, - ```jsx - EMAIL_ACCOUNT_RECOVERY_VERSION_ID=1 # Address of the deployed wallet contract. - PRIVATE_KEY= # Private key for Relayer's account. - CHAIN_RPC_PROVIDER=https://sepolia.base.org - CHAIN_RPC_EXPLORER=https://sepolia.basescan.org - CHAIN_ID=84532 # Chain ID of the testnet. - - # IMAP + SMTP (Settings will be provided by your email provider) - IMAP_DOMAIN_NAME=imap.gmail.com - IMAP_PORT=993 - AUTH_TYPE=password - SMTP_DOMAIN_NAME=smtp.gmail.com - LOGIN_ID= # IMAP login id - usually your email address. - LOGIN_PASSWORD="" # IMAP password - usually your email password. - - PROVER_ADDRESS="http://localhost:8080" # Address of the prover. - - 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" - 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 - ``` - 3. Generate the `.ic.pem` file and password. - - Create the `.ic.pem` file using OpenSSL: - ```sh - openssl genpkey -algorithm RSA -out .ic.pem -aes-256-cbc -pass pass:your_password - ``` - - If you need a password, you can generate a random password using: - ```sh - openssl rand -base64 32 - ``` -7. You should have your entire setup up and running! - -NOTE: You need to turn on IMAP on the email id you’d be using for the relayer. - -#### Appendix: If you use your own gmail for the relayer - -If you intend to use a Gmail address, you need to configure your Google account and Gmail as follows: - -##### Enable IMAP: - -Gmail -> See all settings -> Forwarding and POP/IMAP -> IMAP access -> Enable IMAP. - -Note that from June 2024, IMAP will be enabled by default. - -##### Enable two-factor authentication for your Google account: - -Refer to the following help link. - -[Google 2FA Setup](https://support.google.com/accounts/answer/185839?hl=en&co=GENIE.Platform%3DDesktop) - -##### Create an app password: - -Refer to the following help link. If you do not see the 'App passwords' option, try searching for 'app pass' in the search box to select it. - -[Google App Passwords](https://support.google.com/accounts/answer/185833?hl=en) - -### Production on GCP -1. Install `kubectl` on your system (https://kubernetes.io/docs/tasks/tools/) -2. Setup k8s config of `zkemail` cluster on GKE, -`gcloud container clusters get-credentials zkemail --region us-central1 --project (your_project_name)` -3. One time steps (already done) - 1. Create a static IP (https://cloud.google.com/vpc/docs/reserve-static-external-ip-address#gcloud) - 2. Map the static IP with a domain from Google Domain - 3. Create a `Managed Certificate` by applying `kubernetes/managed-cert.yml` (update the domain accordingly) -4. (Optional) Delete `db.yml` , `ingress.yml` and `relayer.yml` if applied already -5. (Optional) Build the Relayer’s Docker image and publish it. -6. Set the config in the respective manifests (Here, you can set the image of the relayer in `relayer.yml` , latest image already present in the config.) -7. Apply `db.yml` -8. Apply `relayer.yml` , ssh into the pod and run `nohup cargo run &` , this step should be done under a min to pass the liveness check. -9. Apply `ingress.yml` - -## Specification -### Database -It has the following tables in the DB. -- `credentials`: a table to store an account code for each pair of the wallet address and the guardian's email address. - - `account_code TEXT PRIMARY KEY` - - `account_eth_addr TEXT NOT NULL` - - `guardian_email_addr TEXT NOT NULL` - - `is_set BOOLEAN NOT NULL DEFAULT FALSE` - -- `requests`: a table to store requests from the caller of REST APIs. - - `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` - -### REST APIs -It exposes the following REST APIs. - -- `GET requestStatus` - 1. Receive `request_id`. - 2. Retrieve a record with `request_id` from the `requests` table. If such a record does not exist, return 0. - 3. If `is_processed` is false, return 1. Otherwise, return 2, `is_success`, `email_nullifier`, `account_salt`. - -- `POST getAccountSalt` - 1. Receive `account_code` and `email_addr`. - 2. Compute `account_salt` from the given `account_code` and `email_addr`. - 3. Return `account_salt`. - -- `POST acceptanceRequest` - 1. Receive `controller_eth_addr`, `guardian_email_addr`, `account_code`, `template_idx`, and `subject`. - 2. Let `subject_template` be the `template_idx`-th template in `acceptanceSubjectTemplates()` of `controller_eth_addr`. - 3. If `subject` does not match with `subject_template` return a 400 response. Let `subject_params` be the parsed values. - 4. Extract `account_eth_addr` from the given `subject` by following `subject_template`. - 5. If the contract of `account_eth_addr` is not deployed, return a 400 response. - 4. If a record with `account_code` exists in the `credentials` table, return a 400 response. - 6. Randomly generate a `request_id`. If a record with `request_id` exists in the `requests` table, regenerate a new `request_id`. - 7. If a record with `account_eth_addr`, `guardian_email_addr` and `is_set=true` exists in the `credentials` table, - 1. Insert `(request_id, account_eth_addr, controller_eth_addr, guardian_email_addr, false, template_idx, false)` into the `requests` table. - 2. Send `guardian_email_addr` an error email to say that `account_eth_addr` tries to set you to a guardian, which is rejected since you are already its guardian. - 3. Return a 200 response along with `request_id` and `subject_params` **to prevent a malicious client user from learning if the pair of the `account_eth_addr` and the `guardian_email_addr` is already set or not.** - 8. Insert `(account_code, account_eth_addr, controller_eth_addr, guardian_email_addr, false)` into the `credentials` table. - 9. Insert `(request_id, account_eth_addr, controller_eth_addr, guardian_email_addr, false, template_idx)` into the `requests` table. - 10. Send an email as follows. - - To: `guardian_email_addr` - - Subject: if the domain of `guardian_email_addr` signs the To field, `subject`. Otherwise, `subject + " Code " + hex(account_code)"`. - - Reply-to: `relayer_email_addr_before_domain + "+code" + hex(account_code) + "@" + relayer_email_addr_domain`. - - Body: Any message, but it MUST contain `"#" + digit(request_id)`. - 11. Return a 200 response along with `request_id` and `subject_params`. - -- `POST recoveryRequest` - 1. Receive `controller_eth_addr`, `guardian_email_addr`, `template_idx`, and `subject`. - 2. Let `subject_template` be the `template_idx`-th template in `recoverySubjectTemplates()` of `account_eth_addr`. - 3. If the `subject` does not match with `subject_template` return a 400 response. Let `subject_params` be the parsed values. - 4. Extract `account_eth_addr` from the given `subject` by following `subject_template`. - 5. If the contract of `account_eth_addr` is not deployed, return a 400 response. - 6. Randomly generate a `request_id`. If a record with `request_id` exists in the `requests` table, regenerate a new `request_id`. - 7. If a record with `account_eth_addr`, `guardian_email_addr`, and `is_set=true` exists in the `credentials` table, - 1. Insert `(request_id, account_eth_addr, controller_eth_addr, guardian_email_addr, true, template_idx, false)` into the `requests` table. - 2. Send an email as follows. - - To: `guardian_email_addr` - - Subject: if the domain of `guardian_email_addr` signs the To field, `subject`. Otherwise, `subject + " Code " + hex(account_code)"`. - - Reply-to: `relayer_email_addr_before_domain ~~+ "+code" + hex(account_code)~~ + "@" + relayer_email_addr_domain`. - - Body: Any message, but it MUST contain `"#" + digit(request_id)`. - 3. Return a 200 response along with `request_id` and `subject_params`. - 7. If a record with `account_eth_addr`, `guardian_email_addr`, and `is_set=false` exists in the `credentials` table, - 1. Insert `(request_id, account_eth_addr, guardian_email_addr, true, template_idx, false)` into the `requests` table. - 2. Send an email as follows. - - To: `guardian_email_addr` - - Subject: A message to say that `account_eth_addr` requests your account recovery, but you have not approved being its guardian. - 3. Return a 200 response along with `request_id` and `subject_params`. - 8. If a record with `account_eth_addr`, `guardian_email_addr` does not exist in the `credentials` table, - 1. Insert `(request_id, account_eth_addr, guardian_email_addr, true, template_idx, false)` into the `requests` table. - 2. Send an email as follows. - - To: `guardian_email_addr` - - Subject: if the domain of `guardian_email_addr` signs the To field, `subject`. Otherwise, `subject + " Code "`. - - Reply-to: `relayer_email_addr_before_domain + "@" + relayer_email_addr_domain`. - - Body: Any message, but it MUST contain `"#" + digit(request_id)`. Also, the message asks the guardian to reply to this email **with the guardian’s account code after `" Code "` in the subject.** - 3. Return a 200 response along with `request_id` and `subject_params`. - -- `POST completeRequest` - 1. Receive `account_eth_addr`, `controller_eth_addr`, and `complete_calldata`. - 2. If the contract of `acciybt_eth_addr` is not deployed, return a 400 response. - 3. Call the `completeRecovery` function in the contract of `controller_eth_addr` with passing `account_eth_addr` and `complete_calldata`. - 4. If the transaction fails, return a 400 response. Otherwise, return a 200 response. - -### Handling Email -When receiving a new email, the relayer handles it as follows. -1. Extract `guardian_email_addr` from the From field, `raw_subject` from the Subject field, and `"#" + digit(request_id)` from the email body. -2. If no record with `request_id` exists in the `requests` table, send `guardian_email_addr` an email to tell that the given `request_id` does not exist. -3. If the invitation code for `account_code` exists in the email header, - 1. If a record with `account_code` exists in the `credentials` table, assert that `guardian_email_addr` is the same as the extracted one. - 2. If no record with `account_code` exists in the `credentials` table, assert that the `EmailAuth` contract whose address corresponds to `account_code` and `guardian_email_addr` is already deployed. Also, insert `(account_code, account_eth_addr, guardian_email_addr, true)` into the `credentials` table, where `account_eth_addr` is the owner of that deployed `EmailAuth` contract. Note that this step is for a guardian who sends an email to a new relayer due to the old relayer’s censorship. -4. Let `email_domain` be a domain of `guardian_email_addr`. -5. Fetch a public key of `email_domain` from DNS and compute its `public_key_hash`. -6. Let `dkim` be the output of `dkim()` of `account_eth_addr`. -7. If `DKIM(dkim).isDKIMPublicKeyHashValid(email_domain, public_key_hash)` is false, call the DKIM oracle and update the `dkim` contract. -8. If `is_for_recovery` is false, - 1. Let `subject_template` be the `template_idx`-th template in `acceptanceSubjectTemplates()` of `controller_eth_addr`. - 2. If `subject` does not match with `subject_template`, send `guardian_email_addr` an error email. - 3. Parse `subject` to get `subject_params` and `skiped_subject_prefix`. - 4. Let `templateId` be `keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "ACCEPTANCE", templateIdx)`. - 5. Generate a proof for the circuit and construct `email_proof`. - 6. Construct `email_auth_msg` and call `EmailAccountRecovery(controller_eth_addr).handleAcceptance(email_auth_msg, template_idx)`. - 7. If the transaction fails, send `guardian_email_addr` an error email and update a record with `request_id` in the `requests` table to `(is_processed=true, is_success=false, email_nullifier=email_proof.email_nullifier, account_salt=email_proof.email_nullifier, is_code_exist=email_proof.is_code_exist)`. - 8. Update a record with `account_code` in the `credentials` table to `is_set=true`. - 9. Send `guardian_email_addr` a success email and update a record with `request_id` in the `requests` table to `(is_processed=true, is_success=true, email_nullifier=email_proof.email_nullifier, account_salt=email_proof.email_nullifier, is_code_exist=email_proof.is_code_exist)`. -9. If `is_for_recovery` is true, - 1. Let `subject_template` be the `template_idx`-th template in `recoverySubjectTemplates()` of `controller_eth_addr`. - 2. If `subject` does not match with `subject_template`, send `guardian_email_addr` an error email. - 3. Parse `subject` to get `subject_params` and `skiped_subject_prefix`. - 4. Let `templateId` be `keccak256(EMAIL_ACCOUNT_RECOVERY_VERSION_ID, "RECOVERY", templateIdx)`. - 5. Generate a proof for the circuit and construct `email_proof`. - 6. Construct `email_auth_msg` and call `EmailAccountRecovery(controller_eth_addr).handleRecovery(email_auth_msg, template_idx)`. - 7. If the transaction fails, send `guardian_email_addr` an error email and update a record with `request_id` in the `requests` table to `(is_processed=true, is_success=false, email_nullifier=email_proof.email_nullifier, account_salt=email_proof.account_salt, is_code_exist=email_proof.is_code_exist)`. - 8. Send `guardian_email_addr` a success email and update a record with `request_id` in the `requests` table to `(is_processed=true, is_success=true, email_nullifier=email_proof.email_nullifier, account_salt=email_proof.email_nullifier, is_code_exist=email_proof.is_code_exist)`. +# Generic Relayer diff --git a/packages/relayer/build.rs b/packages/relayer/build.rs index 28907c0e..0da3c7f8 100644 --- a/packages/relayer/build.rs +++ b/packages/relayer/build.rs @@ -10,6 +10,7 @@ fn main() { .unwrap() .write_to_file("./src/abis/email_auth.rs") .unwrap(); + Abigen::new( "ECDSAOwnedDKIMRegistry", "../contracts/artifacts/ECDSAOwnedDKIMRegistry.sol/ECDSAOwnedDKIMRegistry.json", @@ -19,13 +20,4 @@ fn main() { .unwrap() .write_to_file("./src/abis/ecdsa_owned_dkim_registry.rs") .unwrap(); - Abigen::new( - "EmailAccountRecovery", - "../contracts/artifacts/EmailAccountRecovery.sol/EmailAccountRecovery.json", - ) - .unwrap() - .generate() - .unwrap() - .write_to_file("./src/abis/email_account_recovery.rs") - .unwrap(); } diff --git a/packages/relayer/config.example.json b/packages/relayer/config.example.json new file mode 100644 index 00000000..d415c77f --- /dev/null +++ b/packages/relayer/config.example.json @@ -0,0 +1,25 @@ +{ + "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", + "alchemyApiKey": "", + "paths": { + "pem": "./.ic.pem", + "emailTemplates": "./email_templates" + }, + "icp": { + "canisterId": "q7eci-dyaaa-aaaak-qdbia-cai", + "icReplicaUrl": "https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.icp0.io/?id=q7eci-dyaaa-aaaak-qdbia-cai" + }, + "chains": { + "baseSepolia": { + "privateKey": "0x...", + "rpcUrl": "https://mainnet.infura.io/v3/...", + "explorerUrl": "https://etherscan.io/tx/", + "chainId": 1, + "alchemyName": "base-sepolia" + } + }, + "jsonLogger": true +} diff --git a/packages/relayer/email_templates/acknowledgement_template.html b/packages/relayer/email_templates/acknowledgement_template.html new file mode 100644 index 00000000..729f7a13 --- /dev/null +++ b/packages/relayer/email_templates/acknowledgement_template.html @@ -0,0 +1,250 @@ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +
+ Hi, +
+ 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..04053475 --- /dev/null +++ b/packages/relayer/email_templates/command_template.html @@ -0,0 +1,260 @@ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +
+ Hi, +
+ {{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..cc39f73e --- /dev/null +++ b/packages/relayer/email_templates/completion_template.html @@ -0,0 +1,250 @@ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +
+ Hi, +
+ 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 +

+ + + + + + + +
+ + + + + + + +
+
+
+ + diff --git a/packages/relayer/eml_templates/acceptance_request.html b/packages/relayer/eml_templates/acceptance_request.html deleted file mode 100644 index 6c20379e..00000000 --- a/packages/relayer/eml_templates/acceptance_request.html +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - Email Auth - - - Set Your Guardian Email - - - - - - - - - diff --git a/packages/relayer/eml_templates/acceptance_success.html b/packages/relayer/eml_templates/acceptance_success.html deleted file mode 100644 index 4e45a5b4..00000000 --- a/packages/relayer/eml_templates/acceptance_success.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - Email Auth - - - Guardian Email Set! - - - - - - - - - diff --git a/packages/relayer/eml_templates/acknowledgement.html b/packages/relayer/eml_templates/acknowledgement.html deleted file mode 100644 index 713ce805..00000000 --- a/packages/relayer/eml_templates/acknowledgement.html +++ /dev/null @@ -1,413 +0,0 @@ - - - - - - Email Wallet - - - Email Wallet Acknowledgement - - - - - - - - - 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 23f0663f..00000000 Binary files a/packages/relayer/eml_templates/assets/font/Regola Pro Bold Oblique.otf and /dev/null differ diff --git a/packages/relayer/eml_templates/assets/font/Regola Pro Bold.otf b/packages/relayer/eml_templates/assets/font/Regola Pro Bold.otf deleted file mode 100644 index 8c2e1827..00000000 Binary files a/packages/relayer/eml_templates/assets/font/Regola Pro Bold.otf and /dev/null differ 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 73516f54..00000000 Binary files a/packages/relayer/eml_templates/assets/font/Regola Pro Book Oblique.otf and /dev/null differ 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 0c4f2d1a..00000000 Binary files a/packages/relayer/eml_templates/assets/font/Regola Pro Book.otf and /dev/null differ diff --git a/packages/relayer/eml_templates/assets/font/Regola Pro Medium Oblique.otf b/packages/relayer/eml_templates/assets/font/Regola Pro Medium Oblique.otf deleted file mode 100644 index 8cb59ed8..00000000 Binary files a/packages/relayer/eml_templates/assets/font/Regola Pro Medium Oblique.otf and /dev/null differ 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 ebd82315..00000000 Binary files a/packages/relayer/eml_templates/assets/font/Regola Pro Medium.otf and /dev/null differ diff --git a/packages/relayer/eml_templates/assets/font/Regola Pro Regular Oblique.otf b/packages/relayer/eml_templates/assets/font/Regola Pro Regular Oblique.otf deleted file mode 100644 index d117bfe7..00000000 Binary files a/packages/relayer/eml_templates/assets/font/Regola Pro Regular Oblique.otf and /dev/null differ 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 72bbbc87..00000000 Binary files a/packages/relayer/eml_templates/assets/font/Regola Pro Regular.otf and /dev/null differ diff --git a/packages/relayer/eml_templates/assets/img/discord.png b/packages/relayer/eml_templates/assets/img/discord.png deleted file mode 100644 index c26581b4..00000000 Binary files a/packages/relayer/eml_templates/assets/img/discord.png and /dev/null differ diff --git a/packages/relayer/eml_templates/assets/img/github.png b/packages/relayer/eml_templates/assets/img/github.png deleted file mode 100644 index b2bb469a..00000000 Binary files a/packages/relayer/eml_templates/assets/img/github.png and /dev/null differ diff --git a/packages/relayer/eml_templates/assets/img/logo.png b/packages/relayer/eml_templates/assets/img/logo.png deleted file mode 100644 index 5a488b7f..00000000 Binary files a/packages/relayer/eml_templates/assets/img/logo.png and /dev/null differ diff --git a/packages/relayer/eml_templates/assets/img/telegram.png b/packages/relayer/eml_templates/assets/img/telegram.png deleted file mode 100644 index 88e4322f..00000000 Binary files a/packages/relayer/eml_templates/assets/img/telegram.png and /dev/null differ diff --git a/packages/relayer/eml_templates/assets/img/x.png b/packages/relayer/eml_templates/assets/img/x.png deleted file mode 100644 index fc36c25e..00000000 Binary files a/packages/relayer/eml_templates/assets/img/x.png and /dev/null differ diff --git a/packages/relayer/eml_templates/credential_not_present.html b/packages/relayer/eml_templates/credential_not_present.html deleted file mode 100644 index d823a014..00000000 --- a/packages/relayer/eml_templates/credential_not_present.html +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - Email Auth - - - Credential Not Present - - - - - - - - - diff --git a/packages/relayer/eml_templates/error.html b/packages/relayer/eml_templates/error.html deleted file mode 100644 index aef12c26..00000000 --- a/packages/relayer/eml_templates/error.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - Email Auth - - - Error - - - - - - - - - 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 8d52d462..00000000 --- a/packages/relayer/eml_templates/guardian_already_exists.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - 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 deleted file mode 100644 index 853bb3d6..00000000 --- a/packages/relayer/eml_templates/guardian_not_set.html +++ /dev/null @@ -1,413 +0,0 @@ - - - - - - Email Auth - - - Guardian Not Set - - - - - - - - - diff --git a/packages/relayer/eml_templates/recovery_request.html b/packages/relayer/eml_templates/recovery_request.html deleted file mode 100644 index efb9d9ae..00000000 --- a/packages/relayer/eml_templates/recovery_request.html +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - Email Auth - - - Recovery Request - - - - - - - - - diff --git a/packages/relayer/eml_templates/recovery_success.html b/packages/relayer/eml_templates/recovery_success.html deleted file mode 100644 index d067c2f6..00000000 --- a/packages/relayer/eml_templates/recovery_success.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - Email Auth - - - Recovery Successful - - - - - - - - - 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/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..7b183059 --- /dev/null +++ b/packages/relayer/migrations/20241008135456_init.up.sql @@ -0,0 +1,24 @@ +-- Add up migration script here + +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +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(), + email_tx_auth JSONB NOT NULL +); + +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/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/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 56e0a90a..00000000 --- a/packages/relayer/src/abis/email_account_recovery.rs +++ /dev/null @@ -1,1512 +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("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::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( - "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"), - ), - },], - 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, - ), - ), - 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("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("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("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("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::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 `acceptanceSubjectTemplates` (0x5bafadda) function - pub fn acceptance_subject_templates( - &self, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, - > { - self.0 - .method_hash([91, 175, 173, 218], ()) - .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 { - 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 { - 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 { - 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 { - 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 { - self.0 - .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( - &self, - subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - template_idx: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([232, 29, 202, 242], (subject_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( - &self, - subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - template_idx: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([48, 230, 165, 171], (subject_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 `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, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::std::vec::Vec<::std::vec::Vec<::std::string::String>>, - > { - self.0 - .method_hash([62, 145, 205, 205], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verifier` (0x2b7ac3f3) function - pub fn verifier( - &self, - ) -> ::ethers::contract::builders::ContractCall { - 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 { - 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 `acceptanceSubjectTemplates` function with signature `acceptanceSubjectTemplates()` and selector `0x5bafadda` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - 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( - 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 `extractRecoveredAccountFromAcceptanceSubject` function with signature `extractRecoveredAccountFromAcceptanceSubject(bytes[],uint256)` and selector `0xe81dcaf2` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "extractRecoveredAccountFromAcceptanceSubject", - abi = "extractRecoveredAccountFromAcceptanceSubject(bytes[],uint256)" - )] - pub struct ExtractRecoveredAccountFromAcceptanceSubjectCall { - pub subject_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` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "extractRecoveredAccountFromRecoverySubject", - abi = "extractRecoveredAccountFromRecoverySubject(bytes[],uint256)" - )] - pub struct ExtractRecoveredAccountFromRecoverySubjectCall { - pub subject_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 `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, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "recoverySubjectTemplates", abi = "recoverySubjectTemplates()")] - pub struct RecoverySubjectTemplatesCall; - ///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 { - AcceptanceSubjectTemplates(AcceptanceSubjectTemplatesCall), - CompleteRecovery(CompleteRecoveryCall), - ComputeAcceptanceTemplateId(ComputeAcceptanceTemplateIdCall), - ComputeEmailAuthAddress(ComputeEmailAuthAddressCall), - ComputeRecoveryTemplateId(ComputeRecoveryTemplateIdCall), - Dkim(DkimCall), - DkimAddr(DkimAddrCall), - EmailAuthImplementation(EmailAuthImplementationCall), - EmailAuthImplementationAddr(EmailAuthImplementationAddrCall), - ExtractRecoveredAccountFromAcceptanceSubject( - ExtractRecoveredAccountFromAcceptanceSubjectCall, - ), - ExtractRecoveredAccountFromRecoverySubject(ExtractRecoveredAccountFromRecoverySubjectCall), - HandleAcceptance(HandleAcceptanceCall), - HandleRecovery(HandleRecoveryCall), - IsActivated(IsActivatedCall), - ProxyBytecodeHash(ProxyBytecodeHashCall), - RecoverySubjectTemplates(RecoverySubjectTemplatesCall), - 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::AcceptanceSubjectTemplates(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::ExtractRecoveredAccountFromAcceptanceSubject(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::ExtractRecoveredAccountFromRecoverySubject(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::ProxyBytecodeHash(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::RecoverySubjectTemplates(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::AcceptanceSubjectTemplates(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::ExtractRecoveredAccountFromAcceptanceSubject(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - 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::ProxyBytecodeHash(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), - } - } - } - 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::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::ExtractRecoveredAccountFromAcceptanceSubject(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::ExtractRecoveredAccountFromRecoverySubject(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) => ::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: AcceptanceSubjectTemplatesCall) -> Self { - Self::AcceptanceSubjectTemplates(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: ExtractRecoveredAccountFromAcceptanceSubjectCall) -> Self { - Self::ExtractRecoveredAccountFromAcceptanceSubject(value) - } - } - impl ::core::convert::From - for EmailAccountRecoveryCalls - { - fn from(value: ExtractRecoveredAccountFromRecoverySubjectCall) -> Self { - Self::ExtractRecoveredAccountFromRecoverySubject(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: ProxyBytecodeHashCall) -> Self { - Self::ProxyBytecodeHash(value) - } - } - impl ::core::convert::From for EmailAccountRecoveryCalls { - fn from(value: RecoverySubjectTemplatesCall) -> Self { - Self::RecoverySubjectTemplates(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 `acceptanceSubjectTemplates` function with signature `acceptanceSubjectTemplates()` and selector `0x5bafadda` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct AcceptanceSubjectTemplatesReturn( - 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 `extractRecoveredAccountFromAcceptanceSubject` function with signature `extractRecoveredAccountFromAcceptanceSubject(bytes[],uint256)` and selector `0xe81dcaf2` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct ExtractRecoveredAccountFromAcceptanceSubjectReturn( - pub ::ethers::core::types::Address, - ); - ///Container type for all return fields from the `extractRecoveredAccountFromRecoverySubject` function with signature `extractRecoveredAccountFromRecoverySubject(bytes[],uint256)` and selector `0x30e6a5ab` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - 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, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - 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, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct RecoverySubjectTemplatesReturn( - 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 subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub skiped_subject_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_subject: ::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 10d27c61..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("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("deleteSubjectTemplate"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "deleteSubjectTemplate", - ), - 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("getSubjectTemplate"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("getSubjectTemplate"), - 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("insertSubjectTemplate"), - ::std::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "insertSubjectTemplate", - ), - 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("_subjectTemplate"), - 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("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![ - ::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("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::vec![ - ::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned( - "updateSubjectTemplate", - ), - 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("_subjectTemplate"), - 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("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("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("SubjectTemplateDeleted"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "SubjectTemplateDeleted", - ), - 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("SubjectTemplateInserted"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "SubjectTemplateInserted", - ), - 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("SubjectTemplateUpdated"), - ::std::vec![ - ::ethers::core::abi::ethabi::Event { - name: ::std::borrow::ToOwned::to_owned( - "SubjectTemplateUpdated", - ), - 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("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 `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 `deleteSubjectTemplate` (0x519e50d1) function - pub fn delete_subject_template( - &self, - template_id: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([81, 158, 80, 209], 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 `getSubjectTemplate` (0x1e05a028) function - pub fn get_subject_template( - &self, - template_id: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall< - M, - ::std::vec::Vec<::std::string::String>, - > { - self.0 - .method_hash([30, 5, 160, 40], 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 `insertSubjectTemplate` (0xc4b84df4) function - pub fn insert_subject_template( - &self, - template_id: ::ethers::core::types::U256, - subject_template: ::std::vec::Vec<::std::string::String>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([196, 184, 77, 244], (template_id, subject_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 `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, - ) -> ::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 `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 `updateSubjectTemplate` (0x4dbb82f1) function - pub fn update_subject_template( - &self, - template_id: ::ethers::core::types::U256, - subject_template: ::std::vec::Vec<::std::string::String>, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([77, 187, 130, 241], (template_id, subject_template)) - .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 `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 `SubjectTemplateDeleted` event - pub fn subject_template_deleted_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - SubjectTemplateDeletedFilter, - > { - self.0.event() - } - ///Gets the contract's `SubjectTemplateInserted` event - pub fn subject_template_inserted_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - SubjectTemplateInsertedFilter, - > { - self.0.event() - } - ///Gets the contract's `SubjectTemplateUpdated` event - pub fn subject_template_updated_filter( - &self, - ) -> ::ethers::contract::builders::Event< - ::std::sync::Arc, - M, - SubjectTemplateUpdatedFilter, - > { - 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 = "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 = "SubjectTemplateDeleted", abi = "SubjectTemplateDeleted(uint256)")] - pub struct SubjectTemplateDeletedFilter { - #[ethevent(indexed)] - pub template_id: ::ethers::core::types::U256, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent( - name = "SubjectTemplateInserted", - abi = "SubjectTemplateInserted(uint256)" - )] - pub struct SubjectTemplateInsertedFilter { - #[ethevent(indexed)] - pub template_id: ::ethers::core::types::U256, - } - #[derive( - Clone, - ::ethers::contract::EthEvent, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethevent(name = "SubjectTemplateUpdated", abi = "SubjectTemplateUpdated(uint256)")] - pub struct SubjectTemplateUpdatedFilter { - #[ethevent(indexed)] - pub template_id: ::ethers::core::types::U256, - } - #[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 { - DkimregistryUpdatedFilter(DkimregistryUpdatedFilter), - EmailAuthedFilter(EmailAuthedFilter), - InitializedFilter(InitializedFilter), - OwnershipTransferredFilter(OwnershipTransferredFilter), - SubjectTemplateDeletedFilter(SubjectTemplateDeletedFilter), - SubjectTemplateInsertedFilter(SubjectTemplateInsertedFilter), - SubjectTemplateUpdatedFilter(SubjectTemplateUpdatedFilter), - 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) = 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) = 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)); - } - 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::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::SubjectTemplateDeletedFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::SubjectTemplateInsertedFilter(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::SubjectTemplateUpdatedFilter(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: 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: 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) - } - } - 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 `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 `deleteSubjectTemplate` function with signature `deleteSubjectTemplate(uint256)` and selector `0x519e50d1` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "deleteSubjectTemplate", abi = "deleteSubjectTemplate(uint256)")] - pub struct DeleteSubjectTemplateCall { - 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 `getSubjectTemplate` function with signature `getSubjectTemplate(uint256)` and selector `0x1e05a028` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall(name = "getSubjectTemplate", abi = "getSubjectTemplate(uint256)")] - pub struct GetSubjectTemplateCall { - 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 `insertSubjectTemplate` function with signature `insertSubjectTemplate(uint256,string[])` and selector `0xc4b84df4` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - #[ethcall( - name = "insertSubjectTemplate", - abi = "insertSubjectTemplate(uint256,string[])" - )] - pub struct InsertSubjectTemplateCall { - pub template_id: ::ethers::core::types::U256, - pub subject_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 `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, - ::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 `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 `updateSubjectTemplate` function with signature `updateSubjectTemplate(uint256,string[])` and selector `0x4dbb82f1` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - Default, - Debug, - PartialEq, - 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>, - } - ///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), - Controller(ControllerCall), - DeleteSubjectTemplate(DeleteSubjectTemplateCall), - DkimRegistryAddr(DkimRegistryAddrCall), - GetSubjectTemplate(GetSubjectTemplateCall), - InitDKIMRegistry(InitDKIMRegistryCall), - InitVerifier(InitVerifierCall), - Initialize(InitializeCall), - InsertSubjectTemplate(InsertSubjectTemplateCall), - LastTimestamp(LastTimestampCall), - Owner(OwnerCall), - ProxiableUUID(ProxiableUUIDCall), - RenounceOwnership(RenounceOwnershipCall), - SetTimestampCheckEnabled(SetTimestampCheckEnabledCall), - SubjectTemplates(SubjectTemplatesCall), - TimestampCheckEnabled(TimestampCheckEnabledCall), - TransferOwnership(TransferOwnershipCall), - UpdateDKIMRegistry(UpdateDKIMRegistryCall), - UpdateSubjectTemplate(UpdateSubjectTemplateCall), - 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::Controller(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::DeleteSubjectTemplate(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::DkimRegistryAddr(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::GetSubjectTemplate(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::InsertSubjectTemplate(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::SubjectTemplates(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::UpdateDKIMRegistry(decoded)); - } - if let Ok(decoded) = ::decode( - data, - ) { - return Ok(Self::UpdateSubjectTemplate(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::Controller(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::DeleteSubjectTemplate(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::DkimRegistryAddr(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::GetSubjectTemplate(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::InsertSubjectTemplate(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::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) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::UpdateSubjectTemplate(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::Controller(element) => ::core::fmt::Display::fmt(element, f), - Self::DeleteSubjectTemplate(element) => { - ::core::fmt::Display::fmt(element, f) - } - Self::DkimRegistryAddr(element) => ::core::fmt::Display::fmt(element, f), - Self::GetSubjectTemplate(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) => { - ::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::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) => { - ::core::fmt::Display::fmt(element, f) - } - Self::UpdateSubjectTemplate(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: 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: DkimRegistryAddrCall) -> Self { - 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: 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: InsertSubjectTemplateCall) -> Self { - Self::InsertSubjectTemplate(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: SubjectTemplatesCall) -> Self { - Self::SubjectTemplates(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: 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) - } - } - 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 `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 `getSubjectTemplate` function with signature `getSubjectTemplate(uint256)` and selector `0x1e05a028` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - 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` - #[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 `subjectTemplates` function with signature `subjectTemplates(uint256,uint256)` and selector `0x4bd07760` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - Default, - Debug, - PartialEq, - Eq, - Hash - )] - pub struct SubjectTemplatesReturn(pub ::std::string::String); - ///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 subject_params: ::std::vec::Vec<::ethers::core::types::Bytes>, - pub skiped_subject_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_subject: ::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/mod.rs b/packages/relayer/src/abis/mod.rs deleted file mode 100644 index c9a06ccb..00000000 --- a/packages/relayer/src/abis/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -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 email_auth::*; diff --git a/packages/relayer/src/chain.rs b/packages/relayer/src/chain.rs index 21f2ff70..e95224a6 100644 --- a/packages/relayer/src/chain.rs +++ b/packages/relayer/src/chain.rs @@ -1,33 +1,73 @@ +use std::collections::HashMap; + use crate::*; -use abis::email_account_recovery::EmailAuthMsg; -use ethers::middleware::Middleware; +use abi::{encode, Abi, ParamType, Token, Tokenize}; +use abis::{ECDSAOwnedDKIMRegistry, EmailAuth, EmailAuthMsg, EmailProof}; +use anyhow::anyhow; +use config::ChainConfig; use ethers::prelude::*; use ethers::signers::Signer; -use relayer_utils::converters::u64_to_u8_array_32; -use relayer_utils::LOG; +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; 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 { pub client: Arc, } impl ChainClient { - pub async fn setup() -> Result { - let wallet: LocalWallet = PRIVATE_KEY.get().unwrap().parse()?; - let provider = Provider::::try_from(CHAIN_RPC_PROVIDER.get().unwrap())?; + /// 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_ID.get().unwrap()), + 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, @@ -40,24 +80,41 @@ 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) } + /// 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() @@ -65,240 +122,149 @@ impl ChainClient { Ok(is_valid) } - pub async fn get_dkim_from_wallet( + pub async fn call( &self, - controller_eth_addr: &String, - ) -> Result, anyhow::Error> { - let controller_eth_addr: H160 = controller_eth_addr.parse()?; - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - let dkim = contract.dkim().call().await?; - Ok(ECDSAOwnedDKIMRegistry::new(dkim, self.client.clone())) - } + request: RequestModel, + email_auth_msg: EmailAuthMsg, + relayer_state: RelayerState, + ) -> 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(), + }; - pub async fn get_dkim_from_email_auth( - &self, - email_auth_addr: &String, - ) -> Result, anyhow::Error> { - let email_auth_address: H160 = email_auth_addr.parse()?; - let contract = EmailAuth::new(email_auth_address, self.client.clone()); - let dkim = contract.dkim_registry_addr().call().await?; + let contract = Contract::new( + request.email_tx_auth.contract_address, + abi, + self.client.clone(), + ); - Ok(ECDSAOwnedDKIMRegistry::new(dkim, self.client.clone())) - } + let function = request.email_tx_auth.function_abi; + let remaining_args = request.email_tx_auth.remaining_args; - pub async fn get_email_auth_addr_from_wallet( - &self, - controller_eth_addr: &String, - wallet_addr: &String, - account_salt: &String, - ) -> Result { - let controller_eth_addr: H160 = controller_eth_addr.parse()?; - let wallet_address: H160 = wallet_addr.parse()?; - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - let account_salt_bytes = hex::decode(account_salt.trim_start_matches("0x")) - .map_err(|e| anyhow!("Failed to decode account_salt: {}", e))?; - 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) - } + // Initialize your tokens vector + let mut tokens = Vec::new(); - pub async fn is_wallet_deployed(&self, wallet_addr_str: &String) -> bool { - let wallet_addr: H160 = wallet_addr_str.parse().unwrap(); - match self.client.get_code(wallet_addr, None).await { - Ok(code) => !code.is_empty(), - Err(e) => { - // Log the error or handle it as needed - error!(LOG, "Error querying contract code: {:?}", e); - false - } + // 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 { + let token = Token::from(arg); + tokens.push(token); } - } - pub async fn get_acceptance_subject_templates( - &self, - controller_eth_addr: &String, - template_idx: u64, - ) -> Result, anyhow::Error> { - 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() - .call() - .await - .map_err(|e| anyhow::Error::from(e))?; - Ok(templates[template_idx as usize].clone()) - } + let custom_tokens = CustomTokenVec { tokens }; - pub async fn get_recovery_subject_templates( - &self, - controller_eth_addr: &String, - template_idx: u64, - ) -> Result, anyhow::Error> { - 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() - .call() - .await - .map_err(|e| anyhow::Error::from(e))?; - Ok(templates[template_idx as usize].clone()) - } + // 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()); - pub async fn complete_recovery( - &self, - controller_eth_addr: &String, - account_eth_addr: &String, - complete_calldata: &String, - ) -> Result { - let controller_eth_addr: H160 = controller_eth_addr.parse()?; - 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), + // 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 ); - let tx = call.send().await?; - // If the transaction is successful, the function will return true and false otherwise. - let receipt = tx - .log() - .confirmations(CONFIRMATIONS) - .await? - .ok_or(anyhow!("No receipt"))?; - Ok(receipt - .status - .map(|status| status == U64::from(1)) - .unwrap_or(false)) - } - pub async fn handle_acceptance( - &self, - controller_eth_addr: &String, - email_auth_msg: EmailAuthMsg, - template_idx: u64, - ) -> 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?; - // If the transaction is successful, the function will return true and false otherwise. - let receipt = tx - .log() - .confirmations(CONFIRMATIONS) - .await? - .ok_or(anyhow!("No receipt"))?; - Ok(receipt - .status - .map(|status| status == U64::from(1)) - .unwrap_or(false)) - } + // 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, + } + ] + }); - pub async fn handle_recovery( - &self, - controller_eth_addr: &String, - email_auth_msg: EmailAuthMsg, - template_idx: u64, - ) -> 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?; - // If the transaction is successful, the function will return true and false otherwise. - let receipt = tx - .log() - .confirmations(CONFIRMATIONS) - .await? - .ok_or(anyhow!("No receipt"))?; - Ok(receipt - .status - .map(|status| status == U64::from(1)) - .unwrap_or(false)) - } + info!(LOG, "Alchemy request: {:?}", json_body); - 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?) - } + // 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?; - pub async fn get_storage_at( - &self, - wallet_addr: &String, - slot: u64, - ) -> Result { - let wallet_address: H160 = wallet_addr.parse()?; - Ok(self - .client - .get_storage_at(wallet_address, u64_to_u8_array_32(slot).into(), None) - .await?) - } + // Handle the response + if response.status().is_success() { + let response_text = response.text().await?; + info!(LOG, "Alchemy response: {:?}", response_text); - pub async fn get_recovered_account_from_acceptance_subject( - &self, - controller_eth_addr: &String, - subject_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 - .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::>(); - let recovered_account = contract - .extract_recovered_account_from_acceptance_subject( - subject_params_bytes, - template_idx.into(), - ) - .call() - .await?; - Ok(recovered_account) + // 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(()) } +} - pub async fn get_recovered_account_from_recovery_subject( - &self, - controller_eth_addr: &String, - subject_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 - .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::>(); - let recovered_account = contract - .extract_recovered_account_from_recovery_subject( - subject_params_bytes, - template_idx.into(), - ) - .call() - .await?; - Ok(recovered_account) +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()), + ] } +} - pub async fn get_is_activated( - &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()?; - let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone()); - let is_activated = contract.is_activated(account_eth_addr).call().await?; - Ok(is_activated) +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/config.rs b/packages/relayer/src/config.rs index bed30ff4..c7943d74 100644 --- a/packages/relayer/src/config.rs +++ b/packages/relayer/src/config.rs @@ -1,51 +1,67 @@ -use crate::*; - -use std::{env, path::PathBuf}; - -use dotenv::dotenv; - -#[derive(Clone)] -pub struct RelayerConfig { - pub smtp_server: String, - pub relayer_email_addr: String, - pub db_path: String, - pub web_server_address: String, - pub circuits_dir_path: PathBuf, - pub prover_address: String, - pub chain_rpc_provider: String, - pub chain_rpc_explorer: String, - pub chain_id: u32, - pub private_key: String, - pub email_account_recovery_version_id: u8, +use anyhow::Error; +use serde::Deserialize; +use std::collections::HashMap; +use std::env; +use std::fs::File; +use std::io::Read; + +#[derive(Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct Config { + pub port: usize, + 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, + pub json_logger: bool, +} + +#[derive(Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct PathConfig { + pub pem: String, pub email_templates: String, } -impl RelayerConfig { - pub fn new() -> Self { - dotenv().ok(); - - 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(), - circuits_dir_path: env::var(CIRCUITS_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(), - } - } +#[derive(Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct IcpConfig { + pub canister_id: String, + pub ic_replica_url: String, +} + +#[derive(Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct ChainConfig { + pub private_key: String, + pub rpc_url: String, + pub explorer_url: String, + pub chain_id: u32, + pub alchemy_name: String, } -impl Default for RelayerConfig { - fn default() -> Self { - Self::new() +// 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))?; + + // 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))?; + + // 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/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/core.rs b/packages/relayer/src/core.rs deleted file mode 100644 index 00e1c195..00000000 --- a/packages/relayer/src/core.rs +++ /dev/null @@ -1,486 +0,0 @@ -#![allow(clippy::upper_case_acronyms)] -#![allow(clippy::identity_op)] - -use crate::abis::email_account_recovery::{EmailAuthMsg, EmailProof}; -use crate::*; - -use ethers::{ - abi::{encode, Token}, - utils::keccak256, -}; -use relayer_utils::{extract_substr_idxes, generate_email_auth_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!()); - 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 request_decomposed_def = - 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); - } - info!(LOG, "Request idxes: {:?}", request_idxes; "func" => function_name!()); - let request_id = &email[request_idxes[0].0..request_idxes[0].1]; - 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?; - 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(); - if request.guardian_email_addr != guardian_email_addr { - return Err(anyhow!( - "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(anyhow!( - "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?; - - if let Ok(invitation_code) = parsed_email.get_invitation_code() { - trace!(LOG, "Email with account code"; "func" => function_name!()); - - 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 { - let subject_template = CLIENT - .get_acceptance_subject_templates( - &request.controller_eth_addr, - request.template_idx, - ) - .await?; - - let result = extract_template_vals_and_skipped_subject_idx(&subject, subject_template); - let (subject_params, skipped_subject_prefix) = match result { - Ok((subject_params, skipped_subject_prefix)) => { - (subject_params, skipped_subject_prefix) - } - Err(e) => { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: format!("Invalid Subject, {}", e), - }); - } - }; - - let subject_params_encoded: Vec = subject_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_auth_input( - &email, - &AccountCode::from(hex2field(&format!("0x{}", &account_code_str))?), - ) - .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_subject = get_masked_subject(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, - 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: subject_params_encoded, - skiped_subject_prefix: skipped_subject_prefix.into(), - proof: email_proof.clone(), - }; - - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg; "func" => function_name!()); - info!(LOG, "Request: {:?}", request; "func" => function_name!()); - - 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(field2hex( - &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(field2hex( - &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 { - let subject_template = CLIENT - .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 (subject_params, skipped_subject_prefix) = match result { - Ok((subject_params, skipped_subject_prefix)) => { - (subject_params, skipped_subject_prefix) - } - Err(e) => { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: format!("Invalid Subject, {}", e), - }); - } - }; - - let subject_params_encoded: Vec = subject_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_auth_input( - &email, - &AccountCode::from(hex2field(&format!("0x{}", &account_code_str))?), - ) - .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_subject = get_masked_subject(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, - 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: subject_params_encoded, - skiped_subject_prefix: skipped_subject_prefix.into(), - proof: email_proof.clone(), - }; - - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg; "func" => function_name!()); - info!(LOG, "Request: {:?}", request; "func" => function_name!()); - - 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(field2hex( - &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(field2hex( - &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 { - if request.is_for_recovery { - let subject_template = CLIENT - .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 (subject_params, skipped_subject_prefix) = match result { - Ok((subject_params, skipped_subject_prefix)) => { - (subject_params, skipped_subject_prefix) - } - Err(e) => { - return Ok(EmailAuthEvent::Error { - email_addr: guardian_email_addr, - error: format!("Invalid Subject, {}", e), - }); - } - }; - - let subject_params_encoded: Vec = subject_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_auth_input( - &email, - &AccountCode::from(hex2field(&format!("0x{}", &account_code_str))?), - ) - .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_subject = get_masked_subject(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, - 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: subject_params_encoded, - skiped_subject_prefix: skipped_subject_prefix.into(), - proof: email_proof.clone(), - }; - - info!(LOG, "Email Auth Msg: {:?}", email_auth_msg; "func" => function_name!()); - info!(LOG, "Request: {:?}", request; "func" => function_name!()); - - 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(field2hex( - &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(field2hex( - &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".to_string(), - }); - } - } -} - -pub 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); - subject_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()) - .map_err(|e| anyhow!("Failed to convert bytes to string: {}", e))?; - - Ok(subject) -} diff --git a/packages/relayer/src/database.rs b/packages/relayer/src/database.rs deleted file mode 100644 index 51f13499..00000000 --- a/packages/relayer/src/database.rs +++ /dev/null @@ -1,331 +0,0 @@ -use crate::*; - -use relayer_utils::LOG; -use sqlx::{postgres::PgPool, Row}; - -#[derive(Debug, Clone)] -pub struct Credentials { - pub account_code: String, - pub account_eth_addr: String, - pub guardian_email_addr: String, - pub is_set: bool, -} - -#[derive(Debug, Clone)] -pub struct Request { - pub request_id: u32, - pub account_eth_addr: String, - pub controller_eth_addr: String, - pub guardian_email_addr: String, - pub is_for_recovery: bool, - pub template_idx: u64, - pub is_processed: bool, - pub is_success: Option, - pub email_nullifier: Option, - pub account_salt: Option, -} - -pub struct Database { - db: PgPool, -} - -impl Database { - 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) - } - - pub async fn setup_database(&self) -> Result<()> { - 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?; - - 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?; - 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) - .fetch_optional(&self.db) - .await?; - - match row { - Some(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; "func" => function_name!()); - Ok(Some(codes_row)) - } - None => Ok(None), - } - } - - pub(crate) async fn is_wallet_and_email_registered( - &self, - account_eth_addr: &str, - email_addr: &str, - ) -> bool { - 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 - .unwrap(); - - match row { - Some(_) => true, - None => false, - } - } - - pub(crate) async fn update_credentials_of_account_code(&self, row: &Credentials) -> Result<()> { - 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?; - Ok(()) - } - - pub(crate) async fn update_credentials_of_wallet_and_email( - &self, - row: &Credentials, - ) -> Result<()> { - 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?; - Ok(()) - } - - pub(crate) async fn update_credentials_of_inactive_guardian( - &self, - is_set: bool, - account_eth_addr: &str, - ) -> Result<()> { - 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?; - Ok(()) - } - - #[named] - pub(crate) async fn insert_credentials(&self, row: &Credentials) -> Result<()> { - 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 *", - ) - .bind(&row.account_code) - .bind(&row.account_eth_addr) - .bind(&row.guardian_email_addr) - .bind(row.is_set) - .fetch_one(&self.db) - .await?; - 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 { - 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(); - - match row { - Some(_) => true, - None => false, - } - } - - #[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) - .fetch_optional(&self.db) - .await?; - - match row { - Some(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; "func" => function_name!()); - Ok(Some(requests_row)) - } - None => Ok(None), - } - } - - pub(crate) async fn update_request(&self, row: &Request) -> Result<()> { - 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) - .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?; - Ok(()) - } - - pub(crate) async fn get_account_code_from_wallet_and_email( - &self, - account_eth_addr: &str, - email_addr: &str, - ) -> 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?; - - match row { - Some(row) => { - let account_code: String = row.get("account_code"); - Ok(Some(account_code)) - } - None => Ok(None), - } - } - - #[named] - pub(crate) async fn get_credentials_from_wallet_and_email( - &self, - account_eth_addr: &str, - email_addr: &str, - ) -> 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?; - - match row { - Some(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; "func" => function_name!()); - 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!()); - 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 *", - ) - .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?; - info!( - LOG, - "{} row inserted", - row.len(); "func" => function_name!() - ); - Ok(()) - } -} diff --git a/packages/relayer/src/dkim.rs b/packages/relayer/src/dkim.rs new file mode 100644 index 00000000..5cfe3a90 --- /dev/null +++ b/packages/relayer/src/dkim.rs @@ -0,0 +1,223 @@ +use std::env; + +use abis::ECDSAOwnedDKIMRegistry; +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, + dkim: 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 = ECDSAOwnedDKIMRegistry::new(dkim, chain_client.client.clone()); + + 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( + &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?; + 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 new file mode 100644 index 00000000..b88b9b02 --- /dev/null +++ b/packages/relayer/src/handler.rs @@ -0,0 +1,263 @@ +use std::sync::Arc; + +use axum::{ + 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::{error, info, trace}; +use uuid::Uuid; + +use crate::{ + command::parse_command_template, + mail::{handle_email, handle_email_event, EmailEvent}, + model::{create_request, get_request, update_request, RequestStatus}, + schema::EmailTxAuthSchema, + RelayerState, +}; + +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) +} + +pub async fn submit_handler( + State(relayer_state): State>, + Json(body): Json, +) -> Result)> { + info!(LOG, "Payload: {:?}", body); + + 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 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( + 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"(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 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, + 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"})), + ) + }) + })?; + + info!(LOG, "Request ID received: {}", 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()})), + ) + })?; + 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 email + match handle_email(body, 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", + "message": "email received", + }); + + 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!({ + "message": "request status", + "request": request, + }); + + Ok((StatusCode::OK, Json(response))) +} diff --git a/packages/relayer/src/lib.rs b/packages/relayer/src/lib.rs deleted file mode 100644 index 8245264d..00000000 --- a/packages/relayer/src/lib.rs +++ /dev/null @@ -1,111 +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 utils; - -pub use abis::*; -pub use chain::*; -pub use config::*; -pub use core::*; -pub use database::*; -pub use modules::*; -use relayer_utils::LOG; -pub use utils::*; - -use ::function_name::named; -use tokio::sync::Mutex; - -use anyhow::{anyhow, bail, 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 CIRCUITS_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(); - -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(|| { - tokio::runtime::Runtime::new() - .unwrap() - .block_on(ChainClient::setup()) - }) - .unwrap(); - Arc::new(client) - }; - 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!()); - - 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(); - 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(); - - let api_server_task = tokio::task::spawn(async move { - loop { - match run_server().await { - Ok(_) => { - info!(LOG, "run_server exited normally"; "func" => function_name!()); - break; // Exit loop if run_server exits normally - } - Err(err) => { - error!(LOG, "Error api server: {}", err; "func" => function_name!()); - // Optionally, add a delay before restarting - tokio::time::sleep(Duration::from_secs(5)).await; - } - } - } - }); - - let _ = tokio::join!(api_server_task); - - Ok(()) -} diff --git a/packages/relayer/src/mail.rs b/packages/relayer/src/mail.rs new file mode 100644 index 00000000..c787cb21 --- /dev/null +++ b/packages/relayer/src/mail.rs @@ -0,0 +1,429 @@ +use std::path::PathBuf; + +use anyhow::Result; +use ethers::types::U256; +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::{ + 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, +}; + +/// 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 { + email_addr: String, + request_id: Uuid, + original_subject: String, + original_message_id: Option, + }, + 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!({ + "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::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( + "completion_template.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, + } => { + 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, + } => { + 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_template.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(()) +} + +/// 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) +} + +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.dkim_contract_address, + chain_client.clone(), + relayer_state.clone(), + ) + .await?; + + let email_auth_msg = get_email_auth_msg(&email, request.clone(), relayer_state.clone()).await?; + + chain_client + .call(request.clone(), email_auth_msg, relayer_state) + .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 a76835b6..e931a39d 100644 --- a/packages/relayer/src/main.rs +++ b/packages/relayer/src/main.rs @@ -1,9 +1,66 @@ +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 statics; + +use std::sync::Arc; + use anyhow::Result; -use relayer::*; +use axum::http::{ + header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE}, + Method, +}; +use relayer_utils::LOG; +use reqwest::Client; +use route::create_router; +use slog::info; +use sqlx::{postgres::PgPoolOptions, Pool, Postgres}; +use tower_http::cors::CorsLayer; + +use config::Config; + +#[derive(Debug, Clone)] +pub struct RelayerState { + http_client: Client, + 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 { + http_client: Client::new(), + 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/model.rs b/packages/relayer/src/model.rs new file mode 100644 index 00000000..b2f27f64 --- /dev/null +++ b/packages/relayer/src/model.rs @@ -0,0 +1,144 @@ +use std::fmt::Display; + +use anyhow::{Error, Ok, Result}; +use chrono::{DateTime, NaiveDateTime, Utc}; +use serde::{Deserialize, Serialize}; +use sqlx::types::Json; +use sqlx::{FromRow, PgPool}; +use uuid::Uuid; + +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, + #[serde(rename = "emailTxAuth")] + pub email_tx_auth: EmailTxAuthSchema, +} + +#[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, +} + +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) +} + +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 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, + 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/modules/dkim.rs b/packages/relayer/src/modules/dkim.rs deleted file mode 100644 index 1be188ef..00000000 --- a/packages/relayer/src/modules/dkim.rs +++ /dev/null @@ -1,143 +0,0 @@ -use anyhow::anyhow; -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; -use ic_agent::agent::*; -use ic_agent::identity::*; -use ic_utils::canister::*; - -use serde::Deserialize; - -#[derive(Debug, Clone)] -pub struct DkimOracleClient<'a> { - pub canister: Canister<'a>, -} - -#[derive(Default, CandidType, Deserialize, Debug, Clone)] -pub struct SignedDkimPublicKey { - pub selector: String, - pub domain: String, - pub signature: String, - pub public_key: String, - pub public_key_hash: String, -} - -impl<'a> DkimOracleClient<'a> { - 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)?; - let agent = AgentBuilder::default() - .with_identity(identity) - .with_transport(transport) - .build()?; - Ok(agent) - } - - pub fn new(canister_id: &str, agent: &'a Agent) -> anyhow::Result { - let canister = CanisterBuilder::new() - .with_canister_id(canister_id) - .with_agent(&agent) - .build()?; - Ok(Self { canister }) - } - - pub async fn request_signature( - &self, - selector: &str, - domain: &str, - ) -> anyhow::Result { - let request = self - .canister - .update("sign_dkim_public_key") - .with_args((selector, domain)) - .build::<(Result,)>(); - let response = request - .call_and_wait_one::>() - .await? - .map_err(|e| anyhow!(format!("Error from canister: {:?}", e)))?; - - Ok(response) - } -} - -#[named] -pub async fn check_and_update_dkim( - email: &str, - parsed_email: &ParsedEmail, - controller_eth_addr: &str, - wallet_addr: &str, - account_salt: &str, -) -> Result<()> { - 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!()); - let domain = parsed_email.get_email_domain()?; - info!(LOG, "domain {:?}", domain; "func" => function_name!()); - if CLIENT.get_bytecode(&wallet_addr.to_string()).await? == Bytes::from(vec![0u8; 20]) { - info!(LOG, "wallet not deployed"; "func" => function_name!()); - 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(), - ) - .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![]) { - dkim = CLIENT.get_dkim_from_email_auth(&email_auth_addr).await?; - } - info!(LOG, "dkim {:?}", dkim; "func" => function_name!()); - 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"; "func" => function_name!()); - return Ok(()); - } - let selector_decomposed_def = - serde_json::from_str(include_str!("../regex_json/selector_def.json")).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 - }; - info!(LOG, "selector {}", selector; "func" => function_name!()); - 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!()); - 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!()); - let signature = Bytes::from_hex(&oracle_result.signature[2..])?; - info!(LOG, "signature {:?}", signature; "func" => function_name!()); - 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; "func" => function_name!()); - Ok(()) -} diff --git a/packages/relayer/src/modules/mail.rs b/packages/relayer/src/modules/mail.rs deleted file mode 100644 index d9c114d5..00000000 --- a/packages/relayer/src/modules/mail.rs +++ /dev/null @@ -1,407 +0,0 @@ -use crate::*; -use handlebars::Handlebars; -use serde::{Deserialize, Serialize}; -use serde_json::Value; -use tokio::fs::read_to_string; - -#[derive(Debug, Clone)] -pub enum EmailAuthEvent { - AcceptanceRequest { - account_eth_addr: String, - guardian_email_addr: String, - request_id: u32, - subject: String, - account_code: String, - }, - GuardianAlreadyExists { - account_eth_addr: String, - guardian_email_addr: String, - }, - Error { - email_addr: String, - error: String, - }, - RecoveryRequest { - account_eth_addr: String, - guardian_email_addr: String, - request_id: u32, - subject: String, - }, - AcceptanceSuccess { - account_eth_addr: String, - guardian_email_addr: String, - request_id: u32, - }, - RecoverySuccess { - account_eth_addr: String, - guardian_email_addr: String, - request_id: u32, - }, - GuardianNotSet { - account_eth_addr: String, - guardian_email_addr: String, - }, - GuardianNotRegistered { - account_eth_addr: String, - guardian_email_addr: String, - subject: String, - request_id: u32, - }, - Ack { - email_addr: String, - subject: String, - original_message_id: Option, - }, - NoOp, -} - -#[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>, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct EmailAttachment { - pub inline_id: String, - pub content_type: String, - pub contents: Vec, -} - -pub async fn handle_email_event(event: EmailAuthEvent) -> Result<()> { - match event { - EmailAuthEvent::AcceptanceRequest { - account_eth_addr, - guardian_email_addr, - request_id, - subject, - account_code, - } => { - let subject = format!("{} Code {}", subject, account_code); - - let body_plain = format!( - "You have received an guardian 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 render_data = serde_json::json!({ - "userEmailAddr": guardian_email_addr, - "walletAddress": account_eth_addr, - "requestId": request_id, - }); - let body_html = render_html("acceptance_request.html", render_data).await?; - - let email = EmailMessage { - to: guardian_email_addr, - subject, - reference: None, - reply_to: None, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email).await?; - } - EmailAuthEvent::Error { email_addr, error } => { - let subject = "Error"; - let body_plain = format!( - "An error occurred while processing your request. \ - Error: {}", - error - ); - - let render_data = serde_json::json!({ - "error": error, - "userEmailAddr": email_addr, - }); - let body_html = render_html("error.html", render_data).await?; - - let email = EmailMessage { - to: email_addr, - subject: subject.to_string(), - reference: None, - reply_to: None, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email).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 - ); - - 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?; - - 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).await?; - } - EmailAuthEvent::RecoveryRequest { - account_eth_addr, - guardian_email_addr, - request_id, - subject, - } => { - 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 render_data = serde_json::json!({ - "userEmailAddr": guardian_email_addr, - "walletAddress": account_eth_addr, - "requestId": request_id, - }); - let body_html = render_html("recovery_request.html", render_data).await?; - - let email = EmailMessage { - to: guardian_email_addr, - subject, - reference: None, - reply_to: None, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email).await?; - } - EmailAuthEvent::AcceptanceSuccess { - account_eth_addr, - guardian_email_addr, - request_id, - } => { - let subject = "Acceptance Success"; - 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 - ); - - 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?; - - 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).await?; - } - EmailAuthEvent::RecoverySuccess { - account_eth_addr, - guardian_email_addr, - request_id, - } => { - let subject = "Recovery Success"; - let body_plain = format!( - "Your recovery request for the wallet address {} is successful. \ - Your request ID is #{}.", - account_eth_addr, request_id - ); - - 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?; - - 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).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); - - 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?; - - 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).await?; - } - EmailAuthEvent::GuardianNotRegistered { - account_eth_addr, - guardian_email_addr, - subject, - request_id, - } => { - let subject = format!("{} Code ", subject); - - 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. \ - Your request ID is #{}. \ - If you did not initiate this request, please contact us immediately.", - account_eth_addr, request_id - ); - - let render_data = serde_json::json!({ - "userEmailAddr": guardian_email_addr, - "walletAddress": account_eth_addr, - "requestId": request_id, - }); - let body_html = render_html("credential_not_present.html", render_data).await?; - - let email = EmailMessage { - to: guardian_email_addr, - subject, - reference: None, - reply_to: None, - body_plain, - body_html, - body_attachments: None, - }; - - send_email(email).await?; - } - EmailAuthEvent::Ack { - email_addr, - subject, - original_message_id, - } => { - let body_plain = format!( - "Hi {}!\nYour email with the subject {} is received.", - email_addr, subject - ); - let render_data = serde_json::json!({"userEmailAddr": email_addr, "request": subject}); - let body_html = render_html("acknowledgement.html", render_data).await?; - let subject = format!("Re: {}", subject); - 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).await?; - } - EmailAuthEvent::NoOp => {} - } - - Ok(()) -} - -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 reg = Handlebars::new(); - - Ok(reg.render_template(&email_template, &render_data)?) -} - -pub fn parse_error(error: String) -> Result> { - let mut error = error; - if error.contains("Contract call reverted with 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| b >= 0x20 && b <= 0x7E) - .collect(); - error = String::from_utf8(revert_bytes).unwrap().trim().to_string(); - } - - 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)), - } -} - -pub async fn send_email(email: EmailMessage) -> Result<()> { - 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| anyhow!("Failed to send email: {}", e))?; - - if !response.status().is_success() { - return Err(anyhow!( - "Failed to send email: {}", - response.text().await.unwrap_or_default() - )); - } - - Ok(()) -} diff --git a/packages/relayer/src/modules/mod.rs b/packages/relayer/src/modules/mod.rs deleted file mode 100644 index 5ace1b92..00000000 --- a/packages/relayer/src/modules/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -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 7dffbb07..00000000 --- a/packages/relayer/src/modules/web_server/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod rest_api; -pub mod server; - -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 deleted file mode 100644 index f9668bc7..00000000 --- a/packages/relayer/src/modules/web_server/rest_api.rs +++ /dev/null @@ -1,677 +0,0 @@ -use crate::*; -use anyhow::Result; -use axum::{body::Body, response::Response}; -use hex::decode; -use rand::Rng; -use relayer_utils::LOG; -use reqwest::StatusCode; -use serde::{Deserialize, Serialize}; -use slog::log; -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 subject: String, -} - -#[derive(Serialize, Deserialize)] -pub struct AcceptanceResponse { - pub request_id: u32, - pub subject_params: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct RecoveryRequest { - pub controller_eth_addr: String, - pub guardian_email_addr: String, - pub template_idx: u64, - pub subject: String, -} - -#[derive(Serialize, Deserialize)] -pub struct RecoveryResponse { - pub request_id: u32, - pub subject_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(payload: RequestStatusRequest) -> Result { - let row = DB.get_request(payload.request_id).await?; - let status = if let Some(ref row) = row { - if row.is_processed { - RequestStatus::Processed - } else { - RequestStatus::Pending - } - } else { - RequestStatus::NotExist - }; - Ok(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), - }) -} - -pub async fn handle_acceptance_request(payload: AcceptanceRequest) -> Response { - let subject_template = CLIENT - .get_acceptance_subject_templates(&payload.controller_eth_addr, payload.template_idx) - .await - .unwrap(); - - let subject_params = extract_template_vals(&payload.subject, subject_template); - - if subject_params.is_err() { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Invalid subject")) - .unwrap(); - } - - let subject_params = subject_params.unwrap(); - - let account_eth_addr = CLIENT - .get_recovered_account_from_acceptance_subject( - &payload.controller_eth_addr, - subject_params.clone(), - payload.template_idx, - ) - .await - .unwrap(); - - 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(); - } - - // Check if hash of bytecode of proxy contract is equal or not - let bytecode = CLIENT.get_bytecode(&account_eth_addr).await.unwrap(); - 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(); - // } - - if let Ok(Some(creds)) = DB.get_credentials(&payload.account_code).await { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Account code already used")) - .unwrap(); - } - - 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); - - 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 - .expect("Failed to insert request"); - - handle_email_event(EmailAuthEvent::GuardianAlreadyExists { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - }) - .await - .expect("Failed to send GuardianAlreadyExists event"); - } else if DB - .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. - 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 - .expect("Failed to insert credentials"); - - 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 - .expect("Failed to insert request"); - - handle_email_event(EmailAuthEvent::AcceptanceRequest { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - request_id, - subject: payload.subject.clone(), - account_code: payload.account_code.clone(), - }) - .await - .expect("Failed to send Acceptance event"); - } else { - 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 - .expect("Failed to insert credentials"); - - 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 - .expect("Failed to insert request"); - - handle_email_event(EmailAuthEvent::AcceptanceRequest { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - request_id, - subject: payload.subject.clone(), - account_code: payload.account_code.clone(), - }) - .await - .expect("Failed to send Acceptance event"); - } - - Response::builder() - .status(StatusCode::OK) - .body(Body::from( - serde_json::to_string(&AcceptanceResponse { - request_id, - subject_params, - }) - .unwrap(), - )) - .unwrap() -} - -pub async fn handle_recovery_request(payload: RecoveryRequest) -> Response { - let subject_template = CLIENT - .get_recovery_subject_templates(&payload.controller_eth_addr, payload.template_idx) - .await - .unwrap(); - - let subject_params = extract_template_vals(&payload.subject, subject_template); - - if subject_params.is_err() { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Invalid subject")) - .unwrap(); - } - - let subject_params = subject_params.unwrap(); - - let account_eth_addr = CLIENT - .get_recovered_account_from_recovery_subject( - &payload.controller_eth_addr, - subject_params.clone(), - payload.template_idx, - ) - .await - .unwrap(); - - 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(); - } - - // Check if hash of bytecode of proxy contract is equal or not - let bytecode = CLIENT.get_bytecode(&account_eth_addr).await.unwrap(); - 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(); - // } - - 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 = DB - .get_credentials_from_wallet_and_email(&account_eth_addr, &payload.guardian_email_addr) - .await; - - let account_salt = if let Ok(Some(account_details)) = account { - calculate_account_salt(&payload.guardian_email_addr, &account_details.account_code) - } else { - return Response::builder() - .status(StatusCode::BAD_REQUEST) - .body(Body::from("Account details not found")) - .unwrap(); - }; - - if !DB - .is_wallet_and_email_registered(&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 - .expect("Failed to insert request"); - - handle_email_event(EmailAuthEvent::GuardianNotRegistered { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - subject: payload.subject.clone(), - request_id, - }) - .await - .expect("Failed to send GuardianNotRegistered event"); - - return Response::builder() - .status(StatusCode::OK) - .body(Body::from( - serde_json::to_string(&RecoveryResponse { - request_id, - subject_params, - }) - .unwrap(), - )) - .unwrap(); - } - - 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 - .expect("Failed to insert request"); - - handle_email_event(EmailAuthEvent::RecoveryRequest { - account_eth_addr, - guardian_email_addr: payload.guardian_email_addr.clone(), - request_id, - subject: payload.subject.clone(), - }) - .await - .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 - .expect("Failed to insert request"); - - 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"); - } - - Response::builder() - .status(StatusCode::OK) - .body(Body::from( - serde_json::to_string(&RecoveryResponse { - request_id, - subject_params, - }) - .unwrap(), - )) - .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(); - } - - match CLIENT - .complete_recovery( - &payload.controller_eth_addr, - &payload.account_eth_addr, - &payload.complete_calldata, - ) - .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(), - 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::(); - Response::builder() - .status(StatusCode::INTERNAL_SERVER_ERROR) - .body(Body::from(error_message)) - .unwrap() - } - } -} - -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 inactive_guardian(payload: InactiveGuardianRequest) -> Response { - 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() - } - } - trace!(LOG, "Inactive guardian"; "is_activated" => is_activated.unwrap()); - let account_eth_addr: Address = payload.account_eth_addr.parse().unwrap(); - 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"); - - Response::builder() - .status(StatusCode::OK) - .body(Body::from("Guardian inactivated")) - .unwrap() -} - -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) -} - -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(); - tokio::spawn(async move { - match handle_email_event(EmailAuthEvent::Ack { - email_addr: from_addr.clone(), - subject: parsed_email.get_subject_all().unwrap_or_default(), - original_message_id: parsed_email.get_message_id().ok(), - }) - .await - { - Ok(_) => { - trace!(LOG, "Ack email event sent"); - } - Err(e) => { - error!(LOG, "Error handling email event: {:?}", e); - } - } - 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); - match handle_email_event(EmailAuthEvent::Error { - email_addr: from_addr, - error: e.to_string(), - }) - .await - { - Ok(_) => {} - Err(e) => { - error!(LOG, "Error handling email event: {:?}", e); - } - } - } - } - }); - Ok(()) -} 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 da6c5a59..00000000 --- a/packages/relayer/src/modules/web_server/server.rs +++ /dev/null @@ -1,195 +0,0 @@ -use crate::*; -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(); - - let mut app = Router::new() - .route( - "/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/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()) - } - } - }), - ) - .route( - "/api/receiveEmail", - axum::routing::post::<_, _, (), _>(move |payload: String| async move { - 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() - } - } - }), - ); - - app = app.layer( - CorsLayer::new() - .allow_methods(AllowMethods::any()) - .allow_headers(AllowHeaders::any()) - .allow_origin(Any), - ); - - trace!(LOG, "Listening API at {}", addr; "func" => function_name!()); - 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/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/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..0f66dfd3 --- /dev/null +++ b/packages/relayer/src/route.rs @@ -0,0 +1,20 @@ +use std::sync::Arc; + +use axum::{ + routing::{get, post}, + Router, +}; + +use crate::{ + handler::{get_status_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)) + .with_state(relayer_state) +} diff --git a/packages/relayer/src/schema.rs b/packages/relayer/src/schema.rs new file mode 100644 index 00000000..baf25333 --- /dev/null +++ b/packages/relayer/src/schema.rs @@ -0,0 +1,26 @@ +use std::collections::HashMap; + +use ethers::{ + abi::{Abi, Function, Token}, + types::{Address, U256}, +}; +use relayer_utils::AccountCode; +use serde::{Deserialize, Serialize}; + +#[derive(Deserialize, Serialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct EmailTxAuthSchema { + pub contract_address: Address, + pub dkim_contract_address: Address, + pub account_code: AccountCode, + pub code_exists_in_email: bool, + pub function_abi: Function, + pub command_template: String, + pub command_params: Vec, + pub template_id: U256, + pub remaining_args: Vec, + pub email_address: String, + pub subject: String, + pub body: String, + pub chain: String, +} diff --git a/packages/relayer/src/statics.rs b/packages/relayer/src/statics.rs new file mode 100644 index 00000000..ba542e6f --- /dev/null +++ b/packages/relayer/src/statics.rs @@ -0,0 +1,8 @@ +use std::sync::Arc; +use tokio::sync::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/mod.rs b/packages/relayer/src/utils/mod.rs deleted file mode 100644 index 361a451a..00000000 --- a/packages/relayer/src/utils/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -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/strings.rs b/packages/relayer/src/utils/strings.rs deleted file mode 100644 index b92bbc97..00000000 --- a/packages/relayer/src/utils/strings.rs +++ /dev/null @@ -1,36 +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 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"; -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"; - -// 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_SUBJECT_FORMAT: &str = "Wrong subject 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+"; - -// 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"; diff --git a/packages/relayer/src/utils/subject_templates.rs b/packages/relayer/src/utils/subject_templates.rs deleted file mode 100644 index 621bb408..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_and_skipped_subject_idx( - input: &str, - templates: Vec, -) -> Result<(Vec, usize), 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..]; - match extract_template_vals(current_input, templates) { - Ok(vals) => Ok((vals, skipped_bytes)), - Err(e) => Err(e), - } - } 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(); - 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 - } - - 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 - || string_match.end() != input_decomposed[input_idx].len() - { - return Err(anyhow!("String must be the whole word")); - } - let string = string_match.as_str().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 uint = U256::from_dec_str(uint_match.as_str()).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 int = I256::from_dec_str(int_match.as_str()).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 decimals = decimals_match.as_str().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 - || address_match.end() != input_decomposed[input_idx].len() - { - 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 - } - - input_idx += 1; // Move to the next piece of input - } - - 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 f2dffca8..00000000 --- a/packages/relayer/src/utils/utils.rs +++ /dev/null @@ -1,99 +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}; - -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, - 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]))) - } -} - -#[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!()); - 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; "func" => function_name!()); - 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") { - hex2field(&account_code).unwrap() - } else { - hex2field(&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) -} diff --git a/rust-toolchain b/rust-toolchain index 837f16a7..97e98527 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.73.0 \ No newline at end of file +1.80.1 diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 00000000..b8116019 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,4 @@ +max_width = 100 +use_small_heuristics = "Default" +reorder_imports = true +reorder_modules = true diff --git a/yarn.lock b/yarn.lock index 5f8ca2fd..00cc7d2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1818,19 +1818,10 @@ "@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.3.2" - resolved "https://codeload.github.com/zkemail/relayer-utils/tar.gz/aefb00fdcfbfde7fced50e5a0b086e5cc2ff64cd" +"@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" @@ -2250,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.30001660" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355" + integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg== cargo-cp-artifact@^0.1: version "0.1.9" @@ -2380,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" @@ -2529,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" @@ -2620,9 +2611,9 @@ ejs@^3.1.10, ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.5.4: - version "1.5.14" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.14.tgz#8de5fd941f4deede999f90503c4b5923fbe1962b" - integrity sha512-bEfPECb3fJ15eaDnu9LEJ2vPGD6W1vt7vZleSVyFhYuMIKm3vz/g9lt7IvEzgdwj58RjbPKUF2rXTCN/UW47tQ== + 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" @@ -4013,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"