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..3d784ba0 100644
--- a/.github/workflows/unit-tests.yml
+++ b/.github/workflows/unit-tests.yml
@@ -1,4 +1,4 @@
-name: unit-tests
+name: Unit Tests
on: [push]
@@ -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..11170544 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,9 @@ book
# Vs code settings
.vscode
+# Editor settings
+.idea
+
# For zksync
zkout
.cache
diff --git a/Cargo.lock b/Cargo.lock
index 558dfa58..a23aac9a 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,61 @@ 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"
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 +3808,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 +3869,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 +3888,8 @@ dependencies = [
"wasm-bindgen-futures",
"wasm-streams",
"web-sys",
- "webpki-roots",
- "winreg",
+ "webpki-roots 0.26.6",
+ "windows-registry",
]
[[package]]
@@ -4226,6 +4001,12 @@ version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+[[package]]
+name = "rustc-hash"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
+
[[package]]
name = "rustc-hex"
version = "2.1.0"
@@ -4234,18 +4015,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 +4043,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 +4070,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 +4095,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 +4154,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 +4162,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 +4219,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 +4232,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 +4278,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 +4317,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 +4348,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 +4356,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 +4436,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 +4488,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 +4536,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 +4591,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 +4601,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 +4614,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 +4646,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 +4687,7 @@ dependencies = [
"sqlx-mysql",
"sqlx-postgres",
"sqlx-sqlite",
- "syn 1.0.109",
+ "syn 2.0.79",
"tempfile",
"tokio",
"url",
@@ -4905,15 +4695,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 +4732,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 +4768,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 +4797,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 +4824,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 +4832,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 +4848,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 +4867,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
- "syn 2.0.71",
+ "syn 2.0.79",
]
[[package]]
@@ -5125,7 +4892,7 @@ dependencies = [
"fs2",
"hex",
"once_cell",
- "reqwest",
+ "reqwest 0.11.27",
"semver 1.0.23",
"serde",
"serde_json",
@@ -5148,9 +4915,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 +4941,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 +4958,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 +4982,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 +5006,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 +5028,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 +5098,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 +5115,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 +5158,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 +5192,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 +5214,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 +5264,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 +5278,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 +5308,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.79",
]
[[package]]
@@ -5603,7 +5366,7 @@ dependencies = [
"ipconfig",
"lazy_static",
"lru-cache",
- "parking_lot 0.12.3",
+ "parking_lot",
"resolv-conf",
"smallvec",
"thiserror",
@@ -5631,7 +5394,7 @@ dependencies = [
"httparse",
"log",
"rand",
- "rustls",
+ "rustls 0.21.12",
"sha1",
"thiserror",
"url",
@@ -5652,9 +5415,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 +5439,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 +5482,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 +5513,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 +5536,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 +5549,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 +5586,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 +5599,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 +5626,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 +5636,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 +5670,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 +5694,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 +5751,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 +5774,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 +5822,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 +5861,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 +5873,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 +5885,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 +5903,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 +5915,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 +5927,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 +5939,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 +5953,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 +6010,7 @@ version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
+ "byteorder",
"zerocopy-derive",
]
@@ -6324,7 +6022,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.79",
]
[[package]]
@@ -6355,11 +6053,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 +6088,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/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..a9fa0964 100644
--- a/packages/relayer/Cargo.toml
+++ b/packages/relayer/Cargo.toml
@@ -1,60 +1,32 @@
[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" }
+relayer-utils = { path = "../../../relayer-utils" }
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..ce5da39f
--- /dev/null
+++ b/packages/relayer/config.example.json
@@ -0,0 +1,23 @@
+{
+ "port": 8000,
+ "databaseUrl": "postgres://test@localhost:5432/relayer",
+ "smtpUrl": "http://localhost:3000",
+ "proverUrl": "https://zkemail--email-auth-prover-v1-4-0-flask-app.modal.run",
+ "paths": {
+ "pem": "./.ic.pem",
+ "emailTemplates": "./email_templates"
+ },
+ "icp": {
+ "canisterId": "q7eci-dyaaa-aaaak-qdbia-cai",
+ "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
+ }
+ },
+ "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
+
+
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hi, {{userEmailAddr}}!
-
-
- You have received an guardian request from the wallet address {{walletAddress}} .
- Reply "Confirm " to this email to accept the request.
-
- Your request ID is #{{requestId}}.
-
- If you did not initiate this request, please contact us immediately.
-
- Note: Do not delete this email after replying. The code in the title can be used to recover your account in absence of an available relayer
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hi, {{userEmailAddr}}!
-
-
- Your guardian request for the wallet address {{walletAddress}} .
-
- Your request ID is #{{requestId}} is now complete.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hi {{userEmailAddr}}!
-
-
- We have received your following request: {{request}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hi, {{userEmailAddr}}!
-
-
- You have received an guardian request from the wallet address {{walletAddress}} .
- Add the guardian's account code in the subject and reply to this email.
-
- Your request ID is #{{requestId}}.
-
- If you did not initiate this request, please contact us immediately.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hi, {{userEmailAddr}}!
-
-
- An error occurred while processing your request.
-
- Error: {{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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hi, {{userEmailAddr}}!
-
-
- The guardian email address {{userEmailAddr}} is already associated with the wallet address {{walletAddress}} .
-
- If you did not initiate this request, please contact us immediately.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hi, {{userEmailAddr}}!
-
-
- Guardian not set for wallet address {{walletAddress}} .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hi, {{userEmailAddr}}!
-
-
- You have received a recovery request from the wallet address {{walletAddress}} .
- Reply "Confirm " to this email to accept the request.
-
- Your request ID is #{{requestId}}.
-
- If you did not initiate this request, please contact us immediately.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hi, {{userEmailAddr}}!
-
-
- Your recovery request for the wallet address {{walletAddress}} is successful.
-
- Your request ID is #{{requestId}} is now complete.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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