diff --git a/.github/workflows/contracts.yml b/.github/workflows/contracts.yml index 6c5728dd..f05c06f8 100644 --- a/.github/workflows/contracts.yml +++ b/.github/workflows/contracts.yml @@ -14,13 +14,10 @@ jobs: - uses: actions/checkout@v3 - name: Install packages uses: actions/setup-node@v3 - with: - #Remove the restriction as soon as this is resolved: https://github.com/NomicFoundation/hardhat/issues/3877 - node-version: "18.15" - run: | cd contracts npm ci - name: Run Tests run: | cd contracts - npx hardhat node & npx hardhat coverage + npx hardhat test diff --git a/backend/Cargo.lock b/backend/Cargo.lock index a3cdd3ca..08359b39 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -12,17 +12,6 @@ dependencies = [ "regex", ] -[[package]] -name = "addchain" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" -dependencies = [ - "num-bigint 0.3.3", - "num-integer", - "num-traits", -] - [[package]] name = "addr2line" version = "0.20.0" @@ -75,12 +64,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" -[[package]] -name = "anyhow" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" - [[package]] name = "ark-std" version = "0.3.0" @@ -89,7 +72,7 @@ checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "colored", "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -98,12 +81,6 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "arrayvec" version = "0.7.4" @@ -119,6 +96,47 @@ dependencies = [ "term", ] +[[package]] +name = "askama" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" +dependencies = [ + "askama_derive", + "askama_escape", +] + +[[package]] +name = "askama_derive" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" +dependencies = [ + "askama_parser", + "basic-toml", + "mime", + "mime_guess", + "proc-macro2", + "quote", + "serde", + "syn 2.0.25", +] + +[[package]] +name = "askama_escape" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" + +[[package]] +name = "askama_parser" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" +dependencies = [ + "nom", +] + [[package]] name = "async-trait" version = "0.1.71" @@ -199,39 +217,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] -name = "bech32" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" - -[[package]] -name = "bellperson" -version = "0.25.0" +name = "basic-toml" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93eaee4b4753554139ae52ecf0e8b8c128cbc561b32e1bfaa32f70cba8518c1f" +checksum = "7bfc506e7a2370ec239e1d072507b2a80c833083699d3c6fa176fbb4de8448c6" dependencies = [ - "bincode", - "blake2s_simd 1.0.1", - "blstrs", - "byteorder", - "crossbeam-channel", - "digest 0.10.7", - "ec-gpu", - "ec-gpu-gen", - "ff", - "group", - "log", - "memmap2", - "pairing", - "rand 0.8.5", - "rand_core 0.6.4", - "rayon", - "rustversion", "serde", - "sha2 0.10.7", - "thiserror", ] +[[package]] +name = "bech32" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" + [[package]] name = "bincode" version = "1.3.3" @@ -297,30 +296,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" dependencies = [ "arrayref", - "arrayvec 0.7.4", - "constant_time_eq 0.2.6", -] - -[[package]] -name = "blake2s_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq 0.1.5", -] - -[[package]] -name = "blake2s_simd" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" -dependencies = [ - "arrayref", - "arrayvec 0.7.4", - "constant_time_eq 0.2.6", + "arrayvec", + "constant_time_eq", ] [[package]] @@ -348,34 +325,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" -[[package]] -name = "blst" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "blstrs" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" -dependencies = [ - "blst", - "byte-slice-cast", - "ff", - "group", - "pairing", - "rand_core 0.6.4", - "serde", - "subtle", -] - [[package]] name = "bs58" version = "0.4.0" @@ -507,7 +456,7 @@ dependencies = [ "hmac", "once_cell", "pbkdf2 0.12.2", - "rand 0.8.5", + "rand", "sha2 0.10.7", "thiserror", ] @@ -549,12 +498,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" -[[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.2.6" @@ -592,25 +535,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" version = "0.8.3" @@ -657,7 +581,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array", - "rand_core 0.6.4", + "rand_core", "subtle", "zeroize", ] @@ -779,47 +703,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" -[[package]] -name = "ec-gpu" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd63582de2b59ea1aa48d7c1941b5d87618d95484397521b3acdfa0e1e9f5e45" - -[[package]] -name = "ec-gpu-gen" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "892df2aa20abec5b816e15d5d6383892ca142077708efa3067dd3ac44b75c664" -dependencies = [ - "bitvec 1.0.1", - "crossbeam-channel", - "ec-gpu", - "execute", - "ff", - "group", - "hex", - "log", - "num_cpus", - "once_cell", - "rayon", - "sha2 0.10.7", - "thiserror", - "yastl", -] - -[[package]] -name = "ecc" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2wrong?tag=v2023_04_20#f72db265aa3cebe297c9b9816e940d0e1d400886" -dependencies = [ - "integer", - "num-bigint 0.4.3", - "num-integer", - "num-traits", - "rand 0.8.5", - "subtle", -] - [[package]] name = "ecdsa" version = "0.16.7" @@ -853,7 +736,7 @@ dependencies = [ "generic-array", "group", "pkcs8", - "rand_core 0.6.4", + "rand_core", "sec1", "subtle", "zeroize", @@ -888,7 +771,7 @@ dependencies = [ "hex", "k256", "log", - "rand 0.8.5", + "rand", "rlp", "serde", "sha3 0.10.8", @@ -945,7 +828,7 @@ dependencies = [ "hex", "hmac", "pbkdf2 0.11.0", - "rand 0.8.5", + "rand", "scrypt", "serde", "serde_json", @@ -1094,7 +977,7 @@ version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6da5fa198af0d3be20c19192df2bd9590b92ce09a8421e793bec8851270f1b05" dependencies = [ - "arrayvec 0.7.4", + "arrayvec", "bytes", "cargo_metadata", "chrono", @@ -1106,7 +989,7 @@ dependencies = [ "num_enum", "once_cell", "open-fastrlp", - "rand 0.8.5", + "rand", "rlp", "serde", "serde_json", @@ -1209,7 +1092,7 @@ dependencies = [ "eth-keystore", "ethers-core", "hex", - "rand 0.8.5", + "rand", "sha2 0.10.7", "thiserror", "tracing", @@ -1245,43 +1128,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "execute" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d9a9ea4c04632c16bc5c71a2fcc63d308481f7fc67eb1a1ce6315c44a426ae" -dependencies = [ - "execute-command-macro", - "execute-command-tokens", - "generic-array", -] - -[[package]] -name = "execute-command-macro" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5fbc65a0cf735106743f4c38c9a3671c1e734b5c2c20d21a3c93c696daa3157" -dependencies = [ - "execute-command-macro-impl", -] - -[[package]] -name = "execute-command-macro-impl" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a9a55d1dab3b07854648d48e366f684aefe2ac78ae28cec3bf65e3cd53d9a3" -dependencies = [ - "execute-command-tokens", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "execute-command-tokens" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba569491c70ec8471e34aa7e9c0b9e82bb5d2464c0398442d17d3c4af814e5a" - [[package]] name = "eyre" version = "0.6.8" @@ -1308,54 +1154,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "bitvec 1.0.1", - "byteorder", - "ff_derive", - "rand_core 0.6.4", + "rand_core", "subtle", ] -[[package]] -name = "ff_ce" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3a682c12d0cc98a32ab7540401a5ea1ed21d11571eea11d5829cd721f85ff0" -dependencies = [ - "byteorder", - "ff_derive_ce", - "hex", - "rand 0.4.6", -] - -[[package]] -name = "ff_derive" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f54704be45ed286151c5e11531316eaef5b8f5af7d597b806fdb8af108d84a" -dependencies = [ - "addchain", - "cfg-if", - "num-bigint 0.3.3", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ff_derive_ce" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c052fa6d4c2f12305ec364bfb8ef884836f3f61ea015b202372ff996d1ac4b" -dependencies = [ - "num-bigint 0.2.6", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "fixed-hash" version = "0.8.0" @@ -1363,7 +1165,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand", "rustc-hex", "static_assertions", ] @@ -1374,25 +1176,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" -[[package]] -name = "flate2" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "flume" -version = "0.10.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" -dependencies = [ - "spin 0.9.8", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1423,12 +1206,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - [[package]] name = "funty" version = "2.0.0" @@ -1608,9 +1385,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand 0.8.5", - "rand_core 0.6.4", - "rand_xorshift", + "rand_core", "subtle", ] @@ -1633,91 +1408,57 @@ dependencies = [ "tracing", ] -[[package]] -name = "halo2_gadgets" -version = "0.2.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2?tag=v2023_04_20#be955686f86eb618f55d2320c0e042485b313d22" -dependencies = [ - "arrayvec 0.7.4", - "bitvec 1.0.1", - "ff", - "group", - "halo2_proofs", - "halo2curves 0.3.2", - "lazy_static", - "rand 0.8.5", - "subtle", - "uint", -] - [[package]] name = "halo2_proofs" version = "0.2.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2?tag=v2023_04_20#be955686f86eb618f55d2320c0e042485b313d22" +source = "git+https://github.com/summa-dev/halo2#8386d6e64fc33baccf626869123185890b8284dc" dependencies = [ "blake2b_simd", "ff", "group", - "halo2curves 0.3.2", + "halo2curves", + "maybe-rayon", "rand_chacha", - "rand_core 0.6.4", - "rayon", + "rand_core", "sha3 0.9.1", "tracing", ] [[package]] -name = "halo2curves" +name = "halo2_solidity_verifier" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b1142bd1059aacde1b477e0c80c142910f1ceae67fc619311d6a17428007ab" +source = "git+https://github.com/summa-dev/halo2-solidity-verifier#d33972567f83f3218257b286b541ad97ba32928c" dependencies = [ + "askama", "blake2b_simd", - "ff", - "group", - "lazy_static", - "num-bigint 0.4.3", - "num-traits", - "pasta_curves", - "paste", - "rand 0.8.5", - "rand_core 0.6.4", - "serde", - "serde_arrays", - "static_assertions", - "subtle", + "halo2_proofs", + "hex", + "itertools 0.11.0", + "revm", + "ruint", + "sha3 0.10.8", ] [[package]] name = "halo2curves" -version = "0.3.2" -source = "git+https://github.com/privacy-scaling-explorations/halo2curves?tag=0.3.2#9f5c50810bbefe779ee5cf1d852b2fe85dc35d5e" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b1142bd1059aacde1b477e0c80c142910f1ceae67fc619311d6a17428007ab" dependencies = [ + "blake2b_simd", "ff", "group", "lazy_static", - "num-bigint 0.4.3", + "num-bigint", "num-traits", "pasta_curves", "paste", - "rand 0.8.5", - "rand_core 0.6.4", - "serde", + "rand", + "rand_core", "static_assertions", "subtle", ] -[[package]] -name = "halo2wrong" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2wrong?tag=v2023_04_20#f72db265aa3cebe297c9b9816e940d0e1d400886" -dependencies = [ - "halo2_proofs", - "num-bigint 0.4.3", - "num-integer", - "num-traits", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -1765,15 +1506,6 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" [[package]] name = "hex-literal" @@ -1962,19 +1694,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "integer" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2wrong?tag=v2023_04_20#f72db265aa3cebe297c9b9816e940d0e1d400886" -dependencies = [ - "maingate", - "num-bigint 0.4.3", - "num-integer", - "num-traits", - "rand 0.8.5", - "subtle", -] - [[package]] name = "io-lifetimes" version = "1.0.11" @@ -2003,24 +1722,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "itertools" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.10.5" @@ -2111,7 +1812,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] @@ -2149,16 +1850,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] -name = "maingate" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2wrong?tag=v2023_04_20#f72db265aa3cebe297c9b9816e940d0e1d400886" +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ - "halo2wrong", - "num-bigint 0.4.3", - "num-integer", - "num-traits", - "rand 0.8.5", - "subtle", + "cfg-if", + "rayon", ] [[package]] @@ -2177,28 +1875,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] -name = "memmap2" -version = "0.5.10" +name = "memoffset" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ - "libc", + "autocfg", ] [[package]] -name = "memoffset" -version = "0.9.0" +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" dependencies = [ - "autocfg", + "mime", + "unicase", ] [[package]] -name = "mime" -version = "0.3.17" +name = "minimal-lexical" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" @@ -2238,25 +1943,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "neptune" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb9a64337e6d214e2a48db5714ef18cf1e5a7bbff9043838fdf6e57ce5659335" -dependencies = [ - "bellperson", - "blake2s_simd 0.5.11", - "blstrs", - "byteorder", - "ff", - "generic-array", - "itertools 0.8.2", - "log", - "pasta_curves", - "serde", - "trait-set", -] - [[package]] name = "new_debug_unreachable" version = "1.0.4" @@ -2264,59 +1950,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" [[package]] -name = "nova-scotia" -version = "0.5.0" -source = "git+https://github.com/nalinbhardwaj/Nova-Scotia#00085ece0e16c29a12f61866fa3588649620d7f7" -dependencies = [ - "anyhow", - "bellperson", - "byteorder", - "ff", - "hex-literal 0.3.4", - "itertools 0.9.0", - "js-sys", - "nova-snark", - "num-bigint 0.4.3", - "num-traits", - "pasta_curves", - "rayon", - "serde", - "serde_json", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-rayon", -] - -[[package]] -name = "nova-snark" -version = "0.23.0" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e12911ac9672ad436acfc992f09e26a5960513bbe81d1572005cadd8c1be8f4" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ - "bellperson", - "bincode", - "bitvec 1.0.1", - "byteorder", - "digest 0.10.7", - "ff", - "flate2", - "generic-array", - "getrandom", - "halo2curves 0.1.0", - "itertools 0.11.0", - "neptune", - "num-bigint 0.4.3", - "num-integer", - "num-traits", - "pasta-msm", - "pasta_curves", - "rand_chacha", - "rand_core 0.6.4", - "rayon", - "serde", - "sha3 0.10.8", - "subtle", - "thiserror", + "memchr", + "minimal-lexical", ] [[package]] @@ -2325,7 +1965,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" dependencies = [ - "num-bigint 0.4.3", + "num-bigint", "num-complex", "num-integer", "num-iter", @@ -2333,28 +1973,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-bigint" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-bigint" version = "0.4.3" @@ -2364,8 +1982,6 @@ dependencies = [ "autocfg", "num-integer", "num-traits", - "rand 0.8.5", - "serde", ] [[package]] @@ -2405,7 +2021,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", - "num-bigint 0.4.3", + "num-bigint", "num-integer", "num-traits", ] @@ -2477,7 +2093,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" dependencies = [ - "arrayvec 0.7.4", + "arrayvec", "auto_impl", "bytes", "ethereum-types", @@ -2540,22 +2156,13 @@ dependencies = [ "vcpkg", ] -[[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.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "756d439303e94fae44f288ba881ad29670c65b0c4b0e05674ca81061bb65f2c5" dependencies = [ - "arrayvec 0.7.4", + "arrayvec", "bitvec 1.0.1", "byte-slice-cast", "impl-trait-for-tuples", @@ -2598,19 +2205,6 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "pasta-msm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e85d75eba3e7e9ee3bd11342b669185e194dadda3557934bc1000d9b87159d3" -dependencies = [ - "cc", - "pasta_curves", - "semolina", - "sppark", - "which", -] - [[package]] name = "pasta_curves" version = "0.5.1" @@ -2620,10 +2214,8 @@ dependencies = [ "blake2b_simd", "ff", "group", - "hex", "lazy_static", - "rand 0.8.5", - "serde", + "rand", "static_assertions", "subtle", ] @@ -2702,7 +2294,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ "phf_shared 0.11.2", - "rand 0.8.5", + "rand", ] [[package]] @@ -2784,25 +2376,6 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" -[[package]] -name = "poseidon" -version = "0.2.0" -source = "git+https://github.com/privacy-scaling-explorations/poseidon?tag=v2023_04_20#807f8f555313f726ca03bdf941f798098f488ba4" -dependencies = [ - "halo2curves 0.3.2", - "subtle", -] - -[[package]] -name = "poseidon-rs" -version = "0.0.10" -source = "git+https://github.com/arnaucube/poseidon-rs#f4ba1f7c32905cd2ae5a71e7568564bb150a9862" -dependencies = [ - "ff_ce", - "rand 0.4.6", - "serde_json", -] - [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2903,19 +2476,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -dependencies = [ - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "rdrand", - "winapi", -] - [[package]] name = "rand" version = "0.8.5" @@ -2924,7 +2484,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -2934,24 +2494,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", + "rand_core", ] -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - [[package]] name = "rand_core" version = "0.6.4" @@ -2961,15 +2506,6 @@ 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 0.6.4", -] - [[package]] name = "rayon" version = "1.8.0" @@ -2990,15 +2526,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - [[package]] name = "redox_syscall" version = "0.2.16" @@ -3154,7 +2681,7 @@ dependencies = [ "fixed-hash", "hashbrown 0.13.2", "hex", - "hex-literal 0.4.1", + "hex-literal", "primitive-types", "rlp", "ruint", @@ -3406,16 +2933,6 @@ dependencies = [ "libc", ] -[[package]] -name = "semolina" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0111fd4fa831becb0606b9a2285ef3bee3c6a70d690209b8ae9514e9befe23" -dependencies = [ - "cc", - "glob", -] - [[package]] name = "semver" version = "1.0.17" @@ -3446,15 +2963,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde_arrays" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38636132857f68ec3d5f3eb121166d2af33cb55174c4d5ff645db6165cbef0fd" -dependencies = [ - "serde", -] - [[package]] name = "serde_derive" version = "1.0.171" @@ -3560,7 +3068,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ "digest 0.10.7", - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -3584,52 +3092,6 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" -[[package]] -name = "snark-verifier" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/snark-verifier#27f8b205d64dfe960ffc8bce1891da491dec54c9" -dependencies = [ - "ecc", - "halo2_proofs", - "halo2curves 0.3.2", - "hex", - "itertools 0.10.5", - "lazy_static", - "num-bigint 0.4.3", - "num-integer", - "num-traits", - "poseidon", - "rand 0.8.5", - "revm", - "serde", - "sha3 0.10.8", -] - -[[package]] -name = "snark-verifier-sdk" -version = "0.1.1" -source = "git+https://github.com/privacy-scaling-explorations/snark-verifier#27f8b205d64dfe960ffc8bce1891da491dec54c9" -dependencies = [ - "ark-std", - "bincode", - "ecc", - "ethereum-types", - "halo2_proofs", - "halo2curves 0.3.2", - "hex", - "itertools 0.10.5", - "lazy_static", - "num-bigint 0.4.3", - "num-integer", - "num-traits", - "poseidon", - "rand 0.8.5", - "rand_chacha", - "serde", - "serde_json", - "snark-verifier", -] - [[package]] name = "socket2" version = "0.4.9" @@ -3660,15 +3122,6 @@ 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.2" @@ -3679,22 +3132,6 @@ dependencies = [ "der", ] -[[package]] -name = "spmc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a8428da277a8e3a15271d79943e80ccc2ef254e78813a166a08d65e4c3ece5" - -[[package]] -name = "sppark" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba7a6d98937866ea8917015cd4a72d56d6e7feee8979dbccf83fc0c870053c46" -dependencies = [ - "cc", - "which", -] - [[package]] name = "static_assertions" version = "1.1.0" @@ -3745,7 +3182,7 @@ dependencies = [ "byteorder", "crunchy", "lazy_static", - "rand 0.8.5", + "rand", "rustc-hex", ] @@ -3765,41 +3202,36 @@ dependencies = [ "ethers", "futures", "halo2_proofs", - "num-bigint 0.4.3", + "halo2_solidity_verifier", + "num-bigint", "num-traits", + "rand", "reqwest", "serde", "serde_json", - "snark-verifier-sdk", "summa-solvency", "tokio", ] [[package]] name = "summa-solvency" -version = "0.1.0" +version = "0.2.0" dependencies = [ "ark-std", "csv", "ethers", - "ff_ce", - "halo2_gadgets", "halo2_proofs", + "halo2_solidity_verifier", "hex", "itertools 0.10.5", - "nova-scotia", - "nova-snark", - "num-bigint 0.4.3", + "num-bigint", "num-traits", "num_cpus", - "poseidon-rs", - "rand 0.8.5", + "rand", "rayon", "regex", "serde", "serde_json", - "snark-verifier", - "snark-verifier-sdk", ] [[package]] @@ -3875,15 +3307,6 @@ dependencies = [ "syn 2.0.25", ] -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - [[package]] name = "tiny-keccak" version = "2.0.2" @@ -4045,17 +3468,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "trait-set" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b79e2e9c9ab44c6d7c20d5976961b47e8f49ac199154daa514b77cd1ab536625" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "try-lock" version = "0.2.4" @@ -4080,6 +3492,15 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.13" @@ -4172,8 +3593,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", - "serde", - "serde_json", "wasm-bindgen-macro", ] @@ -4227,18 +3646,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-rayon" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df87c67450805c305d3ae44a3ac537b0253d029153c25afc3ecd2edc36ccafb1" -dependencies = [ - "js-sys", - "rayon", - "spmc", - "wasm-bindgen", -] - [[package]] name = "wasm-bindgen-shared" version = "0.2.87" @@ -4255,18 +3662,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.11", -] - [[package]] name = "winapi" version = "0.3.9" @@ -4416,32 +3811,8 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" -[[package]] -name = "yastl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca6c5a4d66c1a9ea261811cf4773c27343de7e5033e1b75ea3f297dc7db3c1a" -dependencies = [ - "flume", - "scopeguard", -] - [[package]] name = "zeroize" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 6afe132b..1f4fa877 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -6,13 +6,13 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -summa-solvency = { path = "../zk_prover" } -halo2_proofs = { git = "https://github.com/privacy-scaling-explorations/halo2", tag = "v2023_04_20"} +summa-solvency = { path = "../kzg_prover" } +halo2_proofs = { git = "https://github.com/summa-dev/halo2"} csv = "1.2.2" futures = "0.3.28" num-bigint = "0.4.3" serde = { version = "1.0.166", features = ["derive"] } -snark-verifier-sdk = { git = "https://github.com/privacy-scaling-explorations/snark-verifier", version = "0.1.1" } +halo2_solidity_verifier = { git = "https://github.com/summa-dev/halo2-solidity-verifier", version = "0.1.0", features = ["evm"] } ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc", "legacy"] } reqwest = { version = "0.11", features = ["json"] } serde_json = "1.0.64" @@ -20,6 +20,7 @@ tokio = { version = "1.7.1", features = ["full"] } base64 = "0.13" bincode = "1.3.3" num-traits = "0.2.14" +rand = "0.8.5" [build-dependencies] ethers = { version = "2.0.7", default-features = false, features = ["ethers-solc", "legacy"] } diff --git a/backend/examples/summa_solvency_flow.rs b/backend/examples/summa_solvency_flow.rs index 4076b6a0..1499ec01 100644 --- a/backend/examples/summa_solvency_flow.rs +++ b/backend/examples/summa_solvency_flow.rs @@ -2,20 +2,28 @@ use std::{error::Error, fs::File, io::BufReader, io::Write}; use ethers::types::U256; +use halo2_proofs::halo2curves::bn256::{Fr as Fp, G1Affine}; use serde_json::{from_reader, to_string_pretty}; use summa_backend::{ - apis::{ - address_ownership::AddressOwnership, - leaf_hash_from_inputs, - round::{MstInclusionProof, Round}, - }, + apis::{address_ownership::AddressOwnership, round::Round}, contracts::signer::{AddressInput, SummaSigner}, tests::initialize_test_env, }; -use summa_solvency::merkle_sum_tree::MerkleSumTree; +use summa_solvency::{ + circuits::{ + univariate_grand_sum::UnivariateGrandSum, + utils::{full_prover, generate_setup_artifacts}, + }, + cryptocurrency::Cryptocurrency, + entry::Entry, + utils::{big_uint_to_fp, parse_csv_to_entries}, +}; +const K: u32 = 17; const N_CURRENCIES: usize = 2; +const N_POINTS: usize = 3; +const N_USERS: usize = 16; const USER_INDEX: usize = 0; #[tokio::main] @@ -57,16 +65,35 @@ async fn main() -> Result<(), Box> { // 2. Submit Commitment // // Initialize the `Round` instance to submit the liability commitment. - let params_path = "ptau/hermez-raw-11"; + let params_path = "ptau/hermez-raw-17"; let entry_csv = "../csv/entry_16.csv"; - let mst = MerkleSumTree::new(entry_csv).unwrap(); + let mut entries: Vec> = vec![Entry::init_empty(); N_USERS]; + let mut cryptos = vec![Cryptocurrency::init_empty(); N_CURRENCIES]; + parse_csv_to_entries::<&str, N_CURRENCIES>(entry_csv, &mut entries, &mut cryptos).unwrap(); + + let univariate_grand_sum_circuit = + UnivariateGrandSum::::init(entries.to_vec()); + + let (params, pk, vk) = + generate_setup_artifacts(K, None, &univariate_grand_sum_circuit).unwrap(); + + // Create a proof + let instances = vec![Fp::one(); 1]; // This instance is necessary to verify proof on solidity verifier. + let (zk_snark_proof, advice_polys, _omega) = full_prover( + ¶ms, + &pk, + univariate_grand_sum_circuit.clone(), + &[instances.clone()], + ); // Using the `round` instance, the commitment is dispatched to the Summa contract with the `dispatch_commitment` method. let timestamp = 1u64; - let mut round = Round::<4, 2, 14>::new(&signer, Box::new(mst), params_path, timestamp).unwrap(); + let mut round = + Round::::new(&signer, advice_polys, params, vk, 1) + .unwrap(); - // Sends the commitment, which should ideally complete without errors. - round.dispatch_commitment().await?; + // // Sends the commitment, which should ideally complete without errors. + // round.dispatch_commitment().await?; println!("2. Commitment is submitted successfully!"); @@ -96,38 +123,25 @@ async fn main() -> Result<(), Box> { // Assume that the `proof` file has been downloaded from the CEX. let proof_file = File::open(format!("user_{}_proof.json", USER_INDEX))?; let reader = BufReader::new(proof_file); - let downloaded_inclusion_proof: MstInclusionProof = from_reader(reader)?; - - let public_inputs = downloaded_inclusion_proof.get_public_inputs(); + // let downloaded_inclusion_proof: KZGInclusionProof = from_reader(reader)?; - // Verify the `leaf_hash` from the proof file. - // It's assumed that both `user_name` and `balances` are provided by the CEX. - // The `balances` represent the user's balances on the CEX at `snapshot_time`. - let user_name = "dxGaEAii".to_string(); - let balances = vec!["11888".to_string(), "41163".to_string()]; + // TODO: fix after the contract is concrete + // // Get `mst_root` from contract. the `mst_root` is disptached by CEX with specific time `snapshot_time`. + // let commitment = summa_contract.commitments(snapshot_time).call().await?; - let leaf_hash = public_inputs[0]; - assert_eq!( - leaf_hash, - leaf_hash_from_inputs::(user_name.clone(), balances.clone()) - ); + // // Match the `mst_root` with the `root_hash` derived from the proof. + // assert_eq!(commitment, public_inputs[1]); - // Get `mst_root` from contract. the `mst_root` is disptached by CEX with specific time `snapshot_time`. - let commitment = summa_contract.commitments(snapshot_time).call().await?; + // // Validate the inclusion proof using the contract verifier. + // let proof = inclusion_proof.get_proof(); + // let verification_result = summa_contract + // .verify_inclusion_proof(proof.clone(), public_inputs.clone(), snapshot_time) + // .await?; - // Match the `mst_root` with the `root_hash` derived from the proof. - assert_eq!(commitment, public_inputs[1]); - - // Validate the inclusion proof using the contract verifier. - let proof = inclusion_proof.get_proof(); - let verification_result = summa_contract - .verify_inclusion_proof(proof.clone(), public_inputs.clone(), snapshot_time) - .await?; - - println!( - "4. Verifying the proof on contract veirifer for User #{}: {}", - USER_INDEX, verification_result - ); + // println!( + // "4. Verifying the proof on contract veirifer for User #{}: {}", + // USER_INDEX, verification_result + // ); // Wrapping up drop(anvil); diff --git a/backend/ptau/hermez-raw-17 b/backend/ptau/hermez-raw-17 new file mode 100644 index 00000000..8dc765eb Binary files /dev/null and b/backend/ptau/hermez-raw-17 differ diff --git a/backend/src/apis/mod.rs b/backend/src/apis/mod.rs index 8cdc087b..82fca001 100644 --- a/backend/src/apis/mod.rs +++ b/backend/src/apis/mod.rs @@ -1,28 +1,3 @@ pub mod address_ownership; pub mod csv_parser; pub mod round; - -use ethers::types::U256; -use num_bigint::BigUint; -use num_traits::Num; -use summa_solvency::merkle_sum_tree::Entry; - -pub fn leaf_hash_from_inputs( - username: String, - balances: Vec, -) -> U256 -where - [usize; N_CURRENCIES + 1]: Sized, -{ - // Convert balances to BigUint - let balances: Vec = balances - .iter() - .map(|balance| BigUint::from_str_radix(balance, 10).unwrap()) - .collect(); - - let entry: Entry = Entry::new(username, balances.try_into().unwrap()).unwrap(); - - // Convert Fp to U256 - let hash_str = format!("{:?}", entry.compute_leaf().hash); - U256::from_str_radix(&hash_str, 16).unwrap() -} diff --git a/backend/src/apis/round.rs b/backend/src/apis/round.rs index dc6e495d..c462128f 100644 --- a/backend/src/apis/round.rs +++ b/backend/src/apis/round.rs @@ -1,34 +1,29 @@ use ethers::types::{Bytes, U256}; use halo2_proofs::{ - halo2curves::bn256::{Bn256, G1Affine}, - plonk::{ProvingKey, VerifyingKey}, - poly::kzg::commitment::ParamsKZG, + arithmetic::{best_fft, Field}, + halo2curves::{ + bn256::{Bn256, G1Affine}, + group::Curve, + }, + plonk::{AdviceSingle, VerifyingKey}, + poly::{ + kzg::commitment::{KZGCommitmentScheme, ParamsKZG}, + Coeff, + }, }; use serde::{Deserialize, Serialize}; use std::error::Error; -use crate::contracts::{generated::summa_contract::summa::Cryptocurrency, signer::SummaSigner}; -use summa_solvency::{ - circuits::{ - merkle_sum_tree::MstInclusionCircuit, - utils::{gen_proof_solidity_calldata, generate_setup_artifacts}, - }, - merkle_sum_tree::Tree, -}; - -pub(crate) type SetupArtifacts = ( - ParamsKZG, - ProvingKey, - VerifyingKey, -); +use crate::contracts::signer::SummaSigner; +use summa_solvency::utils::amortized_kzg::{commit_kzg, create_naive_kzg_proof, verify_kzg_proof}; #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct MstInclusionProof { +pub struct KZGInclusionProof { public_inputs: Vec, proof_calldata: Bytes, } -impl MstInclusionProof { +impl KZGInclusionProof { pub fn get_public_inputs(&self) -> &Vec { &self.public_inputs } @@ -38,35 +33,49 @@ impl MstInclusionProof { } } -pub struct Snapshot { - pub mst: Box>, - trusted_setup: SetupArtifacts, -} - -pub struct Round<'a, const LEVELS: usize, const N_CURRENCIES: usize, const N_BYTES: usize> { +/// The `Round` struct represents a single operational cycle within the Summa Solvency protocol. +/// +/// # Type Parameters +/// +/// * `N_CURRENCIES`: The number of currencies for which solvency is verified in this round. +/// * `N_POINTS`: The number of points in the `UnivariateGrandSum` circuit, which is `N_CURRENCIES + 1`. +/// * `N_USERS`: The number of users involved in this round of the protocol. +/// +/// These parameters are used for initializing the `UnivariateGrandSum` circuit within the `Snapshot` struct. +/// +/// # Fields +/// +/// * `timestamp`: A Unix timestamp marking the initiation of this round. It serves as a temporal reference point +/// for the operations carried out in this phase of the protocol. +/// * `snapshot`: A `Snapshot` struct capturing the round's state, including user identities and balances. +/// * `signer`: A reference to a `SummaSigner`, the entity responsible for signing transactions with the Summa contract in this round. +/// +pub struct Round<'a, const N_CURRENCIES: usize, const N_POINTS: usize, const N_USERS: usize> { timestamp: u64, - snapshot: Snapshot, + snapshot: Snapshot, signer: &'a SummaSigner, } -impl - Round<'_, LEVELS, N_CURRENCIES, N_BYTES> +impl + Round<'_, N_CURRENCIES, N_POINTS, N_USERS> where [usize; N_CURRENCIES + 1]: Sized, - [usize; N_CURRENCIES + 2]: Sized, { pub fn new<'a>( signer: &'a SummaSigner, - mst: Box>, - params_path: &str, + advice_polys: AdviceSingle, + params: ParamsKZG, + verifying_key: VerifyingKey, timestamp: u64, - ) -> Result, Box> - where - [(); N_CURRENCIES + 2]: Sized, - { + ) -> Result, Box> { Ok(Round { timestamp, - snapshot: Snapshot::::new(mst, params_path).unwrap(), + snapshot: Snapshot::::new( + advice_polys, + params, + verifying_key, + ) + .unwrap(), signer: &signer, }) } @@ -75,47 +84,19 @@ where self.timestamp } + // TODO: What will be the commit on the V2? pub async fn dispatch_commitment(&mut self) -> Result<(), Box> { - let root_str = format!("{:?}", self.snapshot.mst.root().hash); - let mst_root = U256::from_str_radix(&root_str, 16).unwrap(); - - let mut root_sums = Vec::::new(); - - for balance in self.snapshot.mst.root().balances.iter() { - let fp_str = format!("{:?}", balance); - root_sums.push(U256::from_str_radix(&fp_str, 16).unwrap()); - } - - self.signer - .submit_commitment( - mst_root, - root_sums, - self.snapshot - .mst - .cryptocurrencies() - .iter() - .map(|cryptocurrency| Cryptocurrency { - name: cryptocurrency.name.clone(), - chain: cryptocurrency.chain.clone(), - }) - .collect::>() - .as_slice() - .try_into() - .unwrap(), - U256::from(self.get_timestamp()), - ) - .await?; - Ok(()) } pub fn get_proof_of_inclusion( &self, user_index: usize, - ) -> Result + ) -> Result where - [(); N_CURRENCIES + 2]: Sized, + [(); N_CURRENCIES + 1]: Sized, { + // Iterate unblinded advice polynomials evaluate balances array Ok(self .snapshot .generate_proof_of_inclusion(user_index) @@ -123,52 +104,87 @@ where } } -impl - Snapshot +/// The `Snapshot` struct represents the state of database that contains users balance on holds by Custodians at a specific moment. +/// +/// # Fields +/// +/// * `advice_polys`: Composed of the unblinded advice polynomial, `advice_poly`, and the polynomials of blind factors, `advice_blind`. +/// * `params`: The parameters for the KZG commitment scheme. +/// * `verifying_key`: The verifying key for getting domains, which is used for generating inclusion proofs. +/// +pub struct Snapshot { + advice_polys: AdviceSingle, + params: ParamsKZG, + verifying_key: VerifyingKey, +} + +impl + Snapshot where [usize; N_CURRENCIES + 1]: Sized, - [usize; N_CURRENCIES + 2]: Sized, { pub fn new( - mst: Box>, - params_path: &str, - ) -> Result, Box> { - let mst_inclusion_circuit = MstInclusionCircuit::::init_empty(); - - // get k from ptau file name - let parts: Vec<&str> = params_path.split("-").collect(); - let last_part = parts.last().unwrap(); - let k = last_part.parse::().unwrap(); - - let mst_inclusion_setup_artifacts: SetupArtifacts = - generate_setup_artifacts(k, Some(params_path), mst_inclusion_circuit).unwrap(); - + advice_polys: AdviceSingle, + params: ParamsKZG, + verifying_key: VerifyingKey, + ) -> Result, Box> { Ok(Snapshot { - mst, - trusted_setup: mst_inclusion_setup_artifacts, + advice_polys, + params, + verifying_key, }) } pub fn generate_proof_of_inclusion( &self, user_index: usize, - ) -> Result + ) -> Result where - [(); N_CURRENCIES + 2]: Sized, + [(); N_CURRENCIES + 1]: Sized, // TODO: check is this necessary to compile? { - let merkle_proof = self.mst.generate_proof(user_index).unwrap(); - let circuit = MstInclusionCircuit::::init(merkle_proof); - - // Currently, default manner of generating a inclusion proof for solidity-verifier. - let calldata = gen_proof_solidity_calldata( - &self.trusted_setup.0, - &self.trusted_setup.1, - circuit.clone(), - ); - - Ok(MstInclusionProof { - proof_calldata: calldata.0, - public_inputs: calldata.1, + let domain = self.verifying_key.get_domain(); + let omega: halo2_proofs::halo2curves::grumpkin::Fq = domain.get_omega(); + + let column_range = 0..N_CURRENCIES + 1; + let mut opening_proofs = Vec::new(); + let challenge = omega.pow_vartime([user_index as u64]); + + for column_index in column_range { + let f_poly = self.advice_polys.advice_polys.get(column_index).unwrap(); + let kzg_commitment = commit_kzg(&self.params, f_poly); + + // Do iDFT for getting value of polynomial + let mut vec_f_poly = f_poly.to_vec(); + best_fft(&mut vec_f_poly, omega, f_poly.len().trailing_zeros()); + let z = vec_f_poly[user_index]; + + let kzg_proof = create_naive_kzg_proof::>( + &self.params, + domain, + f_poly, + challenge, + z, + ); + + assert!( + verify_kzg_proof(&self.params, kzg_commitment, kzg_proof, &challenge, &z), + "KZG proof verification failed for user {}", + user_index + ); + + // Convert to affine point and serialize to bytes + let kzg_proof_affine = kzg_proof.to_affine(); + let mut kzg_proof_affine_x = kzg_proof_affine.x.to_bytes(); + let mut kzg_proof_affine_y = kzg_proof_affine.y.to_bytes(); + kzg_proof_affine_x.reverse(); + kzg_proof_affine_y.reverse(); + + opening_proofs.push([kzg_proof_affine_x, kzg_proof_affine_y].concat()); + } + + Ok(KZGInclusionProof { + proof_calldata: Bytes::from(opening_proofs.concat()), + public_inputs: Vec::::new(), }) } } diff --git a/backend/src/contracts/abi/SnarkVerifier.json b/backend/src/contracts/abi/SnarkVerifier.json new file mode 100644 index 00000000..44cb506e --- /dev/null +++ b/backend/src/contracts/abi/SnarkVerifier.json @@ -0,0 +1 @@ +{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/SnarkVerifier.sol","abi":[{"inputs":[{"internalType":"address","name":"vk","type":"address"},{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"instances","type":"uint256[]"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612188806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063af83a18d14610030575b600080fd5b61004361003e366004612095565b610057565b604051901515815260200160405180910390f35b6000610263565b60008060008435602086013588821086169450888110851694508860038a8b858609850908898283099289526020890191909152149290921696604094850196509390940193505050565b60016020536021600090812092830682529190915260200190565b6000838351602085015b602087038110156100f0578781518309808452602093840193909250016100ce565b8781518309915060208352602080840152602060408401528160608401526002880360808401528760a084015260208360c08560055afa851693508251915085602081016020850394505b828110156101635789855185098a84518609908452601f19958601959094509092019161013b565b8981518509945089825185099490915292909252509095945050505050565b81604052826060526000604060006080600060065afa9091169392505050565b816040526000604060006060600060075afa90911692915050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b8160005282602052610b4051604052610b6051606052610b8051608052610ba05160a0528360c0528460e052610bc05161010052610be05161012052610c005161014052610c205161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600161056060006109a08b3c6064356115001481169050610a6051611584358114821691506109a05160005260206115a48260200281015b8082101561030057813580845286119490941693602092830192909101906102dd565b5060849250610f0090506103445b8084101561032d576103228784868861005e565b94509450945061030e565b5060009182208581068252909152602090810161040083015b808410156103655761035a8784868861005e565b945094509450610346565b5060009182208581068252909152602090810161038285826100a9565b905061038083015b808410156103a95761039e8784868861005e565b94509450945061038a565b5060009182208581068252909152602090810160c083015b808410156103e0576103d58784868861005e565b9450945094506103c1565b5060009182208581068252909152602090810161098083015b8084101561041c57833580845286119490941693602093840193909201916103f9565b5060009182208581068252909152602090810161043985826100a9565b90506104478683858761005e565b600090812088810690945292909252935091506020905061046a8582848661005e565b9250925092505050610a80511561053757610ac051610ae0516020610aa051026115a4016020830260028102600382028335838501358386013583870135896020028801895b818a10156104ee5760208a0199508935811b86019550888a0135811b85019450878a0135811b84019350868a0135811b830192508a810190506104b0565b50508c60038e8f8788098709088d848509148b169a508c60038e8f8586098509088d828309148b169a508361100052826110205281611040528061106052505050505050505050505b8061054157600080fd5b6109c0519250610f80518060005b858110156105655784828309915060010161054f565b50610a005194506110806006610a6051016020028101610a6051610587576020015b610a40515b818310156105ad57868188038608835286888209905060208301925061058c565b508560018703840893508381526105cb8660208301611080886100c4565b94506110809150856109e05185099350610a40515b8183101561060357868782855109860983528688820990506020830192506105e0565b506110a05196506110c0935061114091505b8184101561062f5785845188089650602084019350610615565b600091506115a4610a605160200281015b80821015610664578788833588510985089350602082019150602086019550610640565b505051611080805161114051949091526110a0919091526110c0526110e0959095526111008190526111209490945250610f60516000937f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a291908480610e4435830986038208955050610fc435848082810381848009086110c051099050848186848909089550508384610e84358603610ea435086111005109848186848909089550508384610ee4358603610f0435086111005109848186848909089550508384610f44358603610f6435086111005109848186848909089550508384610fa4358603610fc43508611100510984818684890908955050610f4051610f2051610e6435610e44358788858a8b610d04358809610cc4350808830991508788858a8b610d24358809610b843508088309915087610f805184096000528788858a600051610cc4350808820990508786600051096000528788858a600051610b843508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610ec435610ea4358788858a8b610d44358809610ba4350808830991508788858a8b610d64358809610bc4350808830991508788858a600051610ba4350808820990508786600051096000528788858a600051610bc43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f2435610f04358788858a8b610d84358809610be4350808830991508788858a8b610da4358809610c24350808830991508788858a600051610be4350808820990508786600051096000528788858a600051610c243508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f8435610f64358788858a8b610dc4358809610c44350808830991508788858a8b610de4358809610c64350808830991508788858a600051610c44350808820990508786600051096000528788858a600051610c643508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610fe435610fc4358788858a8b610e04358809610c84350808830991508788858a8b610e24358809611120510808830991508788858a600051610c84350808820990508786600051096000528788858a6000516111205108088209905087818903830893505050508485866110e0516110c05108830986038208905084818684890908955050611100518485611004358703830982089050848186848909089550506110c051848561100435870387611004356110043509088209905084818684890908955060009050610c0435610b8435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361108435088a85611044350809611024350988898a8487088b86890809611004350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611084358603611044350861110051098481868489090895505083848561106435870361104435088661108435880361104435080985866110c0516110e05108870360010809848186848909089550506111005184856110a4358703830982089050848186848909089550506110c05184856110a4358703876110a4356110a43509088209905084818684890908955060009050610b8435610ba435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361112435088a856110e43508096110c4350988898a8487088b868908096110a4350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111243586036110e435086111005109848186848909089550508384856111043587036110e43508866111243588036110e435080985866110c0516110e0510887036001080984818684890908955050611100518485611144358703830982089050848186848909089550506110c051848561114435870387611144356111443509088209905084818684890908955060009050610ba435610bc435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836111c435088a85611184350809611164350988898a8487088b86890809611144350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111c435860361118435086111005109848186848909089550508384856111a43587036111843508866111c435880361118435080985866110c0516110e05108870360010809848186848909089550506111005184856111e4358703830982089050848186848909089550506110c05184856111e4358703876111e4356111e43509088209905084818684890908955060009050610bc435610be435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361126435088a85611224350809611204350988898a8487088b868908096111e4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611264358603611224350861110051098481868489090895505083848561124435870361122435088661126435880361122435080985866110c0516110e0510887036001080984818684890908955050611100518485611284358703830982089050848186848909089550506110c051848561128435870387611284356112843509088209905084818684890908955060009050610ca435610c2435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361130435088a856112c43508096112a4350988898a8487088b86890809611284350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113043586036112c435086111005109848186848909089550508384856112e43587036112c43508866113043588036112c435080985866110c0516110e0510887036001080984818684890908955050611100518485611324358703830982089050848186848909089550506110c051848561132435870387611324356113243509088209905084818684890908955060009050610c2435610c4435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836113a435088a85611364350809611344350988898a8487088b86890809611324350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113a435860361136435086111005109848186848909089550508384856113843587036113643508866113a435880361136435080985866110c0516110e05108870360010809848186848909089550506111005184856113c4358703830982089050848186848909089550506110c05184856113c4358703876113c4356113c43509088209905084818684890908955060009050610c4435610c6435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361144435088a856114043508096113e4350988898a8487088b868908096113c4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611444358603611404350861110051098481868489090895505083848561142435870361140435088661144435880361140435080985866110c0516110e0510887036001080984818684890908955050611100518485611464358703830982089050848186848909089550506110c051848561146435870387611464356114643509088209905084818684890908955060009050610c6435610c8435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836114e435088a856114a4350809611484350988898a8487088b86890809611464350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846114e43586036114a435086111005109848186848909089550508384856114c43587036114a43508866114e43588036114a435080985866110c0516110e05108870360010809848186848909089550505050816110a051840961114052610b4435600052610b6435602052611080519250610b04610a845b818110156113415761132285846101a2565b92506113346020830135833585610182565b9250604082039150611310565b50506000516111605260205161118052610f80519250610a0051610a205183828609915081610360528461034052838186099150816103205283818309915083818309915083818309915083818309915083818309915050806103005250610fe05192506103806104006103005b818310156113cc57848151860387088352602092830192016113af565b50506103c0516104005250610380516103a051909350829084099250816103e05184096104208190526000526103a0516104408190526103805193508290840961046052610380516103e05190935082908409610480526103c0516001935082908409602052610300516103405161036051919450906000848381038708905084858387038808820990508461038051820990508060405284868603840890508485838703850882099050846103c051820990508060605284868603830890508485848703840882099050846103e051820960805250506103405161036051909450905060008382810386089050836103c051820990508060a0528385850383089050836103e051820960c0525050610320516103405190935060008382810386089050836103a051820990508060e0528385850383089050836103c051820961010052506115229050826101206000846100c4565b9050600051925082610420526104406104a05b8082101561154f5783858351098252602082019150611535565b50506020519250610fa05160008384610ce435870982089050838282099050838461114051870982089050610e24610ce45b818110156115a15785868335890987868609089250602082039150611581565b50508382820990508384610cc43587098208905083828209905083846114e43587098208905083828209905083846114443587098208905083828209905083846113a43587098208905083828209905083846113043587098208905083828209905083846112643587098208905083828209905083846111c435870982089050838282099050838461112435870982089050838282099050838461108435870982089050610ca4610b645b8181101561166c578586833589098786860908925060208203915061164c565b5050806104a0525050610fa051925060008283610fa43560405109820890508283610f643560605109820890508283610f843560805109820890508284820990508283610f443560405109820890508283610f043560605109820890508283610f243560805109820890508284820990508283610ee43560405109820890508283610ea43560605109820890508283610ec43560805109820890508284820990508283610e843560405109820890508283610e443560605109820890508283610e64356080510982089050826104405182099050806104c05250610fa0519250600082836114643560a051098208905082836114843560c051098208905082848209905082836113c43560a051098208905082836113e43560c051098208905082848209905082836113243560a051098208905082836113443560c051098208905082848209905082836112843560a051098208905082836112a43560c051098208905082848209905082836111e43560a051098208905082836112043560c051098208905082848209905082836111443560a051098208905082836111643560c051098208905082848209905082836110a43560a051098208905082836110c43560c051098208905082848209905082836110043560a051098208905082836110243560c05109820890508284820990508283610fc43560a05109820890508283610fe43560c0510982089050826104605182099050806104e05250610fa0519250600082836114c43560e051098208905082836114a43561010051098208905082848209905082836114243560e051098208905082836114043561010051098208905082848209905082836113843560e051098208905082836113643561010051098208905082848209905082836112e43560e051098208905082836112c43561010051098208905082848209905082836112443560e051098208905082836112243561010051098208905082848209905082836111a43560e051098208905082836111843561010051098208905082848209905082836111043560e051098208905082836110e43561010051098208905082848209905082836110643560e0510982089050828361104435610100510982089050826104805182096105005250602051610520526040516060519093508290840892508160805184086105405260a05160c051909350829084086105605260e0516101005190935082908408610580526000925060806105205b81851015611a145780518552602094850194016119fc565b5050611a248260806000846100c4565b90508161050051606051099250604060806104e05b81831015611a625784610fc051870995508485825185510987089550601f199283019201611a39565b505050826111a052610fc0519250610a8435600052610aa435602052611a8b610fa051826101a2565b9050611a9e611180516111605183610182565b9050610ec0610c005b81811015611adb57611abc610fa051846101a2565b9250611ace6020830151835185610182565b9250604082039150611aa7565b5050611aea610fa051826101a2565b9050611afd610724356107043583610182565b9050611b0c610fa051826101a2565b9050611b1f6106a4356106843583610182565b9050611b2e610fa051826101a2565b9050611b41610624356106043583610182565b9050611b50610fa051826101a2565b9050611b636105a4356105843583610182565b9050611b72610fa051826101a2565b9050611b85610524356105043583610182565b9050611b94610fa051826101a2565b9050611ba76104a4356104843583610182565b9050611bb6610fa051826101a2565b9050611bc9610424356104043583610182565b9050611bd8610fa051826101a2565b9050611beb6103a4356103843583610182565b9050611bfa610fa051826101a2565b9050611c0d610124356101043583610182565b90506103046102045b81811015611c4a57611c2b610fa051846101a2565b9250611c3d6020830135833585610182565b9250604082039150611c16565b5050611c59610fa051826101a2565b9050611c6a60e43560c43583610182565b90506102046101045b81811015611ca757611c88610fa051846101a2565b9250611c9a6020830135833585610182565b9250604082039150611c73565b5050610804356080526108243560a0526107c46107045b81811015611cf257611cd3610fa051846101dc565b9250611ce560208301358335856101bd565b9250604082039150611cbe565b5050611d0482610440518509826101dc565b9050611d1560a05160805183610182565b905081610fc05184099250610a4435608052610a643560a052610a046108045b81811015611d6957611d4a610fa051846101dc565b9250611d5c60208301358335856101bd565b9250604082039150611d35565b5050611d7b82610460518509826101dc565b9050611d8c60a05160805183610182565b905081610fc051840992506106c4356080526106e43560a052611db2610fa051826101dc565b9050611dc56106643561064435836101bd565b9050611dd4610fa051826101dc565b9050611de76105e4356105c435836101bd565b9050611df6610fa051826101dc565b9050611e096105643561054435836101bd565b9050611e18610fa051826101dc565b9050611e2b6104e4356104c435836101bd565b9050611e3a610fa051826101dc565b9050611e4d6104643561044435836101bd565b9050611e5c610fa051826101dc565b9050611e6f6103e4356103c435836101bd565b9050611e7e610fa051826101dc565b9050611e916103643561034435836101bd565b9050611ea382610480518509826101dc565b9050611eb460a05160805183610182565b9050610b0051608052610b205160a052611ed36111a0518303826101dc565b9050611ee460a05160805183610182565b9050611504356080526115243560a052611f03610400518303826101dc565b9050611f1460a05160805183610182565b9050611544356080526115643560a052611f31610fe051826101dc565b9050611f4260a05160805183610182565b90506000516111c0526020516111e05261154435611200526115643561122052610a80511561201657611000516000526110205160205261104051604052611060516060526111c0516080526111e05160a0526112005160c0526112205160e05281610100600020069250611fb783826101a2565b9050611fca6111e0516111c05183610182565b90506000516111c0526020516111e0526110405160005261106051602052611ff283826101a2565b9050612005611220516112005183610182565b905060005161120052602051611220525b61202f61122051611200516111e0516111c051856101f7565b90508061203b57600080fd5b505050600160005260206000f35b60008083601f84011261205b57600080fd5b50813567ffffffffffffffff81111561207357600080fd5b6020830191508360208260051b850101111561208e57600080fd5b9250929050565b6000806000806000606086880312156120ad57600080fd5b85356001600160a01b03811681146120c457600080fd5b9450602086013567ffffffffffffffff808211156120e157600080fd5b818801915088601f8301126120f557600080fd5b81358181111561210457600080fd5b89602082850101111561211657600080fd5b60208301965080955050604088013591508082111561213457600080fd5b5061214188828901612049565b96999598509396509294939250505056fea2646970667358221220533640d8171c8a735362590c471331aa70a9335324b4ab6dc6eeba85426ab79c64736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063af83a18d14610030575b600080fd5b61004361003e366004612095565b610057565b604051901515815260200160405180910390f35b6000610263565b60008060008435602086013588821086169450888110851694508860038a8b858609850908898283099289526020890191909152149290921696604094850196509390940193505050565b60016020536021600090812092830682529190915260200190565b6000838351602085015b602087038110156100f0578781518309808452602093840193909250016100ce565b8781518309915060208352602080840152602060408401528160608401526002880360808401528760a084015260208360c08560055afa851693508251915085602081016020850394505b828110156101635789855185098a84518609908452601f19958601959094509092019161013b565b8981518509945089825185099490915292909252509095945050505050565b81604052826060526000604060006080600060065afa9091169392505050565b816040526000604060006060600060075afa90911692915050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b8160005282602052610b4051604052610b6051606052610b8051608052610ba05160a0528360c0528460e052610bc05161010052610be05161012052610c005161014052610c205161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600161056060006109a08b3c6064356115001481169050610a6051611584358114821691506109a05160005260206115a48260200281015b8082101561030057813580845286119490941693602092830192909101906102dd565b5060849250610f0090506103445b8084101561032d576103228784868861005e565b94509450945061030e565b5060009182208581068252909152602090810161040083015b808410156103655761035a8784868861005e565b945094509450610346565b5060009182208581068252909152602090810161038285826100a9565b905061038083015b808410156103a95761039e8784868861005e565b94509450945061038a565b5060009182208581068252909152602090810160c083015b808410156103e0576103d58784868861005e565b9450945094506103c1565b5060009182208581068252909152602090810161098083015b8084101561041c57833580845286119490941693602093840193909201916103f9565b5060009182208581068252909152602090810161043985826100a9565b90506104478683858761005e565b600090812088810690945292909252935091506020905061046a8582848661005e565b9250925092505050610a80511561053757610ac051610ae0516020610aa051026115a4016020830260028102600382028335838501358386013583870135896020028801895b818a10156104ee5760208a0199508935811b86019550888a0135811b85019450878a0135811b84019350868a0135811b830192508a810190506104b0565b50508c60038e8f8788098709088d848509148b169a508c60038e8f8586098509088d828309148b169a508361100052826110205281611040528061106052505050505050505050505b8061054157600080fd5b6109c0519250610f80518060005b858110156105655784828309915060010161054f565b50610a005194506110806006610a6051016020028101610a6051610587576020015b610a40515b818310156105ad57868188038608835286888209905060208301925061058c565b508560018703840893508381526105cb8660208301611080886100c4565b94506110809150856109e05185099350610a40515b8183101561060357868782855109860983528688820990506020830192506105e0565b506110a05196506110c0935061114091505b8184101561062f5785845188089650602084019350610615565b600091506115a4610a605160200281015b80821015610664578788833588510985089350602082019150602086019550610640565b505051611080805161114051949091526110a0919091526110c0526110e0959095526111008190526111209490945250610f60516000937f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a291908480610e4435830986038208955050610fc435848082810381848009086110c051099050848186848909089550508384610e84358603610ea435086111005109848186848909089550508384610ee4358603610f0435086111005109848186848909089550508384610f44358603610f6435086111005109848186848909089550508384610fa4358603610fc43508611100510984818684890908955050610f4051610f2051610e6435610e44358788858a8b610d04358809610cc4350808830991508788858a8b610d24358809610b843508088309915087610f805184096000528788858a600051610cc4350808820990508786600051096000528788858a600051610b843508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610ec435610ea4358788858a8b610d44358809610ba4350808830991508788858a8b610d64358809610bc4350808830991508788858a600051610ba4350808820990508786600051096000528788858a600051610bc43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f2435610f04358788858a8b610d84358809610be4350808830991508788858a8b610da4358809610c24350808830991508788858a600051610be4350808820990508786600051096000528788858a600051610c243508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f8435610f64358788858a8b610dc4358809610c44350808830991508788858a8b610de4358809610c64350808830991508788858a600051610c44350808820990508786600051096000528788858a600051610c643508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610fe435610fc4358788858a8b610e04358809610c84350808830991508788858a8b610e24358809611120510808830991508788858a600051610c84350808820990508786600051096000528788858a6000516111205108088209905087818903830893505050508485866110e0516110c05108830986038208905084818684890908955050611100518485611004358703830982089050848186848909089550506110c051848561100435870387611004356110043509088209905084818684890908955060009050610c0435610b8435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361108435088a85611044350809611024350988898a8487088b86890809611004350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611084358603611044350861110051098481868489090895505083848561106435870361104435088661108435880361104435080985866110c0516110e05108870360010809848186848909089550506111005184856110a4358703830982089050848186848909089550506110c05184856110a4358703876110a4356110a43509088209905084818684890908955060009050610b8435610ba435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361112435088a856110e43508096110c4350988898a8487088b868908096110a4350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111243586036110e435086111005109848186848909089550508384856111043587036110e43508866111243588036110e435080985866110c0516110e0510887036001080984818684890908955050611100518485611144358703830982089050848186848909089550506110c051848561114435870387611144356111443509088209905084818684890908955060009050610ba435610bc435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836111c435088a85611184350809611164350988898a8487088b86890809611144350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111c435860361118435086111005109848186848909089550508384856111a43587036111843508866111c435880361118435080985866110c0516110e05108870360010809848186848909089550506111005184856111e4358703830982089050848186848909089550506110c05184856111e4358703876111e4356111e43509088209905084818684890908955060009050610bc435610be435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361126435088a85611224350809611204350988898a8487088b868908096111e4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611264358603611224350861110051098481868489090895505083848561124435870361122435088661126435880361122435080985866110c0516110e0510887036001080984818684890908955050611100518485611284358703830982089050848186848909089550506110c051848561128435870387611284356112843509088209905084818684890908955060009050610ca435610c2435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361130435088a856112c43508096112a4350988898a8487088b86890809611284350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113043586036112c435086111005109848186848909089550508384856112e43587036112c43508866113043588036112c435080985866110c0516110e0510887036001080984818684890908955050611100518485611324358703830982089050848186848909089550506110c051848561132435870387611324356113243509088209905084818684890908955060009050610c2435610c4435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836113a435088a85611364350809611344350988898a8487088b86890809611324350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113a435860361136435086111005109848186848909089550508384856113843587036113643508866113a435880361136435080985866110c0516110e05108870360010809848186848909089550506111005184856113c4358703830982089050848186848909089550506110c05184856113c4358703876113c4356113c43509088209905084818684890908955060009050610c4435610c6435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361144435088a856114043508096113e4350988898a8487088b868908096113c4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611444358603611404350861110051098481868489090895505083848561142435870361140435088661144435880361140435080985866110c0516110e0510887036001080984818684890908955050611100518485611464358703830982089050848186848909089550506110c051848561146435870387611464356114643509088209905084818684890908955060009050610c6435610c8435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836114e435088a856114a4350809611484350988898a8487088b86890809611464350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846114e43586036114a435086111005109848186848909089550508384856114c43587036114a43508866114e43588036114a435080985866110c0516110e05108870360010809848186848909089550505050816110a051840961114052610b4435600052610b6435602052611080519250610b04610a845b818110156113415761132285846101a2565b92506113346020830135833585610182565b9250604082039150611310565b50506000516111605260205161118052610f80519250610a0051610a205183828609915081610360528461034052838186099150816103205283818309915083818309915083818309915083818309915083818309915050806103005250610fe05192506103806104006103005b818310156113cc57848151860387088352602092830192016113af565b50506103c0516104005250610380516103a051909350829084099250816103e05184096104208190526000526103a0516104408190526103805193508290840961046052610380516103e05190935082908409610480526103c0516001935082908409602052610300516103405161036051919450906000848381038708905084858387038808820990508461038051820990508060405284868603840890508485838703850882099050846103c051820990508060605284868603830890508485848703840882099050846103e051820960805250506103405161036051909450905060008382810386089050836103c051820990508060a0528385850383089050836103e051820960c0525050610320516103405190935060008382810386089050836103a051820990508060e0528385850383089050836103c051820961010052506115229050826101206000846100c4565b9050600051925082610420526104406104a05b8082101561154f5783858351098252602082019150611535565b50506020519250610fa05160008384610ce435870982089050838282099050838461114051870982089050610e24610ce45b818110156115a15785868335890987868609089250602082039150611581565b50508382820990508384610cc43587098208905083828209905083846114e43587098208905083828209905083846114443587098208905083828209905083846113a43587098208905083828209905083846113043587098208905083828209905083846112643587098208905083828209905083846111c435870982089050838282099050838461112435870982089050838282099050838461108435870982089050610ca4610b645b8181101561166c578586833589098786860908925060208203915061164c565b5050806104a0525050610fa051925060008283610fa43560405109820890508283610f643560605109820890508283610f843560805109820890508284820990508283610f443560405109820890508283610f043560605109820890508283610f243560805109820890508284820990508283610ee43560405109820890508283610ea43560605109820890508283610ec43560805109820890508284820990508283610e843560405109820890508283610e443560605109820890508283610e64356080510982089050826104405182099050806104c05250610fa0519250600082836114643560a051098208905082836114843560c051098208905082848209905082836113c43560a051098208905082836113e43560c051098208905082848209905082836113243560a051098208905082836113443560c051098208905082848209905082836112843560a051098208905082836112a43560c051098208905082848209905082836111e43560a051098208905082836112043560c051098208905082848209905082836111443560a051098208905082836111643560c051098208905082848209905082836110a43560a051098208905082836110c43560c051098208905082848209905082836110043560a051098208905082836110243560c05109820890508284820990508283610fc43560a05109820890508283610fe43560c0510982089050826104605182099050806104e05250610fa0519250600082836114c43560e051098208905082836114a43561010051098208905082848209905082836114243560e051098208905082836114043561010051098208905082848209905082836113843560e051098208905082836113643561010051098208905082848209905082836112e43560e051098208905082836112c43561010051098208905082848209905082836112443560e051098208905082836112243561010051098208905082848209905082836111a43560e051098208905082836111843561010051098208905082848209905082836111043560e051098208905082836110e43561010051098208905082848209905082836110643560e0510982089050828361104435610100510982089050826104805182096105005250602051610520526040516060519093508290840892508160805184086105405260a05160c051909350829084086105605260e0516101005190935082908408610580526000925060806105205b81851015611a145780518552602094850194016119fc565b5050611a248260806000846100c4565b90508161050051606051099250604060806104e05b81831015611a625784610fc051870995508485825185510987089550601f199283019201611a39565b505050826111a052610fc0519250610a8435600052610aa435602052611a8b610fa051826101a2565b9050611a9e611180516111605183610182565b9050610ec0610c005b81811015611adb57611abc610fa051846101a2565b9250611ace6020830151835185610182565b9250604082039150611aa7565b5050611aea610fa051826101a2565b9050611afd610724356107043583610182565b9050611b0c610fa051826101a2565b9050611b1f6106a4356106843583610182565b9050611b2e610fa051826101a2565b9050611b41610624356106043583610182565b9050611b50610fa051826101a2565b9050611b636105a4356105843583610182565b9050611b72610fa051826101a2565b9050611b85610524356105043583610182565b9050611b94610fa051826101a2565b9050611ba76104a4356104843583610182565b9050611bb6610fa051826101a2565b9050611bc9610424356104043583610182565b9050611bd8610fa051826101a2565b9050611beb6103a4356103843583610182565b9050611bfa610fa051826101a2565b9050611c0d610124356101043583610182565b90506103046102045b81811015611c4a57611c2b610fa051846101a2565b9250611c3d6020830135833585610182565b9250604082039150611c16565b5050611c59610fa051826101a2565b9050611c6a60e43560c43583610182565b90506102046101045b81811015611ca757611c88610fa051846101a2565b9250611c9a6020830135833585610182565b9250604082039150611c73565b5050610804356080526108243560a0526107c46107045b81811015611cf257611cd3610fa051846101dc565b9250611ce560208301358335856101bd565b9250604082039150611cbe565b5050611d0482610440518509826101dc565b9050611d1560a05160805183610182565b905081610fc05184099250610a4435608052610a643560a052610a046108045b81811015611d6957611d4a610fa051846101dc565b9250611d5c60208301358335856101bd565b9250604082039150611d35565b5050611d7b82610460518509826101dc565b9050611d8c60a05160805183610182565b905081610fc051840992506106c4356080526106e43560a052611db2610fa051826101dc565b9050611dc56106643561064435836101bd565b9050611dd4610fa051826101dc565b9050611de76105e4356105c435836101bd565b9050611df6610fa051826101dc565b9050611e096105643561054435836101bd565b9050611e18610fa051826101dc565b9050611e2b6104e4356104c435836101bd565b9050611e3a610fa051826101dc565b9050611e4d6104643561044435836101bd565b9050611e5c610fa051826101dc565b9050611e6f6103e4356103c435836101bd565b9050611e7e610fa051826101dc565b9050611e916103643561034435836101bd565b9050611ea382610480518509826101dc565b9050611eb460a05160805183610182565b9050610b0051608052610b205160a052611ed36111a0518303826101dc565b9050611ee460a05160805183610182565b9050611504356080526115243560a052611f03610400518303826101dc565b9050611f1460a05160805183610182565b9050611544356080526115643560a052611f31610fe051826101dc565b9050611f4260a05160805183610182565b90506000516111c0526020516111e05261154435611200526115643561122052610a80511561201657611000516000526110205160205261104051604052611060516060526111c0516080526111e05160a0526112005160c0526112205160e05281610100600020069250611fb783826101a2565b9050611fca6111e0516111c05183610182565b90506000516111c0526020516111e0526110405160005261106051602052611ff283826101a2565b9050612005611220516112005183610182565b905060005161120052602051611220525b61202f61122051611200516111e0516111c051856101f7565b90508061203b57600080fd5b505050600160005260206000f35b60008083601f84011261205b57600080fd5b50813567ffffffffffffffff81111561207357600080fd5b6020830191508360208260051b850101111561208e57600080fd5b9250929050565b6000806000806000606086880312156120ad57600080fd5b85356001600160a01b03811681146120c457600080fd5b9450602086013567ffffffffffffffff808211156120e157600080fd5b818801915088601f8301126120f557600080fd5b81358181111561210457600080fd5b89602082850101111561211657600080fd5b60208301965080955050604088013591508082111561213457600080fd5b5061214188828901612049565b96999598509396509294939250505056fea2646970667358221220533640d8171c8a735362590c471331aa70a9335324b4ab6dc6eeba85426ab79c64736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/abi/Summa.json b/backend/src/contracts/abi/Summa.json index 224b5e3f..77d86b82 100644 --- a/backend/src/contracts/abi/Summa.json +++ b/backend/src/contracts/abi/Summa.json @@ -1 +1 @@ -{"_format":"hh-sol-artifact-1","contractName":"Summa","sourceName":"src/Summa.sol","abi":[{"inputs":[{"internalType":"contract IVerifier","name":"_inclusionVerifier","type":"address"},{"internalType":"uint16","name":"mstLevels","type":"uint16"},{"internalType":"uint16","name":"currenciesCount","type":"uint16"},{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"indexed":false,"internalType":"struct Summa.AddressOwnershipProof[]","name":"addressOwnershipProofs","type":"tuple[]"}],"name":"AddressOwnershipProofSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mstRoot","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"rootBalances","type":"uint256[]"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"chain","type":"string"}],"indexed":false,"internalType":"struct Summa.Cryptocurrency[]","name":"cryptocurrencies","type":"tuple[]"}],"name":"LiabilitiesCommitmentSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressOwnershipProofs","outputs":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"uint256","name":"mstRoot","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint16","name":"mstLevels","type":"uint16"},{"internalType":"uint16","name":"currenciesCount","type":"uint16"},{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"addressHash","type":"bytes32"}],"name":"getAddressOwnershipProof","outputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mstRoot","type":"uint256"},{"internalType":"uint256[]","name":"rootBalances","type":"uint256[]"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"chain","type":"string"}],"internalType":"struct Summa.Cryptocurrency[]","name":"cryptocurrencies","type":"tuple[]"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"submitCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof[]","name":"_addressOwnershipProofs","type":"tuple[]"}],"name":"submitProofOfAddressOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"publicInputs","type":"uint256[]"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"verifyInclusionProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x60a06040523480156200001157600080fd5b5060405162001cf938038062001cf9833981016040819052620000349162000110565b6200003f33620000a8565b6001600160a01b03939093166080526040805160608101825261ffff938416808252929093166020840181905260ff90941692018290526001805463ffffffff1916909117620100009093029290921760ff60201b191664010000000090910217905562000181565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b805161ffff811681146200010b57600080fd5b919050565b600080600080608085870312156200012757600080fd5b84516001600160a01b03811681146200013f57600080fd5b93506200014f60208601620000f8565b92506200015f60408601620000f8565b9150606085015160ff811681146200017657600080fd5b939692955090935050565b608051611b5c6200019d6000396000610b5b0152611b5c6000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a3c4bcf811610066578063a3c4bcf814610169578063c7ddca0e1461018c578063c8e581471461019f578063da64a750146101c2578063f2fde38b146101d557600080fd5b806319b33968146100a357806349ce8997146100cc578063715018a6146100fa57806379502c55146101045780638da5cb5b1461014e575b600080fd5b6100b66100b13660046111d3565b6101e8565b6040516100c391906112a7565b60405180910390f35b6100ec6100da3660046111d3565b60046020526000908152604090205481565b6040519081526020016100c3565b610102610500565b005b60015461012a9061ffff8082169162010000810490911690640100000000900460ff1683565b6040805161ffff948516815293909216602084015260ff16908201526060016100c3565b6000546040516001600160a01b0390911681526020016100c3565b61017c6101773660046111d3565b610514565b6040516100c394939291906112c1565b61010261019a366004611440565b610774565b6101b26101ad366004611605565b610a15565b60405190151581526020016100c3565b6101026101d0366004611672565b610bdb565b6101026101e33660046117b9565b610fa7565b6102136040518060800160405280606081526020016060815260200160608152602001606081525090565b60008281526003602052604090205461026a5760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b60448201526064015b60405180910390fd5b600082815260036020526040902054600290610288906001906117f8565b8154811061029857610298611811565b90600052602060002090600402016040518060800160405290816000820180546102c190611827565b80601f01602080910402602001604051908101604052809291908181526020018280546102ed90611827565b801561033a5780601f1061030f5761010080835404028352916020019161033a565b820191906000526020600020905b81548152906001019060200180831161031d57829003601f168201915b5050505050815260200160018201805461035390611827565b80601f016020809104026020016040519081016040528092919081815260200182805461037f90611827565b80156103cc5780601f106103a1576101008083540402835291602001916103cc565b820191906000526020600020905b8154815290600101906020018083116103af57829003601f168201915b505050505081526020016002820180546103e590611827565b80601f016020809104026020016040519081016040528092919081815260200182805461041190611827565b801561045e5780601f106104335761010080835404028352916020019161045e565b820191906000526020600020905b81548152906001019060200180831161044157829003601f168201915b5050505050815260200160038201805461047790611827565b80601f01602080910402602001604051908101604052809291908181526020018280546104a390611827565b80156104f05780601f106104c5576101008083540402835291602001916104f0565b820191906000526020600020905b8154815290600101906020018083116104d357829003601f168201915b5050505050815250509050919050565b610508611020565b610512600061107a565b565b6002818154811061052457600080fd5b906000526020600020906004020160009150905080600001805461054790611827565b80601f016020809104026020016040519081016040528092919081815260200182805461057390611827565b80156105c05780601f10610595576101008083540402835291602001916105c0565b820191906000526020600020905b8154815290600101906020018083116105a357829003601f168201915b5050505050908060010180546105d590611827565b80601f016020809104026020016040519081016040528092919081815260200182805461060190611827565b801561064e5780601f106106235761010080835404028352916020019161064e565b820191906000526020600020905b81548152906001019060200180831161063157829003601f168201915b50505050509080600201805461066390611827565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90611827565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050908060030180546106f190611827565b80601f016020809104026020016040519081016040528092919081815260200182805461071d90611827565b801561076a5780601f1061073f5761010080835404028352916020019161076a565b820191906000526020600020905b81548152906001019060200180831161074d57829003601f168201915b5050505050905084565b61077c611020565b60005b81518110156109da57600082828151811061079c5761079c611811565b6020026020010151600001516040516020016107b89190611861565b60408051601f19818403018152918152815160209283012060008181526003909352912054909150801561082e5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610261565b600284848151811061084257610842611811565b6020908102919091018101518254600181018455600093845291909220825160049092020190819061087490826118cc565b506020820151600182019061088990826118cc565b506040820151600282019061089e90826118cc565b50606082015160038201906108b390826118cc565b50506002546000848152600360205260409020555083518490849081106108dc576108dc611811565b60200260200101516000015151600014158015610918575083838151811061090657610906611811565b60200260200101516020015151600014155b8015610943575083838151811061093157610931611811565b60200260200101516040015151600014155b801561096e575083838151811061095c5761095c611811565b60200260200101516060015151600014155b6109c55760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610261565b505080806109d29061198c565b91505061077f565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a045465881604051610a0a91906119a5565b60405180910390a150565b600082600181518110610a2a57610a2a611811565b6020026020010151600460008481526020019081526020016000206000015414610a895760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610261565b60025b8351811015610b4357838181518110610aa757610aa7611811565b602002602001015160046000858152602001908152602001600020600101600283610ad291906117f8565b81548110610ae257610ae2611811565b906000526020600020015414610b315760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420726f6f742062616c616e636560601b6044820152606401610261565b80610b3b8161198c565b915050610a8c565b50604051630bd205a960e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610b929086908890600401611a42565b602060405180830381865afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd39190611a67565b949350505050565b610be3611020565b83600003610c265760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610261565b8151835114610c955760405162461bcd60e51b815260206004820152603560248201527f526f6f74206c696162696c69746965732073756d7320616e64206c696162696c6044820152740d2e8d2cae640dceadac4cae440dad2e6dac2e8c6d605b1b6064820152608401610261565b6000825167ffffffffffffffff811115610cb157610cb1611319565b604051908082528060200260200182016040528015610ce457816020015b6060815260200190600190039081610ccf5790505b5090506000835167ffffffffffffffff811115610d0357610d03611319565b604051908082528060200260200182016040528015610d3657816020015b6060815260200190600190039081610d215790505b50905060005b8451811015610edc57848181518110610d5757610d57611811565b60200260200101516020015151600014158015610d935750848181518110610d8157610d81611811565b60200260200101516000015151600014155b610dd85760405162461bcd60e51b8152602060048201526016602482015275496e76616c69642063727970746f63757272656e637960501b6044820152606401610261565b858181518110610dea57610dea611811565b6020026020010151600003610e535760405162461bcd60e51b815260206004820152602960248201527f416c6c20726f6f742073756d732073686f756c642062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610261565b848181518110610e6557610e65611811565b602002602001015160000151838281518110610e8357610e83611811565b6020026020010181905250848181518110610ea057610ea0611811565b602002602001015160200151828281518110610ebe57610ebe611811565b60200260200101819052508080610ed49061198c565b915050610d3c565b5060408051608081018252878152602080820188815282840186905260608301859052600087815260048352939093208251815592518051929392610f2792600185019201906110ca565b5060408201518051610f43916002840191602090910190611115565b5060608201518051610f5f916003840191602090910190611115565b50905050827f88bfc7389cb831ea0208ff106da6f5c9f88036ba084f1eb008d2788d3d45998d878787604051610f9793929190611a89565b60405180910390a2505050505050565b610faf611020565b6001600160a01b0381166110145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610261565b61101d8161107a565b50565b6000546001600160a01b031633146105125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610261565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215611105579160200282015b828111156111055782518255916020019190600101906110ea565b50611111929150611167565b5090565b82805482825590600052602060002090810192821561115b579160200282015b8281111561115b578251829061114b90826118cc565b5091602001919060010190611135565b5061111192915061117c565b5b808211156111115760008155600101611168565b808211156111115760006111908282611199565b5060010161117c565b5080546111a590611827565b6000825580601f106111b5575050565b601f01602090049060005260206000209081019061101d9190611167565b6000602082840312156111e557600080fd5b5035919050565b60005b838110156112075781810151838201526020016111ef565b50506000910152565b600081518084526112288160208601602086016111ec565b601f01601f19169290920160200192915050565b60008151608084526112516080850182611210565b90506020830151848203602086015261126a8282611210565b915050604083015184820360408601526112848282611210565b9150506060830151848203606086015261129e8282611210565b95945050505050565b6020815260006112ba602083018461123c565b9392505050565b6080815260006112d46080830187611210565b82810360208401526112e68187611210565b905082810360408401526112fa8186611210565b9050828103606084015261130e8185611210565b979650505050505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561135257611352611319565b60405290565b6040805190810167ffffffffffffffff8111828210171561135257611352611319565b604051601f8201601f1916810167ffffffffffffffff811182821017156113a4576113a4611319565b604052919050565b600067ffffffffffffffff8211156113c6576113c6611319565b5060051b60200190565b600082601f8301126113e157600080fd5b813567ffffffffffffffff8111156113fb576113fb611319565b61140e601f8201601f191660200161137b565b81815284602083860101111561142357600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561145357600080fd5b823567ffffffffffffffff8082111561146b57600080fd5b818501915085601f83011261147f57600080fd5b813561149261148d826113ac565b61137b565b81815260059190911b830184019084810190888311156114b157600080fd5b8585015b83811015611592578035858111156114cc57600080fd5b86016080818c03601f190112156114e35760008081fd5b6114eb61132f565b88820135878111156114fd5760008081fd5b61150b8d8b838601016113d0565b825250604080830135888111156115225760008081fd5b6115308e8c838701016113d0565b8b84015250606080840135898111156115495760008081fd5b6115578f8d838801016113d0565b838501525060808401359150888211156115715760008081fd5b61157f8e8c848701016113d0565b90830152508452509186019186016114b5565b5098975050505050505050565b600082601f8301126115b057600080fd5b813560206115c061148d836113ac565b82815260059290921b840181019181810190868411156115df57600080fd5b8286015b848110156115fa57803583529183019183016115e3565b509695505050505050565b60008060006060848603121561161a57600080fd5b833567ffffffffffffffff8082111561163257600080fd5b61163e878388016113d0565b9450602086013591508082111561165457600080fd5b506116618682870161159f565b925050604084013590509250925092565b6000806000806080858703121561168857600080fd5b84359350602085013567ffffffffffffffff808211156116a757600080fd5b6116b38883890161159f565b945060408701359150808211156116c957600080fd5b818701915087601f8301126116dd57600080fd5b6116ea61148d83356113ac565b82358082526020808301929160051b8501018a81111561170957600080fd5b602085015b818110156117a557848135111561172457600080fd5b803586016040818e03601f1901121561173c57600080fd5b611744611358565b60208201358781111561175657600080fd5b6117658f6020838601016113d0565b82525060408201358781111561177a57600080fd5b6117898f6020838601016113d0565b602083015250808652505060208401935060208101905061170e565b50979a969950976060013596505050505050565b6000602082840312156117cb57600080fd5b81356001600160a01b03811681146112ba57600080fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561180b5761180b6117e2565b92915050565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061183b57607f821691505b60208210810361185b57634e487b7160e01b600052602260045260246000fd5b50919050565b600082516118738184602087016111ec565b9190910192915050565b601f8211156118c757600081815260208120601f850160051c810160208610156118a45750805b601f850160051c820191505b818110156118c3578281556001016118b0565b5050505b505050565b815167ffffffffffffffff8111156118e6576118e6611319565b6118fa816118f48454611827565b8461187d565b602080601f83116001811461192f57600084156119175750858301515b600019600386901b1c1916600185901b1785556118c3565b600085815260208120601f198616915b8281101561195e5788860151825594840194600190910190840161193f565b508582101561197c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161199e5761199e6117e2565b5060010190565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156119fa57603f198886030184526119e885835161123c565b945092850192908501906001016119cc565b5092979650505050505050565b600081518084526020808501945080840160005b83811015611a3757815187529582019590820190600101611a1b565b509495945050505050565b604081526000611a556040830185611a07565b828103602084015261129e8185611210565b600060208284031215611a7957600080fd5b815180151581146112ba57600080fd5b83815260006020606081840152611aa36060840186611a07565b6040848203818601528186518084528484019150848160051b85010185890160005b83811015611b1557868303601f1901855281518051878552611ae988860182611210565b918a0151858303868c0152919050611b018183611210565b968a01969450505090870190600101611ac5565b50909b9a505050505050505050505056fea264697066735822122045d9336f0b6314796496c7a1cf160c19b42a61943a90fb5bbe2cfcef107bb5db64736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a3c4bcf811610066578063a3c4bcf814610169578063c7ddca0e1461018c578063c8e581471461019f578063da64a750146101c2578063f2fde38b146101d557600080fd5b806319b33968146100a357806349ce8997146100cc578063715018a6146100fa57806379502c55146101045780638da5cb5b1461014e575b600080fd5b6100b66100b13660046111d3565b6101e8565b6040516100c391906112a7565b60405180910390f35b6100ec6100da3660046111d3565b60046020526000908152604090205481565b6040519081526020016100c3565b610102610500565b005b60015461012a9061ffff8082169162010000810490911690640100000000900460ff1683565b6040805161ffff948516815293909216602084015260ff16908201526060016100c3565b6000546040516001600160a01b0390911681526020016100c3565b61017c6101773660046111d3565b610514565b6040516100c394939291906112c1565b61010261019a366004611440565b610774565b6101b26101ad366004611605565b610a15565b60405190151581526020016100c3565b6101026101d0366004611672565b610bdb565b6101026101e33660046117b9565b610fa7565b6102136040518060800160405280606081526020016060815260200160608152602001606081525090565b60008281526003602052604090205461026a5760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b60448201526064015b60405180910390fd5b600082815260036020526040902054600290610288906001906117f8565b8154811061029857610298611811565b90600052602060002090600402016040518060800160405290816000820180546102c190611827565b80601f01602080910402602001604051908101604052809291908181526020018280546102ed90611827565b801561033a5780601f1061030f5761010080835404028352916020019161033a565b820191906000526020600020905b81548152906001019060200180831161031d57829003601f168201915b5050505050815260200160018201805461035390611827565b80601f016020809104026020016040519081016040528092919081815260200182805461037f90611827565b80156103cc5780601f106103a1576101008083540402835291602001916103cc565b820191906000526020600020905b8154815290600101906020018083116103af57829003601f168201915b505050505081526020016002820180546103e590611827565b80601f016020809104026020016040519081016040528092919081815260200182805461041190611827565b801561045e5780601f106104335761010080835404028352916020019161045e565b820191906000526020600020905b81548152906001019060200180831161044157829003601f168201915b5050505050815260200160038201805461047790611827565b80601f01602080910402602001604051908101604052809291908181526020018280546104a390611827565b80156104f05780601f106104c5576101008083540402835291602001916104f0565b820191906000526020600020905b8154815290600101906020018083116104d357829003601f168201915b5050505050815250509050919050565b610508611020565b610512600061107a565b565b6002818154811061052457600080fd5b906000526020600020906004020160009150905080600001805461054790611827565b80601f016020809104026020016040519081016040528092919081815260200182805461057390611827565b80156105c05780601f10610595576101008083540402835291602001916105c0565b820191906000526020600020905b8154815290600101906020018083116105a357829003601f168201915b5050505050908060010180546105d590611827565b80601f016020809104026020016040519081016040528092919081815260200182805461060190611827565b801561064e5780601f106106235761010080835404028352916020019161064e565b820191906000526020600020905b81548152906001019060200180831161063157829003601f168201915b50505050509080600201805461066390611827565b80601f016020809104026020016040519081016040528092919081815260200182805461068f90611827565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050908060030180546106f190611827565b80601f016020809104026020016040519081016040528092919081815260200182805461071d90611827565b801561076a5780601f1061073f5761010080835404028352916020019161076a565b820191906000526020600020905b81548152906001019060200180831161074d57829003601f168201915b5050505050905084565b61077c611020565b60005b81518110156109da57600082828151811061079c5761079c611811565b6020026020010151600001516040516020016107b89190611861565b60408051601f19818403018152918152815160209283012060008181526003909352912054909150801561082e5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610261565b600284848151811061084257610842611811565b6020908102919091018101518254600181018455600093845291909220825160049092020190819061087490826118cc565b506020820151600182019061088990826118cc565b506040820151600282019061089e90826118cc565b50606082015160038201906108b390826118cc565b50506002546000848152600360205260409020555083518490849081106108dc576108dc611811565b60200260200101516000015151600014158015610918575083838151811061090657610906611811565b60200260200101516020015151600014155b8015610943575083838151811061093157610931611811565b60200260200101516040015151600014155b801561096e575083838151811061095c5761095c611811565b60200260200101516060015151600014155b6109c55760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610261565b505080806109d29061198c565b91505061077f565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a045465881604051610a0a91906119a5565b60405180910390a150565b600082600181518110610a2a57610a2a611811565b6020026020010151600460008481526020019081526020016000206000015414610a895760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610261565b60025b8351811015610b4357838181518110610aa757610aa7611811565b602002602001015160046000858152602001908152602001600020600101600283610ad291906117f8565b81548110610ae257610ae2611811565b906000526020600020015414610b315760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420726f6f742062616c616e636560601b6044820152606401610261565b80610b3b8161198c565b915050610a8c565b50604051630bd205a960e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610b929086908890600401611a42565b602060405180830381865afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd39190611a67565b949350505050565b610be3611020565b83600003610c265760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610261565b8151835114610c955760405162461bcd60e51b815260206004820152603560248201527f526f6f74206c696162696c69746965732073756d7320616e64206c696162696c6044820152740d2e8d2cae640dceadac4cae440dad2e6dac2e8c6d605b1b6064820152608401610261565b6000825167ffffffffffffffff811115610cb157610cb1611319565b604051908082528060200260200182016040528015610ce457816020015b6060815260200190600190039081610ccf5790505b5090506000835167ffffffffffffffff811115610d0357610d03611319565b604051908082528060200260200182016040528015610d3657816020015b6060815260200190600190039081610d215790505b50905060005b8451811015610edc57848181518110610d5757610d57611811565b60200260200101516020015151600014158015610d935750848181518110610d8157610d81611811565b60200260200101516000015151600014155b610dd85760405162461bcd60e51b8152602060048201526016602482015275496e76616c69642063727970746f63757272656e637960501b6044820152606401610261565b858181518110610dea57610dea611811565b6020026020010151600003610e535760405162461bcd60e51b815260206004820152602960248201527f416c6c20726f6f742073756d732073686f756c642062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610261565b848181518110610e6557610e65611811565b602002602001015160000151838281518110610e8357610e83611811565b6020026020010181905250848181518110610ea057610ea0611811565b602002602001015160200151828281518110610ebe57610ebe611811565b60200260200101819052508080610ed49061198c565b915050610d3c565b5060408051608081018252878152602080820188815282840186905260608301859052600087815260048352939093208251815592518051929392610f2792600185019201906110ca565b5060408201518051610f43916002840191602090910190611115565b5060608201518051610f5f916003840191602090910190611115565b50905050827f88bfc7389cb831ea0208ff106da6f5c9f88036ba084f1eb008d2788d3d45998d878787604051610f9793929190611a89565b60405180910390a2505050505050565b610faf611020565b6001600160a01b0381166110145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610261565b61101d8161107a565b50565b6000546001600160a01b031633146105125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610261565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215611105579160200282015b828111156111055782518255916020019190600101906110ea565b50611111929150611167565b5090565b82805482825590600052602060002090810192821561115b579160200282015b8281111561115b578251829061114b90826118cc565b5091602001919060010190611135565b5061111192915061117c565b5b808211156111115760008155600101611168565b808211156111115760006111908282611199565b5060010161117c565b5080546111a590611827565b6000825580601f106111b5575050565b601f01602090049060005260206000209081019061101d9190611167565b6000602082840312156111e557600080fd5b5035919050565b60005b838110156112075781810151838201526020016111ef565b50506000910152565b600081518084526112288160208601602086016111ec565b601f01601f19169290920160200192915050565b60008151608084526112516080850182611210565b90506020830151848203602086015261126a8282611210565b915050604083015184820360408601526112848282611210565b9150506060830151848203606086015261129e8282611210565b95945050505050565b6020815260006112ba602083018461123c565b9392505050565b6080815260006112d46080830187611210565b82810360208401526112e68187611210565b905082810360408401526112fa8186611210565b9050828103606084015261130e8185611210565b979650505050505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561135257611352611319565b60405290565b6040805190810167ffffffffffffffff8111828210171561135257611352611319565b604051601f8201601f1916810167ffffffffffffffff811182821017156113a4576113a4611319565b604052919050565b600067ffffffffffffffff8211156113c6576113c6611319565b5060051b60200190565b600082601f8301126113e157600080fd5b813567ffffffffffffffff8111156113fb576113fb611319565b61140e601f8201601f191660200161137b565b81815284602083860101111561142357600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561145357600080fd5b823567ffffffffffffffff8082111561146b57600080fd5b818501915085601f83011261147f57600080fd5b813561149261148d826113ac565b61137b565b81815260059190911b830184019084810190888311156114b157600080fd5b8585015b83811015611592578035858111156114cc57600080fd5b86016080818c03601f190112156114e35760008081fd5b6114eb61132f565b88820135878111156114fd5760008081fd5b61150b8d8b838601016113d0565b825250604080830135888111156115225760008081fd5b6115308e8c838701016113d0565b8b84015250606080840135898111156115495760008081fd5b6115578f8d838801016113d0565b838501525060808401359150888211156115715760008081fd5b61157f8e8c848701016113d0565b90830152508452509186019186016114b5565b5098975050505050505050565b600082601f8301126115b057600080fd5b813560206115c061148d836113ac565b82815260059290921b840181019181810190868411156115df57600080fd5b8286015b848110156115fa57803583529183019183016115e3565b509695505050505050565b60008060006060848603121561161a57600080fd5b833567ffffffffffffffff8082111561163257600080fd5b61163e878388016113d0565b9450602086013591508082111561165457600080fd5b506116618682870161159f565b925050604084013590509250925092565b6000806000806080858703121561168857600080fd5b84359350602085013567ffffffffffffffff808211156116a757600080fd5b6116b38883890161159f565b945060408701359150808211156116c957600080fd5b818701915087601f8301126116dd57600080fd5b6116ea61148d83356113ac565b82358082526020808301929160051b8501018a81111561170957600080fd5b602085015b818110156117a557848135111561172457600080fd5b803586016040818e03601f1901121561173c57600080fd5b611744611358565b60208201358781111561175657600080fd5b6117658f6020838601016113d0565b82525060408201358781111561177a57600080fd5b6117898f6020838601016113d0565b602083015250808652505060208401935060208101905061170e565b50979a969950976060013596505050505050565b6000602082840312156117cb57600080fd5b81356001600160a01b03811681146112ba57600080fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561180b5761180b6117e2565b92915050565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061183b57607f821691505b60208210810361185b57634e487b7160e01b600052602260045260246000fd5b50919050565b600082516118738184602087016111ec565b9190910192915050565b601f8211156118c757600081815260208120601f850160051c810160208610156118a45750805b601f850160051c820191505b818110156118c3578281556001016118b0565b5050505b505050565b815167ffffffffffffffff8111156118e6576118e6611319565b6118fa816118f48454611827565b8461187d565b602080601f83116001811461192f57600084156119175750858301515b600019600386901b1c1916600185901b1785556118c3565b600085815260208120601f198616915b8281101561195e5788860151825594840194600190910190840161193f565b508582101561197c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161199e5761199e6117e2565b5060010190565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156119fa57603f198886030184526119e885835161123c565b945092850192908501906001016119cc565b5092979650505050505050565b600081518084526020808501945080840160005b83811015611a3757815187529582019590820190600101611a1b565b509495945050505050565b604081526000611a556040830185611a07565b828103602084015261129e8185611210565b600060208284031215611a7957600080fd5b815180151581146112ba57600080fd5b83815260006020606081840152611aa36060840186611a07565b6040848203818601528186518084528484019150848160051b85010185890160005b83811015611b1557868303601f1901855281518051878552611ae988860182611210565b918a0151858303868c0152919050611b018183611210565b968a01969450505090870190600101611ac5565b50909b9a505050505050505050505056fea264697066735822122045d9336f0b6314796496c7a1cf160c19b42a61943a90fb5bbe2cfcef107bb5db64736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file +{"_format":"hh-sol-artifact-1","contractName":"Summa","sourceName":"src/Summa.sol","abi":[{"inputs":[{"internalType":"address","name":"_verificationKey","type":"address"},{"internalType":"contract IVerifier","name":"_polynomialEncodingVerifier","type":"address"},{"internalType":"uint16","name":"currenciesCount","type":"uint16"},{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"indexed":false,"internalType":"struct Summa.AddressOwnershipProof[]","name":"addressOwnershipProofs","type":"tuple[]"}],"name":"AddressOwnershipProofSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"proof","type":"bytes"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"chain","type":"string"}],"indexed":false,"internalType":"struct Summa.Cryptocurrency[]","name":"cryptocurrencies","type":"tuple[]"}],"name":"LiabilitiesCommitmentSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressOwnershipProofs","outputs":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"bytes","name":"proof","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint16","name":"currenciesCount","type":"uint16"},{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"addressHash","type":"bytes32"}],"name":"getAddressOwnershipProof","outputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"chain","type":"string"}],"internalType":"struct Summa.Cryptocurrency[]","name":"cryptocurrencies","type":"tuple[]"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"submitCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof[]","name":"_addressOwnershipProofs","type":"tuple[]"}],"name":"submitProofOfAddressOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verificationKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"bytecode":"0x60a06040523480156200001157600080fd5b5060405162001bcf38038062001bcf8339810160408190526200003491620001d7565b6200003f336200016e565b6001600160a01b0384166200009b5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420766572696679696e67206b6579206164647265737300000060448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b03868116919091179091558316620001205760405162461bcd60e51b815260206004820152602c60248201527f496e76616c696420706f6c796e6f6d69616c20656e636f64696e67207665726960448201526b66696572206164647265737360a01b606482015260840162000092565b6001600160a01b039092166080526040805180820190915261ffff90911680825260ff9092166020909101819052600180546201000090920262ffffff19909216909217179055506200024a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620001d457600080fd5b50565b60008060008060808587031215620001ee57600080fd5b8451620001fb81620001be565b60208601519094506200020e81620001be565b604086015190935061ffff811681146200022757600080fd5b606086015190925060ff811681146200023f57600080fd5b939692955090935050565b6080516119696200026660003960006105e701526119696000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80637ddc907d116100665780637ddc907d1461013e5780638da5cb5b14610169578063a3c4bcf81461017a578063c7ddca0e1461019d578063f2fde38b146101b057600080fd5b806319b33968146100a357806343f9ec07146100cc57806349ce8997146100e1578063715018a61461010157806379502c5514610109575b600080fd5b6100b66100b13660046110b3565b6101c3565b6040516100c39190611187565b60405180910390f35b6100df6100da3660046112c8565b6104db565b005b6100f46100ef3660046110b3565b610920565b6040516100c39190611403565b6100df6109be565b6001546101229061ffff81169062010000900460ff1682565b6040805161ffff909316835260ff9091166020830152016100c3565b600254610151906001600160a01b031681565b6040516001600160a01b0390911681526020016100c3565b6000546001600160a01b0316610151565b61018d6101883660046110b3565b6109d2565b6040516100c39493929190611416565b6100df6101ab36600461146e565b610c32565b6100df6101be3660046115c8565b610ed3565b6101ee6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600560205260409020546102455760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b60448201526064015b60405180910390fd5b60008281526005602052604090205460039061026390600190611607565b8154811061027357610273611620565b906000526020600020906004020160405180608001604052908160008201805461029c90611636565b80601f01602080910402602001604051908101604052809291908181526020018280546102c890611636565b80156103155780601f106102ea57610100808354040283529160200191610315565b820191906000526020600020905b8154815290600101906020018083116102f857829003601f168201915b5050505050815260200160018201805461032e90611636565b80601f016020809104026020016040519081016040528092919081815260200182805461035a90611636565b80156103a75780601f1061037c576101008083540402835291602001916103a7565b820191906000526020600020905b81548152906001019060200180831161038a57829003601f168201915b505050505081526020016002820180546103c090611636565b80601f01602080910402602001604051908101604052809291908181526020018280546103ec90611636565b80156104395780601f1061040e57610100808354040283529160200191610439565b820191906000526020600020905b81548152906001019060200180831161041c57829003601f168201915b5050505050815260200160038201805461045290611636565b80601f016020809104026020016040519081016040528092919081815260200182805461047e90611636565b80156104cb5780601f106104a0576101008083540402835291602001916104cb565b820191906000526020600020905b8154815290600101906020018083116104ae57829003601f168201915b5050505050815250509050919050565b6104e3610f4c565b82516115001461052c5760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840e0e4dedecc40d8cadccee8d60631b604482015260640161023c565b600082511161058b5760405162461bcd60e51b815260206004820152602560248201527f43727970746f63757272656e63696573206c6973742063616e6e6f7420626520604482015264656d70747960d81b606482015260840161023c565b604080516001808252818301909252600091602080830190803683370190505090506001816000815181106105c2576105c2611620565b602090810291909101015260025460405163af83a18d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263af83a18d9261062492919091169088908690600401611670565b602060405180830381865afa158015610641573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066591906116d6565b6106a15760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161023c565b6000835167ffffffffffffffff8111156106bd576106bd6111a1565b6040519080825280602002602001820160405280156106f057816020015b60608152602001906001900390816106db5790505b5090506000845167ffffffffffffffff81111561070f5761070f6111a1565b60405190808252806020026020018201604052801561074257816020015b606081526020019060019003908161072d5790505b50905060005b855181101561086d5785818151811061076357610763611620565b6020026020010151602001515160001415801561079f575085818151811061078d5761078d611620565b60200260200101516000015151600014155b6107e45760405162461bcd60e51b8152602060048201526016602482015275496e76616c69642063727970746f63757272656e637960501b604482015260640161023c565b8581815181106107f6576107f6611620565b60200260200101516000015183828151811061081457610814611620565b602002602001018190525085818151811061083157610831611620565b60200260200101516020015182828151811061084f5761084f611620565b60200260200101819052508080610865906116f8565b915050610748565b506040805160608101825287815260208082018590528183018490526000878152600490915291909120815181906108a59082611760565b5060208281015180516108be9260018501920190610ff6565b50604082015180516108da916002840191602090910190610ff6565b50905050837f2b16813e2ba6c759e7f19e9a8ae9f18dc303e5b86eebc77a8d5c869d75eafdd28787604051610910929190611820565b60405180910390a2505050505050565b60046020526000908152604090208054819061093b90611636565b80601f016020809104026020016040519081016040528092919081815260200182805461096790611636565b80156109b45780601f10610989576101008083540402835291602001916109b4565b820191906000526020600020905b81548152906001019060200180831161099757829003601f168201915b5050505050905081565b6109c6610f4c565b6109d06000610fa6565b565b600381815481106109e257600080fd5b9060005260206000209060040201600091509050806000018054610a0590611636565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3190611636565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b505050505090806001018054610a9390611636565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90611636565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b505050505090806002018054610b2190611636565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4d90611636565b8015610b9a5780601f10610b6f57610100808354040283529160200191610b9a565b820191906000526020600020905b815481529060010190602001808311610b7d57829003601f168201915b505050505090806003018054610baf90611636565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdb90611636565b8015610c285780601f10610bfd57610100808354040283529160200191610c28565b820191906000526020600020905b815481529060010190602001808311610c0b57829003601f168201915b5050505050905084565b610c3a610f4c565b60005b8151811015610e98576000828281518110610c5a57610c5a611620565b602002602001015160000151604051602001610c7691906118b5565b60408051601f198184030181529181528151602092830120600081815260059093529120549091508015610cec5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c72656164792076657269666965640000000000000000604482015260640161023c565b6003848481518110610d0057610d00611620565b60209081029190910181015182546001810184556000938452919092208251600490920201908190610d329082611760565b5060208201516001820190610d479082611760565b5060408201516002820190610d5c9082611760565b5060608201516003820190610d719082611760565b5050600354600084815260056020526040902055508351849084908110610d9a57610d9a611620565b60200260200101516000015151600014158015610dd65750838381518110610dc457610dc4611620565b60200260200101516020015151600014155b8015610e015750838381518110610def57610def611620565b60200260200101516040015151600014155b8015610e2c5750838381518110610e1a57610e1a611620565b60200260200101516060015151600014155b610e835760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b606482015260840161023c565b50508080610e90906116f8565b915050610c3d565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a045465881604051610ec891906118d1565b60405180910390a150565b610edb610f4c565b6001600160a01b038116610f405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023c565b610f4981610fa6565b50565b6000546001600160a01b031633146109d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161023c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821561103c579160200282015b8281111561103c578251829061102c9082611760565b5091602001919060010190611016565b5061104892915061104c565b5090565b808211156110485760006110608282611069565b5060010161104c565b50805461107590611636565b6000825580601f10611085575050565b601f016020900490600052602060002090810190610f4991905b80821115611048576000815560010161109f565b6000602082840312156110c557600080fd5b5035919050565b60005b838110156110e75781810151838201526020016110cf565b50506000910152565b600081518084526111088160208601602086016110cc565b601f01601f19169290920160200192915050565b600081516080845261113160808501826110f0565b90506020830151848203602086015261114a82826110f0565b9150506040830151848203604086015261116482826110f0565b9150506060830151848203606086015261117e82826110f0565b95945050505050565b60208152600061119a602083018461111c565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156111da576111da6111a1565b60405290565b6040516080810167ffffffffffffffff811182821017156111da576111da6111a1565b604051601f8201601f1916810167ffffffffffffffff8111828210171561122c5761122c6111a1565b604052919050565b600082601f83011261124557600080fd5b813567ffffffffffffffff81111561125f5761125f6111a1565b611272601f8201601f1916602001611203565b81815284602083860101111561128757600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff8211156112be576112be6111a1565b5060051b60200190565b6000806000606084860312156112dd57600080fd5b833567ffffffffffffffff808211156112f557600080fd5b61130187838801611234565b945060209150818601358181111561131857600080fd5b8601601f8101881361132957600080fd5b803561133c611337826112a4565b611203565b81815260059190911b8201840190848101908a83111561135b57600080fd5b8584015b838110156113ec5780358681111561137657600080fd5b85016040818e03601f1901121561138d5760008081fd5b6113956111b7565b88820135888111156113a75760008081fd5b6113b58f8b83860101611234565b8252506040820135888111156113cb5760008081fd5b6113d98f8b83860101611234565b828b01525084525091860191860161135f565b50979a979950505050604095909501359450505050565b60208152600061119a60208301846110f0565b60808152600061142960808301876110f0565b828103602084015261143b81876110f0565b9050828103604084015261144f81866110f0565b9050828103606084015261146381856110f0565b979650505050505050565b6000602080838503121561148157600080fd5b823567ffffffffffffffff8082111561149957600080fd5b818501915085601f8301126114ad57600080fd5b81356114bb611337826112a4565b81815260059190911b830184019084810190888311156114da57600080fd5b8585015b838110156115bb578035858111156114f557600080fd5b86016080818c03601f1901121561150c5760008081fd5b6115146111e0565b88820135878111156115265760008081fd5b6115348d8b83860101611234565b8252506040808301358881111561154b5760008081fd5b6115598e8c83870101611234565b8b84015250606080840135898111156115725760008081fd5b6115808f8d83880101611234565b8385015250608084013591508882111561159a5760008081fd5b6115a88e8c84870101611234565b90830152508452509186019186016114de565b5098975050505050505050565b6000602082840312156115da57600080fd5b81356001600160a01b038116811461119a57600080fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561161a5761161a6115f1565b92915050565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061164a57607f821691505b60208210810361166a57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038416815260606020808301829052600091611695908401866110f0565b838103604085015284518082528286019183019060005b818110156116c8578351835292840192918401916001016116ac565b509098975050505050505050565b6000602082840312156116e857600080fd5b8151801515811461119a57600080fd5b60006001820161170a5761170a6115f1565b5060010190565b601f82111561175b57600081815260208120601f850160051c810160208610156117385750805b601f850160051c820191505b8181101561175757828155600101611744565b5050505b505050565b815167ffffffffffffffff81111561177a5761177a6111a1565b61178e816117888454611636565b84611711565b602080601f8311600181146117c357600084156117ab5750858301515b600019600386901b1c1916600185901b178555611757565b600085815260208120601f198616915b828110156117f2578886015182559484019460019091019084016117d3565b50858210156118105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006040808352611833818401866110f0565b6020848203818601528186518084528284019150828160051b85010183890160005b838110156118a557868303601f19018552815180518985526118798a8601826110f0565b91880151858303868a015291905061189181836110f0565b968801969450505090850190600101611855565b50909a9950505050505050505050565b600082516118c78184602087016110cc565b9190910192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561192657603f1988860301845261191485835161111c565b945092850192908501906001016118f8565b509297965050505050505056fea26469706673582212200ed4ad21f905c376a3c27857f45ee78009a7f56fe814b973cbb8d8e3de91f77b64736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80637ddc907d116100665780637ddc907d1461013e5780638da5cb5b14610169578063a3c4bcf81461017a578063c7ddca0e1461019d578063f2fde38b146101b057600080fd5b806319b33968146100a357806343f9ec07146100cc57806349ce8997146100e1578063715018a61461010157806379502c5514610109575b600080fd5b6100b66100b13660046110b3565b6101c3565b6040516100c39190611187565b60405180910390f35b6100df6100da3660046112c8565b6104db565b005b6100f46100ef3660046110b3565b610920565b6040516100c39190611403565b6100df6109be565b6001546101229061ffff81169062010000900460ff1682565b6040805161ffff909316835260ff9091166020830152016100c3565b600254610151906001600160a01b031681565b6040516001600160a01b0390911681526020016100c3565b6000546001600160a01b0316610151565b61018d6101883660046110b3565b6109d2565b6040516100c39493929190611416565b6100df6101ab36600461146e565b610c32565b6100df6101be3660046115c8565b610ed3565b6101ee6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600560205260409020546102455760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b60448201526064015b60405180910390fd5b60008281526005602052604090205460039061026390600190611607565b8154811061027357610273611620565b906000526020600020906004020160405180608001604052908160008201805461029c90611636565b80601f01602080910402602001604051908101604052809291908181526020018280546102c890611636565b80156103155780601f106102ea57610100808354040283529160200191610315565b820191906000526020600020905b8154815290600101906020018083116102f857829003601f168201915b5050505050815260200160018201805461032e90611636565b80601f016020809104026020016040519081016040528092919081815260200182805461035a90611636565b80156103a75780601f1061037c576101008083540402835291602001916103a7565b820191906000526020600020905b81548152906001019060200180831161038a57829003601f168201915b505050505081526020016002820180546103c090611636565b80601f01602080910402602001604051908101604052809291908181526020018280546103ec90611636565b80156104395780601f1061040e57610100808354040283529160200191610439565b820191906000526020600020905b81548152906001019060200180831161041c57829003601f168201915b5050505050815260200160038201805461045290611636565b80601f016020809104026020016040519081016040528092919081815260200182805461047e90611636565b80156104cb5780601f106104a0576101008083540402835291602001916104cb565b820191906000526020600020905b8154815290600101906020018083116104ae57829003601f168201915b5050505050815250509050919050565b6104e3610f4c565b82516115001461052c5760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840e0e4dedecc40d8cadccee8d60631b604482015260640161023c565b600082511161058b5760405162461bcd60e51b815260206004820152602560248201527f43727970746f63757272656e63696573206c6973742063616e6e6f7420626520604482015264656d70747960d81b606482015260840161023c565b604080516001808252818301909252600091602080830190803683370190505090506001816000815181106105c2576105c2611620565b602090810291909101015260025460405163af83a18d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263af83a18d9261062492919091169088908690600401611670565b602060405180830381865afa158015610641573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066591906116d6565b6106a15760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161023c565b6000835167ffffffffffffffff8111156106bd576106bd6111a1565b6040519080825280602002602001820160405280156106f057816020015b60608152602001906001900390816106db5790505b5090506000845167ffffffffffffffff81111561070f5761070f6111a1565b60405190808252806020026020018201604052801561074257816020015b606081526020019060019003908161072d5790505b50905060005b855181101561086d5785818151811061076357610763611620565b6020026020010151602001515160001415801561079f575085818151811061078d5761078d611620565b60200260200101516000015151600014155b6107e45760405162461bcd60e51b8152602060048201526016602482015275496e76616c69642063727970746f63757272656e637960501b604482015260640161023c565b8581815181106107f6576107f6611620565b60200260200101516000015183828151811061081457610814611620565b602002602001018190525085818151811061083157610831611620565b60200260200101516020015182828151811061084f5761084f611620565b60200260200101819052508080610865906116f8565b915050610748565b506040805160608101825287815260208082018590528183018490526000878152600490915291909120815181906108a59082611760565b5060208281015180516108be9260018501920190610ff6565b50604082015180516108da916002840191602090910190610ff6565b50905050837f2b16813e2ba6c759e7f19e9a8ae9f18dc303e5b86eebc77a8d5c869d75eafdd28787604051610910929190611820565b60405180910390a2505050505050565b60046020526000908152604090208054819061093b90611636565b80601f016020809104026020016040519081016040528092919081815260200182805461096790611636565b80156109b45780601f10610989576101008083540402835291602001916109b4565b820191906000526020600020905b81548152906001019060200180831161099757829003601f168201915b5050505050905081565b6109c6610f4c565b6109d06000610fa6565b565b600381815481106109e257600080fd5b9060005260206000209060040201600091509050806000018054610a0590611636565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3190611636565b8015610a7e5780601f10610a5357610100808354040283529160200191610a7e565b820191906000526020600020905b815481529060010190602001808311610a6157829003601f168201915b505050505090806001018054610a9390611636565b80601f0160208091040260200160405190810160405280929190818152602001828054610abf90611636565b8015610b0c5780601f10610ae157610100808354040283529160200191610b0c565b820191906000526020600020905b815481529060010190602001808311610aef57829003601f168201915b505050505090806002018054610b2190611636565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4d90611636565b8015610b9a5780601f10610b6f57610100808354040283529160200191610b9a565b820191906000526020600020905b815481529060010190602001808311610b7d57829003601f168201915b505050505090806003018054610baf90611636565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdb90611636565b8015610c285780601f10610bfd57610100808354040283529160200191610c28565b820191906000526020600020905b815481529060010190602001808311610c0b57829003601f168201915b5050505050905084565b610c3a610f4c565b60005b8151811015610e98576000828281518110610c5a57610c5a611620565b602002602001015160000151604051602001610c7691906118b5565b60408051601f198184030181529181528151602092830120600081815260059093529120549091508015610cec5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c72656164792076657269666965640000000000000000604482015260640161023c565b6003848481518110610d0057610d00611620565b60209081029190910181015182546001810184556000938452919092208251600490920201908190610d329082611760565b5060208201516001820190610d479082611760565b5060408201516002820190610d5c9082611760565b5060608201516003820190610d719082611760565b5050600354600084815260056020526040902055508351849084908110610d9a57610d9a611620565b60200260200101516000015151600014158015610dd65750838381518110610dc457610dc4611620565b60200260200101516020015151600014155b8015610e015750838381518110610def57610def611620565b60200260200101516040015151600014155b8015610e2c5750838381518110610e1a57610e1a611620565b60200260200101516060015151600014155b610e835760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b606482015260840161023c565b50508080610e90906116f8565b915050610c3d565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a045465881604051610ec891906118d1565b60405180910390a150565b610edb610f4c565b6001600160a01b038116610f405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023c565b610f4981610fa6565b50565b6000546001600160a01b031633146109d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161023c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821561103c579160200282015b8281111561103c578251829061102c9082611760565b5091602001919060010190611016565b5061104892915061104c565b5090565b808211156110485760006110608282611069565b5060010161104c565b50805461107590611636565b6000825580601f10611085575050565b601f016020900490600052602060002090810190610f4991905b80821115611048576000815560010161109f565b6000602082840312156110c557600080fd5b5035919050565b60005b838110156110e75781810151838201526020016110cf565b50506000910152565b600081518084526111088160208601602086016110cc565b601f01601f19169290920160200192915050565b600081516080845261113160808501826110f0565b90506020830151848203602086015261114a82826110f0565b9150506040830151848203604086015261116482826110f0565b9150506060830151848203606086015261117e82826110f0565b95945050505050565b60208152600061119a602083018461111c565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156111da576111da6111a1565b60405290565b6040516080810167ffffffffffffffff811182821017156111da576111da6111a1565b604051601f8201601f1916810167ffffffffffffffff8111828210171561122c5761122c6111a1565b604052919050565b600082601f83011261124557600080fd5b813567ffffffffffffffff81111561125f5761125f6111a1565b611272601f8201601f1916602001611203565b81815284602083860101111561128757600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff8211156112be576112be6111a1565b5060051b60200190565b6000806000606084860312156112dd57600080fd5b833567ffffffffffffffff808211156112f557600080fd5b61130187838801611234565b945060209150818601358181111561131857600080fd5b8601601f8101881361132957600080fd5b803561133c611337826112a4565b611203565b81815260059190911b8201840190848101908a83111561135b57600080fd5b8584015b838110156113ec5780358681111561137657600080fd5b85016040818e03601f1901121561138d5760008081fd5b6113956111b7565b88820135888111156113a75760008081fd5b6113b58f8b83860101611234565b8252506040820135888111156113cb5760008081fd5b6113d98f8b83860101611234565b828b01525084525091860191860161135f565b50979a979950505050604095909501359450505050565b60208152600061119a60208301846110f0565b60808152600061142960808301876110f0565b828103602084015261143b81876110f0565b9050828103604084015261144f81866110f0565b9050828103606084015261146381856110f0565b979650505050505050565b6000602080838503121561148157600080fd5b823567ffffffffffffffff8082111561149957600080fd5b818501915085601f8301126114ad57600080fd5b81356114bb611337826112a4565b81815260059190911b830184019084810190888311156114da57600080fd5b8585015b838110156115bb578035858111156114f557600080fd5b86016080818c03601f1901121561150c5760008081fd5b6115146111e0565b88820135878111156115265760008081fd5b6115348d8b83860101611234565b8252506040808301358881111561154b5760008081fd5b6115598e8c83870101611234565b8b84015250606080840135898111156115725760008081fd5b6115808f8d83880101611234565b8385015250608084013591508882111561159a5760008081fd5b6115a88e8c84870101611234565b90830152508452509186019186016114de565b5098975050505050505050565b6000602082840312156115da57600080fd5b81356001600160a01b038116811461119a57600080fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561161a5761161a6115f1565b92915050565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061164a57607f821691505b60208210810361166a57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038416815260606020808301829052600091611695908401866110f0565b838103604085015284518082528286019183019060005b818110156116c8578351835292840192918401916001016116ac565b509098975050505050505050565b6000602082840312156116e857600080fd5b8151801515811461119a57600080fd5b60006001820161170a5761170a6115f1565b5060010190565b601f82111561175b57600081815260208120601f850160051c810160208610156117385750805b601f850160051c820191505b8181101561175757828155600101611744565b5050505b505050565b815167ffffffffffffffff81111561177a5761177a6111a1565b61178e816117888454611636565b84611711565b602080601f8311600181146117c357600084156117ab5750858301515b600019600386901b1c1916600185901b178555611757565b600085815260208120601f198616915b828110156117f2578886015182559484019460019091019084016117d3565b50858210156118105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006040808352611833818401866110f0565b6020848203818601528186518084528284019150828160051b85010183890160005b838110156118a557868303601f19018552815180518985526118798a8601826110f0565b91880151858303868a015291905061189181836110f0565b968801969450505090850190600101611855565b50909a9950505050505050505050565b600082516118c78184602087016110cc565b9190910192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561192657603f1988860301845261191485835161111c565b945092850192908501906001016118f8565b509297965050505050505056fea26469706673582212200ed4ad21f905c376a3c27857f45ee78009a7f56fe814b973cbb8d8e3de91f77b64736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/abi/VerifyingKey.json b/backend/src/contracts/abi/VerifyingKey.json new file mode 100644 index 00000000..aea60524 --- /dev/null +++ b/backend/src/contracts/abi/VerifyingKey.json @@ -0,0 +1 @@ +{"_format":"hh-sol-artifact-1","contractName":"Halo2VerifyingKey","sourceName":"src/VerifyingKey.sol","abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"}],"bytecode":"0x608060405234801561001057600080fd5b5060007f0f4282e55a789d94ea57d4e200623dabb7ea67c998749f0370c890ab9ee6883f815260116020527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f53608016040527f304cd1e79cfa5b0f054e981a27ed7706e7ea6b06a7f266ef8db819c179c2c3ea6060527f193586da872cdeff023d6ab2263a131b4780db8878be3c3b7f8f019c06fcb0fb6080527f299110e6835fd73731fb3ce6de87151988da403c265467a96b9cda0d7daa72e460a052600160c0528060e0528061010052806101205280610140526001610160526002610180527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101a0527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101c0527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6101e0527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610200527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d610220527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e610240527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145610260527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff610280527f1404a2d17cd02c8f9fd79d74ac73c67d1881e62c6af354fa74d235c5e37dacfe6102a0527f2c1e30781f735e7977820d4ca9145010e28dcc808ee0f1e976477289057b7aec6102c0527f1b20314062560deca1b1bada262dbe3352a521ea2ef8973476cb7ad6f588c59d6102e0527f244ac9f0848be84d5a85e3c4e62e2a371ac7be27d68202ef3fe79541021ab99d610300527f2b1f7e2148bfab601e68f2e8133b9d05c10a9526d686b356b761eaa3713a70ba610320527f013345ea09966b06e4ae7d7e2919ddbb6e3f7e645aea515375ed729bff644dc5610340527f27a7a66087a8c17b00ffb7fe9b76ba2199ca308bcb0ad100fa181886d6c9b936610360527f23bc951a3c4307384bdec5d61be122a19c933db3266d6327a472e5203a9f785a610380527f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746103a0527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e36103c0527f1d81e0b06dea11d9b7a7a64458db5e5eb2f5dbe107a81f0555738f613b9b7d786103e0527f081e3e59de4615b05fef48f591d1ea23cb32f0ee841157094c1b81b95cfdb9fa610400527f0c28e0db2e4decc2a36413620cdc36ae237ccbc1cd1168841c5375d2a79478ce610420527f17b5790a11fcde00f8acf7edc4328f37883aec0f5955f8a6f7764078edf3cd05610440527f284ac053d96a33fca69eca00e16eea75ad1bf008d2a742fc846ac73d17d46d73610460527f14f45666a26b8d472186dbf78e606a82891e0f122a54264418cfe2615003dfb9610480527f1c517c335ad634422ef2eb5f615926e875afa9e9c589abf528d315a8a586b22d6104a0527f1220b1b13c91e8115106144bc417d4d3e6a9de3fb70406e68b4a5fd8a92f43276104c0527f1be0972afecdd013ffa6a3acc18998619b8df7834273d89825bf1abd1f2023ab6104e0527e19ea072d6d49fbf164929a19a76d4421f33d47647ff62c7230133fba915307610500527f0f09c585dc376dd0d5962c76ae444dc1cc3de9780f4fbdd5105a7040500d60ba610520527f13587a1e4799ba72f1d95e47a4e377086b83e5189903566e7422119ed28eba596105405261056081f3fe","deployedBytecode":"0x6080604052600080fdfea2646970667358221220e7575f4fe6578c13d0383c6c5b39fe580d12eec30351ca05204f256d8400d7f564736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/deployments.json b/backend/src/contracts/deployments.json index 6896ec0c..303b1de3 100644 --- a/backend/src/contracts/deployments.json +++ b/backend/src/contracts/deployments.json @@ -1 +1 @@ -{"31337":{"address":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512"}} \ No newline at end of file +{"31337":{"address":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512"}} diff --git a/backend/src/contracts/generated/summa_contract.rs b/backend/src/contracts/generated/summa_contract.rs index dc13985c..f374da4c 100644 --- a/backend/src/contracts/generated/summa_contract.rs +++ b/backend/src/contracts/generated/summa_contract.rs @@ -11,7 +11,7 @@ pub use summa::*; )] pub mod summa { #[rustfmt::skip] - const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"contract IVerifier\",\"name\":\"_inclusionVerifier\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"uint16\",\"name\":\"mstLevels\",\"type\":\"uint16\",\"components\":[]},{\"internalType\":\"uint16\",\"name\":\"currenciesCount\",\"type\":\"uint16\",\"components\":[]},{\"internalType\":\"uint8\",\"name\":\"balanceByteRange\",\"type\":\"uint8\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"AddressOwnershipProofSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[],\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[],\"indexed\":false},{\"internalType\":\"uint256[]\",\"name\":\"rootBalances\",\"type\":\"uint256[]\",\"components\":[],\"indexed\":false},{\"internalType\":\"struct Summa.Cryptocurrency[]\",\"name\":\"cryptocurrencies\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"LiabilitiesCommitmentSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true}],\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"addressOwnershipProofs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"commitments\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"mstLevels\",\"type\":\"uint16\",\"components\":[]},{\"internalType\":\"uint16\",\"name\":\"currenciesCount\",\"type\":\"uint16\",\"components\":[]},{\"internalType\":\"uint8\",\"name\":\"balanceByteRange\",\"type\":\"uint8\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"addressHash\",\"type\":\"bytes32\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"getAddressOwnershipProof\",\"outputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof\",\"name\":\"\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"renounceOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"rootBalances\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"struct Summa.Cryptocurrency[]\",\"name\":\"cryptocurrencies\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]}]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitCommitment\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"_addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitProofOfAddressOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"transferOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"publicInputs\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifyInclusionProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]}]"; + const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_verificationKey\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"contract IVerifier\",\"name\":\"_polynomialEncodingVerifier\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"uint16\",\"name\":\"currenciesCount\",\"type\":\"uint16\",\"components\":[]},{\"internalType\":\"uint8\",\"name\":\"balanceByteRange\",\"type\":\"uint8\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"AddressOwnershipProofSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[],\"indexed\":true},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[],\"indexed\":false},{\"internalType\":\"struct Summa.Cryptocurrency[]\",\"name\":\"cryptocurrencies\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"LiabilitiesCommitmentSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true}],\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"addressOwnershipProofs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"commitments\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"currenciesCount\",\"type\":\"uint16\",\"components\":[]},{\"internalType\":\"uint8\",\"name\":\"balanceByteRange\",\"type\":\"uint8\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"addressHash\",\"type\":\"bytes32\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"getAddressOwnershipProof\",\"outputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof\",\"name\":\"\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"renounceOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"struct Summa.Cryptocurrency[]\",\"name\":\"cryptocurrencies\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]}]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitCommitment\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"_addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitProofOfAddressOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"transferOwnership\",\"outputs\":[]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verificationKey\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\",\"components\":[]}]}]"; ///The parsed JSON ABI of the contract. pub static SUMMA_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(|| ::ethers::core::utils::__serde_json::from_str(__ABI).expect("ABI is always valid")); @@ -41,15 +41,15 @@ pub mod summa { 81, 98, 0, - 28, - 249, + 27, + 207, 56, 3, 128, 98, 0, - 28, - 249, + 27, + 207, 131, 57, 129, @@ -67,7 +67,7 @@ pub mod summa { 98, 0, 1, - 16, + 215, 86, 91, 98, @@ -77,8 +77,8 @@ pub mod summa { 51, 98, 0, - 0, - 168, + 1, + 110, 86, 91, 96, @@ -89,105 +89,92 @@ pub mod summa { 160, 27, 3, - 147, - 144, - 147, + 132, 22, - 96, - 128, - 82, + 98, + 0, + 0, + 155, + 87, 96, 64, - 128, 81, + 98, + 70, + 27, + 205, 96, - 96, + 229, + 27, 129, - 1, - 130, - 82, - 97, - 255, - 255, - 147, - 132, - 22, - 128, - 130, 82, - 146, - 144, - 147, - 22, 96, 32, - 132, - 1, - 129, - 144, - 82, 96, - 255, - 144, - 148, - 22, - 146, - 1, + 4, 130, - 144, + 1, 82, 96, + 29, + 96, + 36, + 130, 1, - 128, - 84, - 99, - 255, - 255, - 255, - 255, - 25, - 22, - 144, - 145, - 23, - 98, - 1, + 82, + 127, + 73, + 110, + 118, + 97, + 108, + 105, + 100, + 32, + 118, + 101, + 114, + 105, + 102, + 121, + 105, + 110, + 103, + 32, + 107, + 101, + 121, + 32, + 97, + 100, + 100, + 114, + 101, + 115, + 115, + 0, 0, 0, - 144, - 147, - 2, - 146, - 144, - 146, - 23, 96, - 255, + 68, + 130, + 1, + 82, 96, - 32, - 27, - 25, - 22, 100, 1, - 0, - 0, - 0, - 0, - 144, + 91, + 96, + 64, + 81, + 128, 145, - 2, - 23, + 3, 144, - 85, - 98, - 0, - 1, - 129, - 86, + 253, 91, 96, - 0, + 2, 128, 84, 96, @@ -198,8 +185,7 @@ pub mod summa { 160, 27, 3, - 131, - 129, + 25, 22, 96, 1, @@ -209,112 +195,117 @@ pub mod summa { 160, 27, 3, - 25, - 131, - 22, + 134, 129, - 23, - 132, - 85, - 96, - 64, - 81, - 145, - 144, - 146, 22, - 146, - 131, 145, - 127, - 139, - 224, - 7, - 156, - 83, - 22, - 89, - 20, - 19, - 68, - 205, - 31, - 208, - 164, - 242, - 132, - 25, - 73, - 127, - 151, - 34, - 163, - 218, - 175, - 227, - 180, - 24, - 111, - 107, - 100, - 87, - 224, + 144, 145, + 23, 144, - 163, - 80, - 80, - 86, - 91, - 128, - 81, - 97, - 255, - 255, - 129, + 145, + 85, + 131, 22, - 129, - 20, 98, 0, 1, - 11, + 32, 87, 96, - 0, - 128, - 253, - 91, - 145, - 144, - 80, - 86, - 91, + 64, + 81, + 98, + 70, + 27, + 205, 96, - 0, - 128, + 229, + 27, + 129, + 82, 96, - 0, - 128, + 32, 96, - 128, - 133, - 135, - 3, - 18, - 21, - 98, - 0, + 4, + 130, 1, - 39, - 87, + 82, + 96, + 44, + 96, + 36, + 130, + 1, + 82, + 127, + 73, + 110, + 118, + 97, + 108, + 105, + 100, + 32, + 112, + 111, + 108, + 121, + 110, + 111, + 109, + 105, + 97, + 108, + 32, + 101, + 110, + 99, + 111, + 100, + 105, + 110, + 103, + 32, + 118, + 101, + 114, + 105, + 96, + 68, + 130, + 1, + 82, + 107, + 102, + 105, + 101, + 114, + 32, + 97, + 100, + 100, + 114, + 101, + 115, + 115, + 96, + 160, + 27, + 96, + 100, + 130, + 1, + 82, 96, + 132, + 1, + 98, 0, - 128, - 253, + 0, + 146, + 86, 91, - 132, - 81, 96, 1, 96, @@ -323,61 +314,164 @@ pub mod summa { 160, 27, 3, - 129, + 144, + 146, 22, - 129, - 20, - 98, - 0, - 1, - 63, - 87, 96, - 0, 128, - 253, - 91, - 147, - 80, - 98, - 0, + 82, + 96, + 64, + 128, + 81, + 128, + 130, 1, - 79, + 144, + 145, + 82, + 97, + 255, + 255, + 144, + 145, + 22, + 128, + 130, + 82, + 96, + 255, + 144, + 146, + 22, 96, 32, - 134, + 144, + 145, + 1, + 129, + 144, + 82, + 96, 1, + 128, + 84, 98, + 1, 0, 0, - 248, - 86, - 91, + 144, + 146, + 2, + 98, + 255, + 255, + 255, + 25, + 144, + 146, + 22, + 144, 146, + 23, + 23, + 144, + 85, 80, 98, 0, + 2, + 74, + 86, + 91, + 96, + 0, + 128, + 84, + 96, 1, - 95, 96, - 64, - 134, 1, - 98, - 0, - 0, - 248, - 86, - 91, + 96, + 160, + 27, + 3, + 131, + 129, + 22, + 96, + 1, + 96, + 1, + 96, + 160, + 27, + 3, + 25, + 131, + 22, + 129, + 23, + 132, + 85, + 96, + 64, + 81, 145, + 144, + 146, + 22, + 146, + 131, + 145, + 127, + 139, + 224, + 7, + 156, + 83, + 22, + 89, + 20, + 19, + 68, + 205, + 31, + 208, + 164, + 242, + 132, + 25, + 73, + 127, + 151, + 34, + 163, + 218, + 175, + 227, + 180, + 24, + 111, + 107, + 100, + 87, + 224, + 145, + 144, + 163, 80, + 80, + 86, + 91, 96, + 1, 96, - 133, 1, - 81, 96, - 255, + 160, + 27, + 3, 129, 22, 129, @@ -385,47 +479,154 @@ pub mod summa { 98, 0, 1, - 118, + 212, 87, 96, 0, 128, 253, 91, - 147, - 150, - 146, - 149, - 80, - 144, - 147, - 80, 80, 86, 91, 96, + 0, 128, - 81, + 96, + 0, + 128, + 96, + 128, + 133, + 135, + 3, + 18, + 21, + 98, + 0, + 1, + 238, + 87, + 96, + 0, + 128, + 253, + 91, + 132, + 81, + 98, + 0, + 1, + 251, + 129, + 98, + 0, + 1, + 190, + 86, + 91, + 96, + 32, + 134, + 1, + 81, + 144, + 148, + 80, + 98, + 0, + 2, + 14, + 129, + 98, + 0, + 1, + 190, + 86, + 91, + 96, + 64, + 134, + 1, + 81, + 144, + 147, + 80, 97, - 27, - 92, + 255, + 255, + 129, + 22, + 129, + 20, 98, 0, + 2, + 39, + 87, + 96, + 0, + 128, + 253, + 91, + 96, + 96, + 134, 1, - 157, + 81, + 144, + 146, + 80, + 96, + 255, + 129, + 22, + 129, + 20, + 98, + 0, + 2, + 63, + 87, + 96, + 0, + 128, + 253, + 91, + 147, + 150, + 146, + 149, + 80, + 144, + 147, + 80, + 80, + 86, + 91, + 96, + 128, + 81, + 97, + 25, + 105, + 98, + 0, + 2, + 102, 96, 0, 57, 96, 0, 97, - 11, - 91, + 5, + 231, 1, 82, 97, - 27, - 92, + 25, + 105, 96, 0, 243, @@ -464,10 +665,10 @@ pub mod summa { 28, 128, 99, - 163, - 196, - 188, - 248, + 125, + 220, + 144, + 125, 17, 97, 0, @@ -475,47 +676,47 @@ pub mod summa { 87, 128, 99, - 163, - 196, - 188, - 248, + 125, + 220, + 144, + 125, 20, 97, 1, - 105, + 62, 87, 128, 99, - 199, - 221, - 202, - 14, + 141, + 165, + 203, + 91, 20, 97, 1, - 140, + 105, 87, 128, 99, - 200, - 229, - 129, - 71, + 163, + 196, + 188, + 248, 20, 97, 1, - 159, + 122, 87, 128, 99, - 218, - 100, - 167, - 80, + 199, + 221, + 202, + 14, 20, 97, 1, - 194, + 157, 87, 128, 99, @@ -526,7 +727,7 @@ pub mod summa { 20, 97, 1, - 213, + 176, 87, 96, 0, @@ -546,6 +747,17 @@ pub mod summa { 87, 128, 99, + 67, + 249, + 236, + 7, + 20, + 97, + 0, + 204, + 87, + 128, + 99, 73, 206, 137, @@ -553,7 +765,7 @@ pub mod summa { 20, 97, 0, - 204, + 225, 87, 128, 99, @@ -563,8 +775,8 @@ pub mod summa { 166, 20, 97, - 0, - 250, + 1, + 1, 87, 128, 99, @@ -575,18 +787,7 @@ pub mod summa { 20, 97, 1, - 4, - 87, - 128, - 99, - 141, - 165, - 203, - 91, - 20, - 97, - 1, - 78, + 9, 87, 91, 96, @@ -604,13 +805,13 @@ pub mod summa { 96, 4, 97, - 17, - 211, + 16, + 179, 86, 91, 97, 1, - 232, + 195, 86, 91, 96, @@ -622,8 +823,8 @@ pub mod summa { 145, 144, 97, - 18, - 167, + 17, + 135, 86, 91, 96, @@ -637,7 +838,7 @@ pub mod summa { 91, 97, 0, - 236, + 223, 97, 0, 218, @@ -645,88 +846,80 @@ pub mod summa { 96, 4, 97, - 17, - 211, + 18, + 200, 86, 91, - 96, + 97, 4, - 96, - 32, - 82, - 96, + 219, + 86, + 91, 0, - 144, - 129, - 82, + 91, + 97, + 0, + 244, + 97, + 0, + 239, + 54, 96, - 64, - 144, + 4, + 97, + 16, + 179, + 86, + 91, + 97, + 9, 32, - 84, - 129, 86, 91, 96, 64, 81, - 144, - 129, - 82, - 96, - 32, - 1, 97, 0, 195, + 145, + 144, + 97, + 20, + 3, 86, 91, 97, - 1, - 2, - 97, - 5, 0, + 223, + 97, + 9, + 190, 86, 91, - 0, - 91, 96, 1, 84, 97, 1, - 42, + 34, 144, 97, 255, 255, - 128, - 130, - 22, - 145, - 98, - 1, - 0, - 0, 129, - 4, - 144, - 145, 22, 144, - 100, + 98, 1, 0, 0, - 0, - 0, 144, 4, 96, 255, 22, - 131, + 130, 86, 91, 96, @@ -736,29 +929,21 @@ pub mod summa { 97, 255, 255, - 148, - 133, - 22, - 129, - 82, - 147, 144, - 146, + 147, 22, - 96, - 32, - 132, - 1, + 131, 82, 96, 255, - 22, 144, - 130, + 145, + 22, + 96, + 32, + 131, 1, 82, - 96, - 96, 1, 97, 0, @@ -766,8 +951,24 @@ pub mod summa { 86, 91, 96, - 0, + 2, 84, + 97, + 1, + 81, + 144, + 96, + 1, + 96, + 1, + 96, + 160, + 27, + 3, + 22, + 129, + 86, + 91, 96, 64, 81, @@ -792,23 +993,40 @@ pub mod summa { 195, 86, 91, + 96, + 0, + 84, + 96, + 1, + 96, + 1, + 96, + 160, + 27, + 3, + 22, 97, 1, - 124, + 81, + 86, + 91, 97, 1, - 119, + 141, + 97, + 1, + 136, 54, 96, 4, 97, - 17, - 211, + 16, + 179, 86, 91, 97, - 5, - 20, + 9, + 210, 86, 91, 96, @@ -823,105 +1041,51 @@ pub mod summa { 145, 144, 97, - 18, - 193, - 86, - 91, - 97, - 1, - 2, - 97, - 1, - 154, - 54, - 96, - 4, - 97, 20, - 64, - 86, - 91, - 97, - 7, - 116, - 86, - 91, - 97, - 1, - 178, - 97, - 1, - 173, - 54, - 96, - 4, - 97, 22, - 5, - 86, - 91, - 97, - 10, - 21, 86, 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, 97, 0, - 195, - 86, - 91, - 97, - 1, - 2, + 223, 97, 1, - 208, + 171, 54, 96, 4, 97, - 22, - 114, + 20, + 110, 86, 91, 97, - 11, - 219, + 12, + 50, 86, 91, 97, - 1, - 2, + 0, + 223, 97, 1, - 227, + 190, 54, 96, 4, 97, - 23, - 185, + 21, + 200, 86, 91, 97, - 15, - 167, + 14, + 211, 86, 91, 97, - 2, - 19, + 1, + 238, 96, 64, 81, @@ -968,7 +1132,7 @@ pub mod summa { 129, 82, 96, - 3, + 5, 96, 32, 82, @@ -979,7 +1143,7 @@ pub mod summa { 84, 97, 2, - 106, + 69, 87, 96, 64, @@ -1055,7 +1219,7 @@ pub mod summa { 129, 82, 96, - 3, + 5, 96, 32, 82, @@ -1065,18 +1229,18 @@ pub mod summa { 32, 84, 96, - 2, + 3, 144, 97, 2, - 136, + 99, 144, 96, 1, 144, 97, - 23, - 248, + 22, + 7, 86, 91, 129, @@ -1085,14 +1249,14 @@ pub mod summa { 16, 97, 2, - 152, + 115, 87, 97, 2, - 152, + 115, 97, - 24, - 17, + 22, + 32, 86, 91, 144, @@ -1129,11 +1293,11 @@ pub mod summa { 84, 97, 2, - 193, + 156, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, @@ -1173,26 +1337,26 @@ pub mod summa { 84, 97, 2, - 237, + 200, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, 21, 97, 3, - 58, + 21, 87, 128, 96, 31, 16, 97, - 3, - 15, + 2, + 234, 87, 97, 1, @@ -1211,7 +1375,7 @@ pub mod summa { 145, 97, 3, - 58, + 21, 86, 91, 130, @@ -1244,8 +1408,8 @@ pub mod summa { 131, 17, 97, - 3, - 29, + 2, + 248, 87, 130, 144, @@ -1275,11 +1439,11 @@ pub mod summa { 84, 97, 3, - 83, + 46, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, @@ -1319,18 +1483,18 @@ pub mod summa { 84, 97, 3, - 127, + 90, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, 21, 97, 3, - 204, + 167, 87, 128, 96, @@ -1338,7 +1502,7 @@ pub mod summa { 16, 97, 3, - 161, + 124, 87, 97, 1, @@ -1357,7 +1521,7 @@ pub mod summa { 145, 97, 3, - 204, + 167, 86, 91, 130, @@ -1391,7 +1555,7 @@ pub mod summa { 17, 97, 3, - 175, + 138, 87, 130, 144, @@ -1421,11 +1585,11 @@ pub mod summa { 84, 97, 3, - 229, + 192, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, @@ -1464,19 +1628,19 @@ pub mod summa { 128, 84, 97, - 4, - 17, + 3, + 236, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, 21, 97, 4, - 94, + 57, 87, 128, 96, @@ -1484,7 +1648,7 @@ pub mod summa { 16, 97, 4, - 51, + 14, 87, 97, 1, @@ -1503,7 +1667,7 @@ pub mod summa { 145, 97, 4, - 94, + 57, 86, 91, 130, @@ -1537,7 +1701,7 @@ pub mod summa { 17, 97, 4, - 65, + 28, 87, 130, 144, @@ -1567,11 +1731,11 @@ pub mod summa { 84, 97, 4, - 119, + 82, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, @@ -1611,18 +1775,18 @@ pub mod summa { 84, 97, 4, - 163, + 126, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, 21, 97, 4, - 240, + 203, 87, 128, 96, @@ -1630,7 +1794,7 @@ pub mod summa { 16, 97, 4, - 197, + 160, 87, 97, 1, @@ -1649,7 +1813,7 @@ pub mod summa { 145, 97, 4, - 240, + 203, 86, 91, 130, @@ -1683,7 +1847,7 @@ pub mod summa { 17, 97, 4, - 211, + 174, 87, 130, 144, @@ -1712,806 +1876,769 @@ pub mod summa { 86, 91, 97, - 5, - 8, + 4, + 227, 97, - 16, - 32, + 15, + 76, 86, 91, + 130, + 81, 97, - 5, - 18, - 96, + 21, 0, - 97, - 16, - 122, - 86, - 91, - 86, - 91, - 96, - 2, - 129, - 129, - 84, - 129, - 16, + 20, 97, 5, - 36, + 44, 87, 96, - 0, - 128, - 253, - 91, - 144, + 64, + 81, + 98, + 70, + 27, + 205, 96, - 0, + 229, + 27, + 129, 82, 96, 32, 96, - 0, - 32, - 144, - 96, 4, - 2, + 130, 1, + 82, 96, - 0, - 145, - 80, - 144, - 80, - 128, - 96, - 0, - 1, - 128, - 84, - 97, - 5, - 71, - 144, - 97, - 24, - 39, - 86, - 91, - 128, + 20, 96, - 31, + 36, + 130, 1, + 82, + 115, + 9, + 45, + 206, + 204, + 45, + 141, + 44, + 132, + 14, + 14, + 77, + 237, + 236, + 196, + 13, + 140, + 173, + 204, + 238, + 141, 96, - 32, - 128, - 145, - 4, - 2, - 96, - 32, - 1, + 99, + 27, 96, - 64, - 81, - 144, - 129, + 68, + 130, 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, 82, 96, - 32, + 100, 1, - 130, - 128, - 84, - 97, - 5, - 115, - 144, 97, - 24, - 39, + 2, + 60, 86, 91, - 128, - 21, - 97, - 5, - 192, - 87, - 128, 96, - 31, - 16, + 0, + 130, + 81, + 17, 97, 5, - 149, + 139, 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, 96, - 32, - 1, - 145, - 97, - 5, - 192, - 86, - 91, - 130, - 1, - 145, - 144, + 64, + 81, + 98, + 70, + 27, + 205, 96, - 0, + 229, + 27, + 129, 82, 96, 32, 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, + 4, + 130, 1, - 144, + 82, 96, - 32, - 1, - 128, - 131, - 17, - 97, - 5, - 163, - 87, - 130, - 144, - 3, + 37, 96, - 31, - 22, + 36, 130, 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 128, - 96, - 1, - 1, - 128, - 84, - 97, - 5, - 213, - 144, + 82, + 127, + 67, + 114, + 121, + 112, + 116, + 111, + 99, + 117, + 114, + 114, + 101, + 110, + 99, + 105, + 101, + 115, + 32, + 108, + 105, + 115, + 116, + 32, + 99, 97, - 24, - 39, - 86, - 91, - 128, - 96, - 31, - 1, - 96, + 110, + 110, + 111, + 116, 32, - 128, - 145, - 4, - 2, - 96, + 98, + 101, 32, - 1, 96, - 64, - 81, - 144, - 129, + 68, + 130, 1, - 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, - 129, 82, + 100, + 101, + 109, + 112, + 116, + 121, 96, - 32, - 1, + 216, + 27, + 96, + 100, 130, - 128, - 84, - 97, - 6, 1, - 144, + 82, + 96, + 132, + 1, 97, - 24, - 39, + 2, + 60, 86, 91, - 128, - 21, - 97, - 6, - 78, - 87, - 128, 96, - 31, - 16, - 97, - 6, - 35, - 87, - 97, - 1, - 0, + 64, 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, + 81, 96, - 32, 1, - 145, - 97, - 6, - 78, - 86, - 91, + 128, 130, + 82, + 129, + 131, 1, - 145, 144, - 96, - 0, + 146, 82, 96, - 32, - 96, 0, - 32, - 144, - 91, - 129, - 84, - 129, - 82, - 144, - 96, - 1, - 1, - 144, + 145, 96, 32, - 1, 128, 131, - 17, - 97, - 6, - 49, - 87, - 130, + 1, 144, - 3, - 96, - 31, - 22, - 130, + 128, + 54, + 131, + 55, 1, - 145, - 91, - 80, - 80, - 80, + 144, 80, 80, 144, - 128, + 80, 96, - 2, 1, - 128, - 84, + 129, + 96, + 0, + 129, + 81, + 129, + 16, 97, - 6, - 99, - 144, + 5, + 194, + 87, 97, - 24, - 39, + 5, + 194, + 97, + 22, + 32, 86, 91, - 128, - 96, - 31, - 1, 96, 32, - 128, - 145, - 4, + 144, + 129, 2, - 96, - 32, + 145, + 144, + 145, + 1, 1, + 82, + 96, + 2, + 84, 96, 64, 81, - 144, - 129, - 1, + 99, + 175, + 131, + 161, + 141, 96, - 64, - 82, - 128, - 146, - 145, - 144, - 129, + 224, + 27, 129, 82, 96, - 32, 1, - 130, - 128, - 84, - 97, - 6, - 143, - 144, - 97, - 24, - 39, - 86, - 91, - 128, - 21, - 97, - 6, - 220, - 87, - 128, 96, - 31, - 16, - 97, - 6, - 177, - 87, - 97, 1, + 96, + 160, + 27, + 3, + 127, 0, - 128, - 131, - 84, - 4, - 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 129, + 22, + 146, + 99, + 175, 131, - 82, - 145, - 96, - 32, - 1, - 145, + 161, + 141, + 146, 97, 6, - 220, - 86, - 91, - 130, - 1, + 36, + 146, 145, 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, + 145, + 22, 144, - 91, - 129, - 84, - 129, - 82, + 136, + 144, + 134, 144, 96, + 4, 1, - 1, - 144, + 97, + 22, + 112, + 86, + 91, 96, 32, - 1, + 96, + 64, + 81, 128, 131, - 17, + 3, + 129, + 134, + 90, + 250, + 21, + 128, + 21, 97, 6, - 191, + 65, 87, - 130, - 144, - 3, + 61, 96, - 31, - 22, - 130, - 1, - 145, + 0, + 128, + 62, + 61, + 96, + 0, + 253, 91, 80, 80, 80, 80, - 80, - 144, - 128, 96, - 3, - 1, - 128, - 84, - 97, - 6, - 241, - 144, - 97, - 24, - 39, - 86, - 91, - 128, + 64, + 81, + 61, 96, 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, + 25, 96, - 32, + 31, + 130, 1, - 96, - 64, - 81, - 144, - 129, + 22, + 130, 1, + 128, 96, 64, 82, - 128, - 146, - 145, - 144, - 129, + 80, 129, - 82, - 96, - 32, 1, - 130, - 128, - 84, + 144, 97, - 7, - 29, + 6, + 101, + 145, 144, 97, - 24, - 39, + 22, + 214, 86, 91, - 128, - 21, - 97, - 7, - 106, - 87, - 128, - 96, - 31, - 16, 97, - 7, - 63, + 6, + 161, 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, 96, - 32, - 1, - 145, - 97, - 7, - 106, - 86, - 91, - 130, - 1, - 145, - 144, + 64, + 81, + 98, + 70, + 27, + 205, 96, - 0, + 229, + 27, + 129, 82, 96, 32, 96, - 0, - 32, - 144, - 91, - 129, - 84, - 129, + 4, + 130, + 1, 82, - 144, 96, - 1, - 1, - 144, + 13, 96, - 32, + 36, + 130, 1, - 128, - 131, - 17, - 97, - 7, - 77, - 87, - 130, - 144, - 3, + 82, + 108, + 36, + 183, + 59, + 48, + 182, + 52, + 178, + 16, + 56, + 57, + 55, + 183, + 179, 96, - 31, - 22, + 153, + 27, + 96, + 68, 130, 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, - 80, - 132, - 86, - 91, - 97, - 7, - 124, + 82, + 96, + 100, + 1, 97, - 16, - 32, + 2, + 60, 86, 91, 96, 0, - 91, - 129, + 131, 81, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, 129, - 16, + 17, 21, 97, - 9, - 218, - 87, - 96, - 0, - 130, - 130, - 129, - 81, - 129, - 16, - 97, - 7, - 156, + 6, + 189, 87, 97, - 7, - 156, + 6, + 189, 97, - 24, 17, + 161, 86, 91, 96, + 64, + 81, + 144, + 128, + 130, + 82, + 128, + 96, 32, 2, 96, 32, 1, + 130, 1, - 81, 96, - 0, + 64, + 82, + 128, + 21, + 97, + 6, + 240, + 87, + 129, + 96, + 32, 1, - 81, + 91, 96, - 64, - 81, + 96, + 129, + 82, 96, 32, 1, + 144, + 96, + 1, + 144, + 3, + 144, + 129, 97, - 7, - 184, - 145, + 6, + 219, + 87, 144, + 80, + 91, + 80, + 144, + 80, + 96, + 0, + 132, + 81, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 21, 97, - 24, + 7, + 15, + 87, + 97, + 7, + 15, 97, + 17, + 161, 86, 91, 96, 64, - 128, 81, + 144, + 128, + 130, + 82, + 128, 96, - 31, - 25, - 129, - 132, - 3, + 32, + 2, + 96, + 32, 1, - 129, - 82, - 145, - 129, + 130, + 1, + 96, + 64, 82, + 128, + 21, + 97, + 7, + 66, + 87, 129, - 81, 96, 32, - 146, - 131, 1, - 32, + 91, + 96, 96, - 0, - 129, 129, 82, 96, + 32, + 1, + 144, + 96, + 1, + 144, 3, 144, - 147, - 82, - 145, - 32, - 84, + 129, + 97, + 7, + 45, + 87, 144, - 145, 80, - 128, + 91, + 80, + 144, + 80, + 96, + 0, + 91, + 133, + 81, + 129, + 16, 21, 97, 8, - 46, + 109, 87, - 96, - 64, + 133, + 129, + 129, 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, 129, - 82, + 16, + 97, + 7, + 99, + 87, + 97, + 7, + 99, + 97, + 22, + 32, + 86, + 91, 96, 32, + 2, 96, - 4, - 130, + 32, 1, - 82, + 1, + 81, 96, - 24, + 32, + 1, + 81, + 81, + 96, + 0, + 20, + 21, + 128, + 21, + 97, + 7, + 159, + 87, + 80, + 133, + 129, + 129, + 81, + 129, + 16, + 97, + 7, + 141, + 87, + 97, + 7, + 141, + 97, + 22, + 32, + 86, + 91, + 96, + 32, + 2, + 96, + 32, + 1, + 1, + 81, + 96, + 0, + 1, + 81, + 81, + 96, + 0, + 20, + 21, + 91, + 97, + 7, + 228, + 87, + 96, + 64, + 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, + 129, + 82, + 96, + 32, + 96, + 4, + 130, + 1, + 82, + 96, + 22, 96, 36, 130, 1, 82, - 127, - 65, - 100, - 100, - 114, - 101, - 115, - 115, - 32, + 117, + 73, + 110, + 118, 97, 108, - 114, - 101, - 97, + 105, 100, - 121, 32, - 118, - 101, + 99, + 114, + 121, + 112, + 116, + 111, + 99, + 117, + 114, 114, - 105, - 102, - 105, 101, - 100, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 110, + 99, + 121, + 96, + 80, + 27, 96, 68, 130, @@ -2522,701 +2649,777 @@ pub mod summa { 1, 97, 2, - 97, + 60, 86, 91, - 96, - 2, - 132, - 132, + 133, + 129, 129, 81, 129, 16, 97, - 8, - 66, + 7, + 246, 87, 97, - 8, - 66, + 7, + 246, 97, - 24, - 17, + 22, + 32, 86, 91, 96, 32, - 144, - 129, 2, - 145, - 144, - 145, - 1, - 129, - 1, - 81, - 130, - 84, 96, + 32, 1, - 129, 1, - 132, - 85, + 81, 96, 0, - 147, - 132, - 82, - 145, - 144, - 146, - 32, + 1, + 81, + 131, 130, + 129, 81, - 96, - 4, - 144, - 146, - 2, - 1, - 144, 129, - 144, + 16, 97, 8, - 116, - 144, - 130, + 20, + 87, 97, - 24, - 204, + 8, + 20, + 97, + 22, + 32, 86, 91, - 80, 96, 32, - 130, - 1, - 81, + 2, 96, + 32, 1, - 130, 1, + 129, 144, + 82, + 80, + 133, + 129, + 129, + 81, + 129, + 16, 97, 8, - 137, - 144, - 130, + 49, + 87, 97, - 24, - 204, + 8, + 49, + 97, + 22, + 32, 86, 91, - 80, 96, - 64, - 130, + 32, + 2, + 96, + 32, + 1, 1, 81, 96, - 2, - 130, + 32, 1, - 144, + 81, + 130, + 130, + 129, + 81, + 129, + 16, 97, 8, - 158, - 144, - 130, + 79, + 87, 97, - 24, - 204, + 8, + 79, + 97, + 22, + 32, 86, 91, - 80, 96, + 32, + 2, 96, - 130, + 32, 1, - 81, - 96, - 3, - 130, 1, + 129, 144, + 82, + 80, + 128, + 128, 97, 8, - 179, + 101, 144, - 130, 97, - 24, - 204, + 22, + 248, 86, 91, + 145, + 80, 80, + 97, + 7, + 72, + 86, + 91, 80, 96, - 2, - 84, + 64, + 128, + 81, 96, - 0, - 132, + 96, + 129, + 1, + 130, + 82, + 135, 129, 82, 96, - 3, - 96, 32, - 82, - 96, - 64, + 128, + 130, + 1, + 133, 144, - 32, - 85, - 80, + 82, + 129, 131, - 81, + 1, 132, 144, - 132, + 82, + 96, + 0, + 135, + 129, + 82, + 96, + 4, + 144, + 145, + 82, + 145, 144, + 145, + 32, 129, - 16, - 97, - 8, - 220, - 87, + 81, + 129, + 144, 97, 8, - 220, + 165, + 144, + 130, 97, - 24, - 17, + 23, + 96, 86, 91, + 80, 96, 32, - 2, + 130, + 129, + 1, + 81, + 128, + 81, + 97, + 8, + 190, + 146, 96, - 32, 1, + 133, 1, - 81, + 146, + 1, + 144, + 97, + 15, + 246, + 86, + 91, + 80, 96, - 0, + 64, + 130, 1, 81, + 128, 81, + 97, + 8, + 218, + 145, 96, - 0, - 20, - 21, - 128, - 21, + 2, + 132, + 1, + 145, + 96, + 32, + 144, + 145, + 1, + 144, 97, - 9, - 24, - 87, + 15, + 246, + 86, + 91, + 80, + 144, + 80, 80, 131, - 131, + 127, + 43, + 22, 129, + 62, + 43, + 166, + 199, + 89, + 231, + 241, + 158, + 154, + 138, + 233, + 241, + 141, + 195, + 3, + 229, + 184, + 110, + 235, + 199, + 122, + 141, + 92, + 134, + 157, + 117, + 234, + 253, + 210, + 135, + 135, + 96, + 64, 81, - 129, - 16, - 97, - 9, - 6, - 87, 97, 9, - 6, + 16, + 146, + 145, + 144, 97, 24, - 17, + 32, 86, 91, 96, - 32, - 2, - 96, - 32, - 1, - 1, + 64, 81, + 128, + 145, + 3, + 144, + 162, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 4, 96, 32, - 1, - 81, - 81, + 82, 96, 0, - 20, - 21, - 91, - 128, - 21, - 97, - 9, - 67, - 87, - 80, - 131, - 131, + 144, 129, - 81, + 82, + 96, + 64, + 144, + 32, + 128, + 84, 129, - 16, - 97, - 9, - 49, - 87, + 144, 97, 9, - 49, + 59, + 144, 97, - 24, - 17, + 22, + 54, 86, 91, + 128, + 96, + 31, + 1, 96, 32, + 128, + 145, + 4, 2, 96, 32, 1, - 1, - 81, 96, 64, - 1, - 81, 81, + 144, + 129, + 1, 96, - 0, - 20, - 21, + 64, + 82, + 128, + 146, + 145, + 144, + 129, + 129, + 82, + 96, + 32, + 1, + 130, + 128, + 84, + 97, + 9, + 103, + 144, + 97, + 22, + 54, + 86, 91, 128, 21, 97, 9, - 110, + 180, 87, - 80, - 131, - 131, - 129, - 81, - 129, + 128, + 96, + 31, 16, 97, 9, - 92, + 137, 87, 97, - 9, - 92, + 1, + 0, + 128, + 131, + 84, + 4, + 2, + 131, + 82, + 145, + 96, + 32, + 1, + 145, 97, - 24, - 17, + 9, + 180, 86, 91, + 130, + 1, + 145, + 144, + 96, + 0, + 82, 96, 32, - 2, 96, + 0, 32, + 144, + 91, + 129, + 84, + 129, + 82, + 144, + 96, 1, 1, - 81, + 144, 96, + 32, + 1, + 128, + 131, + 17, + 97, + 9, + 151, + 87, + 130, + 144, + 3, 96, + 31, + 22, + 130, 1, - 81, - 81, + 145, + 91, + 80, + 80, + 80, + 80, + 80, + 144, + 80, + 129, + 86, + 91, + 97, + 9, + 198, + 97, + 15, + 76, + 86, + 91, + 97, + 9, + 208, 96, 0, - 20, - 21, + 97, + 15, + 166, + 86, 91, + 86, + 91, + 96, + 3, + 129, + 129, + 84, + 129, + 16, 97, 9, - 197, + 226, 87, 96, - 64, - 81, - 98, - 70, - 27, - 205, + 0, + 128, + 253, + 91, + 144, 96, - 229, - 27, - 129, + 0, 82, 96, 32, 96, + 0, + 32, + 144, + 96, 4, - 130, + 2, 1, - 82, 96, - 34, + 0, + 145, + 80, + 144, + 80, + 128, 96, - 36, - 130, + 0, 1, - 82, - 127, - 73, - 110, - 118, + 128, + 84, 97, - 108, - 105, - 100, - 32, - 112, - 114, - 111, - 111, - 102, - 32, - 111, - 102, - 32, + 10, + 5, + 144, 97, - 100, - 100, - 114, - 101, - 115, - 115, - 32, - 111, - 119, - 110, - 101, - 114, - 115, - 104, + 22, + 54, + 86, + 91, + 128, 96, - 68, - 130, + 31, 1, - 82, - 97, - 6, - 151, 96, - 244, - 27, + 32, + 128, + 145, + 4, + 2, 96, - 100, - 130, + 32, + 1, + 96, + 64, + 81, + 144, + 129, 1, + 96, + 64, + 82, + 128, + 146, + 145, + 144, + 129, + 129, 82, 96, - 132, + 32, 1, + 130, + 128, + 84, 97, - 2, + 10, + 49, + 144, 97, + 22, + 54, 86, 91, - 80, - 80, 128, - 128, - 97, - 9, - 210, - 144, - 97, - 25, - 140, - 86, - 91, - 145, - 80, - 80, - 97, - 7, - 127, - 86, - 91, - 80, - 127, - 56, - 35, 21, - 212, - 213, - 106, - 96, - 53, - 225, - 137, - 155, - 255, - 231, - 125, - 155, - 236, - 239, - 175, - 95, - 38, - 80, - 228, - 50, - 59, - 39, - 133, - 72, - 87, - 160, - 69, - 70, - 88, - 129, - 96, - 64, - 81, 97, 10, - 10, - 145, - 144, - 97, - 25, - 165, - 86, - 91, - 96, - 64, - 81, + 126, + 87, 128, - 145, - 3, - 144, - 161, - 80, - 86, - 91, 96, - 0, - 130, - 96, - 1, - 129, - 81, - 129, + 31, 16, 97, 10, - 42, + 83, 87, 97, - 10, - 42, - 97, - 24, - 17, - 86, - 91, - 96, - 32, + 1, + 0, + 128, + 131, + 84, + 4, 2, + 131, + 82, + 145, 96, 32, 1, + 145, + 97, + 10, + 126, + 86, + 91, + 130, 1, - 81, - 96, - 4, + 145, + 144, 96, 0, - 132, - 129, 82, 96, 32, - 1, + 96, + 0, + 32, 144, + 91, + 129, + 84, 129, 82, + 144, 96, - 32, 1, + 1, + 144, 96, - 0, 32, - 96, - 0, 1, - 84, - 20, + 128, + 131, + 17, 97, 10, - 137, + 97, 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, - 82, - 96, - 32, - 96, - 4, 130, - 1, - 82, - 96, - 16, + 144, + 3, 96, - 36, + 31, + 22, 130, 1, - 82, - 111, - 18, - 91, - 157, - 152, + 145, 91, - 26, - 89, - 8, - 19, - 84, - 213, - 8, - 28, - 155, - 219, - 221, - 96, - 130, - 27, + 80, + 80, + 80, + 80, + 80, + 144, + 128, 96, - 68, - 130, 1, - 82, - 96, - 100, 1, - 97, - 2, - 97, - 86, - 91, - 96, - 2, - 91, - 131, - 81, - 129, - 16, - 21, - 97, - 11, - 67, - 87, - 131, - 129, - 129, - 81, - 129, - 16, - 97, - 10, - 167, - 87, + 128, + 84, 97, 10, - 167, + 147, + 144, 97, - 24, - 17, + 22, + 54, 86, 91, + 128, + 96, + 31, + 1, 96, 32, + 128, + 145, + 4, 2, 96, 32, 1, - 1, - 81, - 96, - 4, 96, - 0, - 133, + 64, + 81, + 144, 129, - 82, - 96, - 32, 1, + 96, + 64, + 82, + 128, + 146, + 145, 144, 129, + 129, 82, 96, 32, 1, - 96, - 0, - 32, - 96, - 1, - 1, - 96, - 2, - 131, + 130, + 128, + 84, 97, 10, - 210, - 145, + 191, 144, 97, - 23, - 248, + 22, + 54, 86, 91, - 129, - 84, - 129, + 128, + 21, + 97, + 11, + 12, + 87, + 128, + 96, + 31, 16, 97, 10, - 226, + 225, 87, 97, - 10, - 226, + 1, + 0, + 128, + 131, + 84, + 4, + 2, + 131, + 82, + 145, + 96, + 32, + 1, + 145, 97, - 24, - 17, + 11, + 12, 86, 91, + 130, + 1, + 145, 144, 96, 0, @@ -3226,329 +3429,444 @@ pub mod summa { 96, 0, 32, - 1, + 144, + 91, + 129, 84, - 20, - 97, - 11, - 49, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, 129, 82, + 144, + 96, + 1, + 1, + 144, 96, 32, + 1, + 128, + 131, + 17, + 97, + 10, + 239, + 87, + 130, + 144, + 3, 96, - 4, + 31, + 22, 130, 1, - 82, - 96, - 20, + 145, + 91, + 80, + 80, + 80, + 80, + 80, + 144, + 128, 96, - 36, - 130, + 2, 1, - 82, - 115, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 114, - 111, - 111, - 116, - 32, - 98, + 128, + 84, 97, - 108, + 11, + 33, + 144, 97, - 110, - 99, - 101, + 22, + 54, + 86, + 91, + 128, 96, + 31, + 1, 96, - 27, + 32, + 128, + 145, + 4, + 2, 96, - 68, - 130, + 32, + 1, + 96, + 64, + 81, + 144, + 129, 1, + 96, + 64, + 82, + 128, + 146, + 145, + 144, + 129, + 129, 82, 96, - 100, + 32, 1, + 130, + 128, + 84, 97, - 2, + 11, + 77, + 144, 97, + 22, + 54, 86, 91, 128, + 21, 97, 11, - 59, - 129, + 154, + 87, + 128, + 96, + 31, + 16, 97, - 25, - 140, - 86, - 91, + 11, + 111, + 87, + 97, + 1, + 0, + 128, + 131, + 84, + 4, + 2, + 131, + 82, + 145, + 96, + 32, + 1, 145, - 80, - 80, 97, - 10, - 140, + 11, + 154, 86, 91, - 80, + 130, + 1, + 145, + 144, 96, - 64, - 81, - 99, - 11, - 210, - 5, - 169, + 0, + 82, 96, - 228, - 27, + 32, + 96, + 0, + 32, + 144, + 91, + 129, + 84, 129, 82, + 144, 96, 1, - 96, 1, + 144, 96, - 160, - 27, + 32, + 1, + 128, + 131, + 17, + 97, + 11, + 125, + 87, + 130, + 144, 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 96, + 31, 22, + 130, + 1, + 145, + 91, + 80, + 80, + 80, + 80, + 80, 144, - 99, - 189, - 32, - 90, - 144, - 144, + 128, + 96, + 3, + 1, + 128, + 84, 97, 11, - 146, - 144, - 134, - 144, - 136, + 175, 144, - 96, - 4, - 1, 97, - 26, - 66, + 22, + 54, 86, 91, + 128, + 96, + 31, + 1, + 96, + 32, + 128, + 145, + 4, + 2, 96, 32, + 1, 96, 64, 81, + 144, + 129, + 1, + 96, + 64, + 82, 128, - 131, - 3, + 146, + 145, + 144, 129, - 134, - 90, - 250, - 21, + 129, + 82, + 96, + 32, + 1, + 130, 128, - 21, + 84, 97, 11, - 175, + 219, + 144, + 97, + 22, + 54, + 86, + 91, + 128, + 21, + 97, + 12, + 40, 87, - 61, - 96, - 0, 128, - 62, - 61, - 96, - 0, - 253, - 91, - 80, - 80, - 80, - 80, - 96, - 64, - 81, - 61, 96, 31, - 25, + 16, + 97, + 11, + 253, + 87, + 97, + 1, + 0, + 128, + 131, + 84, + 4, + 2, + 131, + 82, + 145, 96, - 31, - 130, + 32, 1, - 22, + 145, + 97, + 12, + 40, + 86, + 91, 130, 1, - 128, + 145, + 144, 96, - 64, + 0, 82, - 80, + 96, + 32, + 96, + 0, + 32, + 144, + 91, 129, + 84, + 129, + 82, + 144, + 96, + 1, 1, 144, + 96, + 32, + 1, + 128, + 131, + 17, 97, + 12, 11, - 211, - 145, + 87, + 130, 144, - 97, - 26, - 103, - 86, + 3, + 96, + 31, + 22, + 130, + 1, + 145, 91, - 148, - 147, 80, 80, 80, 80, + 80, + 144, + 80, + 132, 86, 91, 97, - 11, - 227, + 12, + 58, 97, - 16, - 32, + 15, + 76, 86, 91, - 131, 96, 0, - 3, + 91, + 129, + 81, + 129, + 16, + 21, 97, - 12, - 38, + 14, + 152, 87, 96, - 64, + 0, + 130, + 130, + 129, 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, 129, - 82, + 16, + 97, + 12, + 90, + 87, + 97, + 12, + 90, + 97, + 22, + 32, + 86, + 91, 96, 32, + 2, 96, - 4, - 130, + 32, 1, - 82, + 1, + 81, 96, - 16, - 96, - 36, - 130, + 0, 1, - 82, - 111, - 18, - 91, - 157, - 152, - 91, - 26, - 89, - 8, - 19, - 84, - 213, - 8, - 28, - 155, - 219, - 221, - 96, - 130, - 27, + 81, 96, - 68, - 130, - 1, - 82, + 64, + 81, 96, - 100, + 32, 1, 97, - 2, + 12, + 118, + 145, + 144, 97, + 24, + 181, 86, 91, + 96, + 64, + 128, + 81, + 96, + 31, + 25, + 129, + 132, + 3, + 1, + 129, + 82, + 145, + 129, + 82, 129, 81, + 96, + 32, + 146, 131, - 81, - 20, + 1, + 32, + 96, + 0, + 129, + 129, + 82, + 96, + 5, + 144, + 147, + 82, + 145, + 32, + 84, + 144, + 145, + 80, + 128, + 21, 97, 12, - 149, + 236, 87, 96, 64, @@ -3570,280 +3888,272 @@ pub mod summa { 1, 82, 96, - 53, + 24, 96, 36, 130, 1, 82, 127, - 82, - 111, - 111, - 116, - 32, - 108, - 105, - 97, - 98, - 105, - 108, - 105, - 116, - 105, + 65, + 100, + 100, + 114, 101, 115, - 32, - 115, - 117, - 109, 115, 32, 97, - 110, + 108, + 114, + 101, + 97, 100, + 121, 32, - 108, + 118, + 101, + 114, 105, - 97, - 98, + 102, 105, - 108, + 101, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 96, 68, 130, 1, 82, - 116, - 13, - 46, - 141, - 44, - 174, - 100, - 13, - 206, - 173, - 172, - 76, - 174, - 68, - 13, - 173, - 46, - 109, - 172, - 46, - 140, - 109, - 96, - 91, - 27, 96, 100, - 130, - 1, - 82, - 96, - 132, 1, 97, 2, - 97, + 60, 86, 91, 96, - 0, - 130, + 3, + 132, + 132, + 129, 81, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, 129, - 17, - 21, + 16, 97, - 12, - 177, + 13, + 0, 87, 97, - 12, - 177, + 13, + 0, 97, - 19, - 25, + 22, + 32, 86, 91, 96, - 64, - 81, - 144, - 128, - 130, - 82, - 128, - 96, 32, + 144, + 129, 2, - 96, - 32, + 145, + 144, + 145, 1, - 130, + 129, 1, + 81, + 130, + 84, 96, - 64, - 82, - 128, - 21, - 97, - 12, - 228, - 87, + 1, 129, - 96, - 32, 1, - 91, - 96, + 132, + 85, 96, - 129, + 0, + 147, + 132, 82, - 96, - 32, - 1, + 145, 144, + 146, + 32, + 130, + 81, 96, - 1, + 4, 144, - 3, + 146, + 2, + 1, 144, 129, + 144, 97, - 12, - 207, - 87, - 144, - 80, - 91, - 80, + 13, + 50, 144, + 130, + 97, + 23, + 96, + 86, + 91, 80, 96, - 0, - 131, + 32, + 130, + 1, 81, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 13, - 3, - 87, + 96, + 1, + 130, + 1, + 144, 97, 13, - 3, + 71, + 144, + 130, 97, - 19, - 25, + 23, + 96, 86, 91, + 80, 96, 64, + 130, + 1, 81, + 96, + 2, + 130, + 1, + 144, + 97, + 13, + 92, 144, - 128, 130, - 82, - 128, + 97, + 23, + 96, + 86, + 91, + 80, 96, - 32, - 2, 96, - 32, - 1, 130, 1, + 81, 96, - 64, - 82, - 128, - 21, + 3, + 130, + 1, + 144, 97, 13, - 54, - 87, - 129, + 113, + 144, + 130, + 97, + 23, 96, - 32, - 1, + 86, 91, + 80, + 80, 96, + 3, + 84, 96, + 0, + 132, 129, 82, 96, + 5, + 96, 32, - 1, - 144, + 82, 96, - 1, + 64, 144, - 3, + 32, + 85, + 80, + 131, + 81, + 132, + 144, + 132, 144, 129, + 16, 97, 13, - 33, + 154, 87, - 144, - 80, + 97, + 13, + 154, + 97, + 22, + 32, + 86, 91, - 80, - 144, - 80, + 96, + 32, + 2, + 96, + 32, + 1, + 1, + 81, 96, 0, - 91, - 132, + 1, 81, - 129, - 16, + 81, + 96, + 0, + 20, + 21, + 128, 21, 97, - 14, - 220, + 13, + 214, 87, - 132, - 129, + 80, + 131, + 131, 129, 81, 129, 16, 97, 13, - 87, + 196, 87, 97, 13, - 87, + 196, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -3863,29 +4173,30 @@ pub mod summa { 0, 20, 21, + 91, 128, 21, 97, - 13, - 147, + 14, + 1, 87, 80, - 132, - 129, + 131, + 131, 129, 81, 129, 16, 97, 13, - 129, + 239, 87, 97, 13, - 129, + 239, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -3897,7 +4208,50 @@ pub mod summa { 1, 81, 96, + 64, + 1, + 81, + 81, + 96, 0, + 20, + 21, + 91, + 128, + 21, + 97, + 14, + 44, + 87, + 80, + 131, + 131, + 129, + 81, + 129, + 16, + 97, + 14, + 26, + 87, + 97, + 14, + 26, + 97, + 22, + 32, + 86, + 91, + 96, + 32, + 2, + 96, + 32, + 1, + 1, + 81, + 96, + 96, 1, 81, 81, @@ -3907,8 +4261,8 @@ pub mod summa { 21, 91, 97, - 13, - 216, + 14, + 131, 87, 96, 64, @@ -3930,13 +4284,13 @@ pub mod summa { 1, 82, 96, - 22, + 34, 96, 36, 130, 1, 82, - 117, + 127, 73, 110, 118, @@ -3945,68 +4299,155 @@ pub mod summa { 105, 100, 32, - 99, - 114, - 121, 112, - 116, - 111, - 99, - 117, 114, + 111, + 111, + 102, + 32, + 111, + 102, + 32, + 97, + 100, + 100, 114, 101, + 115, + 115, + 32, + 111, + 119, 110, - 99, - 121, - 96, - 80, - 27, + 101, + 114, + 115, + 104, 96, 68, 130, 1, 82, + 97, + 6, + 151, + 96, + 244, + 27, 96, 100, + 130, + 1, + 82, + 96, + 132, 1, 97, 2, + 60, + 86, + 91, + 80, + 80, + 128, + 128, + 97, + 14, + 144, + 144, + 97, + 22, + 248, + 86, + 91, + 145, + 80, + 80, 97, + 12, + 61, 86, 91, + 80, + 127, + 56, + 35, + 21, + 212, + 213, + 106, + 96, + 53, + 225, + 137, + 155, + 255, + 231, + 125, + 155, + 236, + 239, + 175, + 95, + 38, + 80, + 228, + 50, + 59, + 39, 133, + 72, + 87, + 160, + 69, + 70, + 88, 129, - 129, + 96, + 64, 81, - 129, - 16, - 97, - 13, - 234, - 87, 97, - 13, - 234, + 14, + 200, + 145, + 144, 97, 24, - 17, + 209, 86, 91, 96, - 32, - 2, + 64, + 81, + 128, + 145, + 3, + 144, + 161, + 80, + 86, + 91, + 97, + 14, + 219, + 97, + 15, + 76, + 86, + 91, 96, - 32, 1, + 96, 1, - 81, 96, - 0, + 160, + 27, 3, + 129, + 22, 97, - 14, - 83, + 15, + 64, 87, 96, 64, @@ -4028,62 +4469,59 @@ pub mod summa { 1, 82, 96, - 41, + 38, 96, 36, 130, 1, 82, 127, - 65, - 108, + 79, + 119, + 110, + 97, + 98, 108, + 101, + 58, + 32, + 110, + 101, + 119, 32, - 114, - 111, 111, - 116, + 119, + 110, + 101, + 114, 32, - 115, - 117, - 109, + 105, 115, 32, - 115, + 116, 104, - 111, - 117, - 108, - 100, - 32, - 98, 101, 32, - 103, - 114, - 101, - 97, - 116, + 122, 101, 114, + 111, 32, + 97, 96, 68, 130, 1, 82, - 104, - 116, - 104, - 97, - 110, - 32, - 122, 101, + 100, + 100, 114, - 111, + 101, + 115, + 115, 96, - 184, + 208, 27, 96, 100, @@ -4095,1141 +4533,1245 @@ pub mod summa { 1, 97, 2, - 97, + 60, 86, 91, - 132, - 129, - 129, - 81, - 129, - 16, - 97, - 14, - 101, - 87, 97, - 14, - 101, + 15, + 73, + 129, 97, - 24, - 17, + 15, + 166, + 86, + 91, + 80, 86, 91, 96, - 32, - 2, + 0, + 84, 96, - 32, - 1, 1, - 81, 96, - 0, 1, - 81, - 131, - 130, - 129, - 81, - 129, - 16, + 96, + 160, + 27, + 3, + 22, + 51, + 20, 97, - 14, - 131, + 9, + 208, 87, - 97, - 14, - 131, - 97, - 24, - 17, - 86, - 91, 96, - 32, - 2, + 64, + 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, + 129, + 82, 96, 32, - 1, + 96, + 4, + 130, 1, 129, 144, 82, - 80, - 132, - 129, - 129, - 81, - 129, - 16, - 97, - 14, - 160, - 87, + 96, + 36, + 130, + 1, + 82, + 127, + 79, + 119, + 110, 97, - 14, - 160, + 98, + 108, + 101, + 58, + 32, + 99, 97, - 24, - 17, - 86, - 91, - 96, + 108, + 108, + 101, + 114, 32, - 2, - 96, + 105, + 115, 32, + 110, + 111, + 116, + 32, + 116, + 104, + 101, + 32, + 111, + 119, + 110, + 101, + 114, + 96, + 68, + 130, 1, - 1, - 81, + 82, 96, - 32, + 100, 1, - 81, - 130, - 130, - 129, - 81, - 129, - 16, - 97, - 14, - 190, - 87, - 97, - 14, - 190, 97, - 24, - 17, + 2, + 60, 86, 91, 96, - 32, - 2, + 0, + 128, + 84, 96, - 32, 1, + 96, 1, + 96, + 160, + 27, + 3, + 131, 129, + 22, + 96, + 1, + 96, + 1, + 96, + 160, + 27, + 3, + 25, + 131, + 22, + 129, + 23, + 132, + 85, + 96, + 64, + 81, + 145, 144, - 82, - 80, - 128, - 128, - 97, - 14, - 212, - 144, - 97, + 146, + 22, + 146, + 131, + 145, + 127, + 139, + 224, + 7, + 156, + 83, + 22, + 89, + 20, + 19, + 68, + 205, + 31, + 208, + 164, + 242, + 132, 25, - 140, - 86, - 91, + 73, + 127, + 151, + 34, + 163, + 218, + 175, + 227, + 180, + 24, + 111, + 107, + 100, + 87, + 224, 145, + 144, + 163, 80, 80, - 97, - 13, - 60, 86, 91, - 80, - 96, - 64, - 128, - 81, - 96, - 128, - 129, - 1, 130, - 82, - 135, - 129, - 82, - 96, - 32, 128, + 84, 130, - 1, - 136, - 129, - 82, 130, - 132, - 1, - 134, + 85, 144, - 82, 96, - 96, - 131, - 1, - 133, - 144, + 0, 82, 96, + 32, + 96, 0, - 135, + 32, + 144, 129, - 82, + 1, + 146, + 130, + 21, + 97, + 16, + 60, + 87, + 145, 96, - 4, - 131, - 82, - 147, - 144, - 147, 32, + 2, + 130, + 1, + 91, 130, - 81, 129, - 85, - 146, - 81, - 128, + 17, + 21, + 97, + 16, + 60, + 87, + 130, 81, - 146, - 147, - 146, + 130, + 144, 97, - 15, - 39, - 146, + 16, + 44, + 144, + 130, + 97, + 23, + 96, + 86, + 91, + 80, + 145, 96, + 32, 1, - 133, + 145, + 144, + 96, 1, - 146, 1, 144, 97, 16, - 202, + 22, 86, 91, 80, - 96, - 64, - 130, - 1, - 81, - 128, - 81, 97, - 15, - 67, - 145, - 96, - 2, - 132, - 1, - 145, - 96, - 32, - 144, + 16, + 72, + 146, 145, - 1, - 144, + 80, 97, - 17, - 21, + 16, + 76, 86, 91, 80, + 144, + 86, + 91, + 128, + 130, + 17, + 21, + 97, + 16, + 72, + 87, 96, + 0, + 97, + 16, 96, 130, - 1, - 81, - 128, - 81, + 130, 97, - 15, - 95, - 145, + 16, + 105, + 86, + 91, + 80, 96, - 3, - 132, 1, - 145, - 96, - 32, - 144, - 145, 1, - 144, 97, - 17, - 21, + 16, + 76, 86, 91, 80, - 144, - 80, - 80, - 130, - 127, - 136, - 191, - 199, - 56, - 156, - 184, - 49, - 234, - 2, - 8, - 255, - 16, - 109, - 166, - 245, - 201, - 248, 128, - 54, - 186, - 8, - 79, - 30, - 176, - 8, - 210, - 120, - 141, - 61, - 69, - 153, - 141, - 135, - 135, - 135, - 96, - 64, - 81, + 84, 97, - 15, - 151, - 147, - 146, - 145, + 16, + 117, 144, 97, - 26, - 137, + 22, + 54, 86, 91, 96, - 64, - 81, + 0, + 130, + 85, 128, - 145, - 3, - 144, - 162, - 80, - 80, - 80, - 80, + 96, + 31, + 16, + 97, + 16, + 133, + 87, 80, 80, 86, 91, + 96, + 31, + 1, + 96, + 32, + 144, + 4, + 144, + 96, + 0, + 82, + 96, + 32, + 96, + 0, + 32, + 144, + 129, + 1, + 144, 97, 15, - 175, + 73, + 145, + 144, + 91, + 128, + 130, + 17, + 21, 97, 16, - 32, - 86, - 91, + 72, + 87, 96, - 1, + 0, + 129, + 85, 96, 1, + 1, + 97, + 16, + 159, + 86, + 91, 96, - 160, - 27, + 0, + 96, + 32, + 130, + 132, 3, - 129, - 22, + 18, + 21, 97, 16, - 20, + 197, 87, 96, - 64, - 81, - 98, - 70, - 27, - 205, + 0, + 128, + 253, + 91, + 80, + 53, + 145, + 144, + 80, + 86, + 91, 96, - 229, - 27, + 0, + 91, + 131, + 129, + 16, + 21, + 97, + 16, + 231, + 87, 129, + 129, + 1, + 81, + 131, + 130, + 1, 82, 96, 32, + 1, + 97, + 16, + 207, + 86, + 91, + 80, + 80, 96, - 4, - 130, + 0, + 145, 1, 82, + 86, + 91, 96, - 38, - 96, - 36, - 130, - 1, + 0, + 129, + 81, + 128, + 132, 82, - 127, - 79, - 119, - 110, 97, - 98, - 108, - 101, - 58, - 32, - 110, - 101, - 119, - 32, - 111, - 119, - 110, - 101, - 114, - 32, - 105, - 115, - 32, - 116, - 104, - 101, + 17, + 8, + 129, + 96, 32, - 122, - 101, - 114, - 111, + 134, + 1, + 96, 32, + 134, + 1, 97, + 16, + 204, + 86, + 91, 96, - 68, - 130, + 31, 1, - 82, - 101, - 100, - 100, - 114, - 101, - 115, - 115, - 96, - 208, - 27, 96, - 100, - 130, + 31, + 25, + 22, + 146, + 144, + 146, 1, - 82, 96, - 132, + 32, 1, - 97, - 2, - 97, + 146, + 145, + 80, + 80, 86, 91, - 97, - 16, - 29, + 96, + 0, 129, + 81, + 96, + 128, + 132, + 82, + 97, + 17, + 49, + 96, + 128, + 133, + 1, + 130, 97, 16, - 122, + 240, 86, 91, + 144, 80, - 86, - 91, - 96, - 0, - 84, 96, + 32, + 131, 1, + 81, + 132, + 130, + 3, 96, + 32, + 134, 1, - 96, - 160, - 27, - 3, - 22, - 51, - 20, + 82, 97, - 5, - 18, - 87, + 17, + 74, + 130, + 130, + 97, + 16, + 240, + 86, + 91, + 145, + 80, + 80, 96, 64, + 131, + 1, 81, - 98, - 70, - 27, - 205, + 132, + 130, + 3, 96, - 229, - 27, - 129, + 64, + 134, + 1, 82, + 97, + 17, + 100, + 130, + 130, + 97, + 16, + 240, + 86, + 91, + 145, + 80, + 80, 96, - 32, 96, - 4, - 130, + 131, 1, - 129, - 144, - 82, - 96, - 36, + 81, + 132, 130, + 3, + 96, + 96, + 134, 1, 82, - 127, - 79, - 119, - 110, 97, - 98, - 108, - 101, - 58, - 32, - 99, + 17, + 126, + 130, + 130, 97, - 108, - 108, - 101, - 114, - 32, - 105, - 115, - 32, - 110, - 111, - 116, - 32, - 116, - 104, - 101, - 32, - 111, - 119, - 110, - 101, - 114, + 16, + 240, + 86, + 91, + 149, + 148, + 80, + 80, + 80, + 80, + 80, + 86, + 91, 96, - 68, - 130, - 1, + 32, + 129, 82, 96, - 100, - 1, + 0, 97, - 2, + 17, + 154, + 96, + 32, + 131, + 1, + 132, 97, + 17, + 28, + 86, + 91, + 147, + 146, + 80, + 80, + 80, 86, 91, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, 96, 0, - 128, - 84, + 82, 96, - 1, + 65, 96, - 1, + 4, + 82, 96, - 160, - 27, - 3, - 131, - 129, - 22, - 96, - 1, - 96, - 1, + 36, 96, - 160, - 27, - 3, - 25, - 131, - 22, - 129, - 23, - 132, - 85, + 0, + 253, + 91, 96, 64, + 128, 81, - 145, 144, - 146, - 22, - 146, - 131, - 145, - 127, - 139, - 224, - 7, - 156, - 83, - 22, - 89, - 20, - 19, - 68, - 205, - 31, - 208, - 164, - 242, - 132, - 25, - 73, - 127, - 151, - 34, - 163, + 129, + 1, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 130, + 130, + 16, + 23, + 21, + 97, + 17, 218, - 175, - 227, - 180, - 24, - 111, - 107, - 100, 87, - 224, - 145, - 144, - 163, - 80, - 80, + 97, + 17, + 218, + 97, + 17, + 161, 86, 91, - 130, - 128, - 84, - 130, - 130, - 85, - 144, 96, - 0, + 64, 82, + 144, + 86, + 91, 96, - 32, + 64, + 81, 96, - 0, - 32, - 144, + 128, 129, 1, - 146, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 130, 130, + 16, + 23, 21, 97, 17, - 5, + 218, 87, - 145, - 96, - 32, - 2, - 130, - 1, - 91, - 130, - 129, + 97, 17, - 21, + 218, 97, 17, - 5, - 87, - 130, + 161, + 86, + 91, + 96, + 64, 81, - 130, - 85, - 145, 96, - 32, + 31, + 130, 1, - 145, - 144, 96, + 31, + 25, + 22, + 129, 1, - 1, - 144, - 97, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 130, + 130, 16, - 234, - 86, - 91, - 80, + 23, + 21, 97, - 17, - 17, - 146, - 145, - 80, + 18, + 44, + 87, + 97, + 18, + 44, 97, 17, - 103, + 161, 86, 91, - 80, + 96, + 64, + 82, + 145, 144, + 80, 86, 91, - 130, - 128, - 84, - 130, - 130, - 85, - 144, 96, 0, - 82, - 96, - 32, + 130, 96, - 0, - 32, - 144, - 129, + 31, + 131, 1, - 146, - 130, - 21, + 18, 97, - 17, - 91, + 18, + 69, 87, - 145, 96, - 32, - 2, - 130, - 1, + 0, + 128, + 253, 91, - 130, + 129, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, 129, 17, 21, 97, - 17, - 91, + 18, + 95, 87, - 130, - 81, - 130, - 144, + 97, + 18, + 95, 97, 17, - 75, - 144, - 130, - 97, - 24, - 204, + 161, 86, 91, - 80, - 145, + 97, + 18, + 114, 96, - 32, + 31, + 130, 1, - 145, - 144, 96, + 31, + 25, + 22, + 96, + 32, 1, - 1, - 144, - 97, - 17, - 53, - 86, - 91, - 80, - 97, - 17, - 17, - 146, - 145, - 80, 97, - 17, - 124, + 18, + 3, 86, 91, - 91, - 128, - 130, + 129, + 129, + 82, + 132, + 96, + 32, + 131, + 134, + 1, + 1, 17, 21, 97, - 17, - 17, + 18, + 135, 87, 96, 0, + 128, + 253, + 91, 129, - 85, 96, + 32, + 133, + 1, + 96, + 32, + 131, 1, + 55, + 96, + 0, + 145, + 129, 1, - 97, - 17, - 104, + 96, + 32, + 1, + 145, + 144, + 145, + 82, + 147, + 146, + 80, + 80, + 80, 86, 91, - 128, + 96, + 0, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, 130, 17, 21, 97, - 17, - 17, + 18, + 190, 87, - 96, - 0, 97, - 17, - 144, - 130, - 130, + 18, + 190, 97, 17, - 153, + 161, 86, 91, 80, 96, + 5, + 27, + 96, + 32, 1, - 1, - 97, - 17, - 124, - 86, - 91, - 80, - 128, - 84, - 97, - 17, - 165, 144, - 97, - 24, - 39, 86, 91, 96, 0, - 130, - 85, 128, 96, - 31, - 16, - 97, - 17, - 181, - 87, - 80, - 80, - 86, - 91, - 96, - 31, - 1, - 96, - 32, - 144, - 4, - 144, - 96, 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 129, - 1, - 144, - 97, - 16, - 29, - 145, - 144, - 97, - 17, - 103, - 86, - 91, 96, - 0, 96, - 32, - 130, 132, + 134, 3, 18, 21, 97, - 17, - 229, + 18, + 221, 87, 96, 0, 128, 253, 91, - 80, - 53, - 145, - 144, - 80, - 86, - 91, - 96, - 0, - 91, 131, - 129, - 16, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 128, + 130, + 17, 21, 97, 18, - 7, + 245, 87, - 129, - 129, + 96, + 0, + 128, + 253, + 91, + 97, + 19, 1, - 81, + 135, 131, - 130, - 1, - 82, - 96, - 32, + 136, 1, 97, - 17, - 239, + 18, + 52, 86, 91, - 80, + 148, 80, 96, - 0, + 32, 145, + 80, + 129, + 134, 1, - 82, - 86, - 91, - 96, - 0, + 53, 129, - 81, - 128, - 132, - 82, - 97, - 18, - 40, 129, + 17, + 21, + 97, + 19, + 24, + 87, 96, - 32, - 134, + 0, + 128, + 253, + 91, + 134, 1, 96, - 32, - 134, + 31, + 129, 1, + 136, + 19, 97, - 17, - 236, + 19, + 41, + 87, + 96, + 0, + 128, + 253, + 91, + 128, + 53, + 97, + 19, + 60, + 97, + 19, + 55, + 130, + 97, + 18, + 164, 86, 91, + 97, + 18, + 3, + 86, + 91, + 129, + 129, + 82, 96, - 31, - 1, - 96, - 31, - 25, - 22, - 146, + 5, + 145, 144, - 146, + 145, + 27, + 130, 1, - 96, - 32, + 132, 1, - 146, - 145, - 80, - 80, - 86, + 144, + 132, + 129, + 1, + 144, + 138, + 131, + 17, + 21, + 97, + 19, 91, + 87, 96, 0, - 129, - 81, - 96, 128, + 253, + 91, + 133, 132, - 82, + 1, + 91, + 131, + 129, + 16, + 21, 97, - 18, - 81, + 19, + 236, + 87, + 128, + 53, + 134, + 129, + 17, + 21, + 97, + 19, + 118, + 87, 96, + 0, 128, + 253, + 91, 133, 1, - 130, - 97, + 96, + 64, + 129, + 142, + 3, + 96, + 31, + 25, + 1, 18, - 16, + 21, + 97, + 19, + 141, + 87, + 96, + 0, + 128, + 129, + 253, + 91, + 97, + 19, + 149, + 97, + 17, + 183, 86, 91, - 144, - 80, - 96, - 32, - 131, - 1, - 81, - 132, + 136, 130, - 3, + 1, + 53, + 136, + 129, + 17, + 21, + 97, + 19, + 167, + 87, 96, - 32, + 0, + 128, + 129, + 253, + 91, + 97, + 19, + 181, + 143, + 139, + 131, 134, 1, - 82, - 97, - 18, - 106, - 130, - 130, + 1, 97, 18, - 16, + 52, 86, 91, - 145, - 80, + 130, + 82, 80, 96, 64, - 131, - 1, - 81, - 132, 130, - 3, + 1, + 53, + 136, + 129, + 17, + 21, + 97, + 19, + 203, + 87, 96, - 64, + 0, + 128, + 129, + 253, + 91, + 97, + 19, + 217, + 143, + 139, + 131, 134, 1, - 82, - 97, - 18, - 132, - 130, - 130, + 1, 97, 18, - 16, + 52, 86, 91, - 145, + 130, + 139, + 1, + 82, 80, + 132, + 82, 80, - 96, - 96, - 131, + 145, + 134, 1, - 81, - 132, - 130, - 3, - 96, - 96, + 145, 134, 1, - 82, - 97, - 18, - 158, - 130, - 130, 97, - 18, - 16, + 19, + 95, 86, 91, - 149, - 148, 80, + 151, + 154, + 151, + 153, 80, 80, 80, 80, - 86, - 91, - 96, - 32, - 129, - 82, 96, - 0, + 64, + 149, + 144, + 149, + 1, + 53, + 148, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 32, + 129, + 82, + 96, + 0, 97, - 18, - 186, + 17, + 154, 96, 32, 131, 1, 132, 97, - 18, - 60, - 86, - 91, - 147, - 146, - 80, - 80, - 80, + 16, + 240, 86, 91, 96, @@ -5239,16 +5781,16 @@ pub mod summa { 96, 0, 97, - 18, - 212, + 20, + 41, 96, 128, 131, 1, 135, 97, - 18, 16, + 240, 86, 91, 130, @@ -5260,13 +5802,13 @@ pub mod summa { 1, 82, 97, - 18, - 230, + 20, + 59, 129, 135, 97, - 18, 16, + 240, 86, 91, 144, @@ -5280,13 +5822,13 @@ pub mod summa { 1, 82, 97, - 18, - 250, + 20, + 79, 129, 134, 97, - 18, 16, + 240, 86, 91, 144, @@ -5300,13 +5842,13 @@ pub mod summa { 1, 82, 97, - 19, - 14, + 20, + 99, 129, 133, 97, - 18, 16, + 240, 86, 91, 151, @@ -5320,35 +5862,27 @@ pub mod summa { 80, 86, 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, 96, 0, - 82, - 96, - 65, - 96, - 4, - 82, 96, - 36, + 32, + 128, + 131, + 133, + 3, + 18, + 21, + 97, + 20, + 129, + 87, 96, 0, + 128, 253, 91, - 96, - 64, - 81, - 96, - 128, - 129, - 1, + 130, + 53, 103, 255, 255, @@ -5358,258 +5892,317 @@ pub mod summa { 255, 255, 255, - 129, - 17, - 130, + 128, 130, - 16, - 23, + 17, 21, 97, - 19, - 82, + 20, + 153, 87, + 96, + 0, + 128, + 253, + 91, + 129, + 133, + 1, + 145, + 80, + 133, + 96, + 31, + 131, + 1, + 18, 97, - 19, - 82, + 20, + 173, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 97, + 20, + 187, 97, 19, - 25, + 55, + 130, + 97, + 18, + 164, 86, 91, - 96, - 64, + 129, + 129, 82, - 144, - 86, - 91, 96, - 64, - 128, - 81, + 5, + 145, 144, - 129, + 145, + 27, + 131, 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, + 132, + 1, + 144, + 132, 129, + 1, + 144, + 136, + 131, 17, - 130, - 130, - 16, - 23, 21, 97, - 19, - 82, + 20, + 218, 87, + 96, + 0, + 128, + 253, + 91, + 133, + 133, + 1, + 91, + 131, + 129, + 16, + 21, 97, - 19, - 82, + 21, + 187, + 87, + 128, + 53, + 133, + 129, + 17, + 21, 97, - 19, - 25, - 86, - 91, - 96, - 64, - 81, + 20, + 245, + 87, 96, - 31, - 130, + 0, + 128, + 253, + 91, + 134, 1, 96, + 128, + 129, + 140, + 3, + 96, 31, 25, - 22, - 129, 1, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 130, - 130, - 16, - 23, + 18, 21, 97, - 19, - 164, + 21, + 12, 87, - 97, - 19, - 164, - 97, - 19, - 25, - 86, - 91, 96, - 64, - 82, - 145, - 144, - 80, + 0, + 128, + 129, + 253, + 91, + 97, + 21, + 20, + 97, + 17, + 224, 86, 91, - 96, - 0, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, + 136, 130, + 1, + 53, + 135, + 129, 17, 21, 97, - 19, - 198, + 21, + 38, 87, - 97, - 19, - 198, - 97, - 19, - 25, - 86, - 91, - 80, 96, - 5, - 27, - 96, - 32, + 0, + 128, + 129, + 253, + 91, + 97, + 21, + 52, + 141, + 139, + 131, + 134, 1, - 144, + 1, + 97, + 18, + 52, 86, 91, - 96, - 0, 130, + 82, + 80, 96, - 31, + 64, + 128, 131, 1, - 18, + 53, + 136, + 129, + 17, + 21, 97, - 19, - 225, + 21, + 75, 87, 96, 0, 128, + 129, 253, 91, - 129, + 97, + 21, + 89, + 142, + 140, + 131, + 135, + 1, + 1, + 97, + 18, + 52, + 86, + 91, + 139, + 132, + 1, + 82, + 80, + 96, + 96, + 128, + 132, + 1, 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, + 137, 129, 17, 21, 97, - 19, - 251, + 21, + 114, 87, - 97, - 19, - 251, - 97, - 19, - 25, - 86, + 96, + 0, + 128, + 129, + 253, 91, 97, - 20, - 14, - 96, - 31, - 130, + 21, + 128, + 143, + 141, + 131, + 136, 1, - 96, - 31, - 25, - 22, - 96, - 32, 1, 97, - 19, - 123, + 18, + 52, 86, 91, - 129, - 129, - 82, - 132, - 96, - 32, 131, - 134, + 133, 1, + 82, + 80, + 96, + 128, + 132, 1, + 53, + 145, + 80, + 136, + 130, 17, 21, 97, - 20, - 35, + 21, + 154, 87, 96, 0, 128, + 129, 253, 91, - 129, - 96, - 32, - 133, + 97, + 21, + 168, + 142, + 140, + 132, + 135, 1, - 96, - 32, + 1, + 97, + 18, + 52, + 86, + 91, + 144, 131, 1, - 55, - 96, - 0, + 82, + 80, + 132, + 82, + 80, 145, - 129, - 1, - 96, - 32, + 134, 1, 145, - 144, - 145, - 82, - 147, - 146, + 134, + 1, + 97, + 20, + 222, + 86, + 91, + 80, + 152, + 151, + 80, + 80, + 80, + 80, + 80, 80, 80, 80, @@ -5619,341 +6212,260 @@ pub mod summa { 0, 96, 32, - 128, - 131, - 133, + 130, + 132, 3, 18, 21, 97, - 20, - 83, + 21, + 218, 87, 96, 0, 128, 253, 91, - 130, + 129, 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, - 130, - 17, - 21, - 97, - 20, - 107, - 87, 96, - 0, - 128, - 253, - 91, - 129, - 133, 1, - 145, - 80, - 133, 96, - 31, - 131, 1, - 18, - 97, + 96, + 160, + 27, + 3, + 129, + 22, + 129, 20, - 127, + 97, + 17, + 154, 87, 96, 0, 128, 253, 91, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, + 96, + 0, + 82, + 96, + 17, + 96, + 4, + 82, + 96, + 36, + 96, + 0, + 253, + 91, 129, - 53, + 129, + 3, + 129, + 129, + 17, + 21, 97, - 20, - 146, + 22, + 26, + 87, 97, - 20, - 141, - 130, + 22, + 26, 97, - 19, - 172, + 21, + 241, 86, 91, - 97, - 19, - 123, + 146, + 145, + 80, + 80, 86, 91, - 129, - 129, - 82, + 99, + 78, + 72, + 123, + 113, 96, - 5, - 145, - 144, - 145, + 224, 27, - 131, - 1, - 132, - 1, - 144, - 132, - 129, - 1, - 144, - 136, - 131, - 17, - 21, - 97, - 20, - 177, - 87, 96, 0, - 128, + 82, + 96, + 50, + 96, + 4, + 82, + 96, + 36, + 96, + 0, 253, 91, - 133, - 133, + 96, 1, - 91, - 131, 129, - 16, - 21, - 97, - 21, - 146, - 87, - 128, - 53, - 133, 129, - 17, - 21, + 28, + 144, + 130, + 22, + 128, 97, - 20, - 204, + 22, + 74, 87, 96, - 0, - 128, - 253, + 127, + 130, + 22, + 145, + 80, 91, - 134, - 1, 96, - 128, + 32, + 130, + 16, 129, - 140, 3, - 96, - 31, - 25, - 1, - 18, - 21, 97, - 20, - 227, + 22, + 106, 87, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, + 96, + 0, + 82, + 96, + 34, + 96, + 4, + 82, + 96, + 36, 96, 0, - 128, - 129, 253, 91, - 97, - 20, - 235, - 97, - 19, - 47, + 80, + 145, + 144, + 80, 86, 91, - 136, - 130, + 96, 1, - 53, - 135, + 96, + 1, + 96, + 160, + 27, + 3, + 132, + 22, 129, - 17, - 21, - 97, - 20, - 253, - 87, + 82, 96, - 0, + 96, + 96, + 32, 128, - 129, - 253, - 91, - 97, - 21, - 11, - 141, - 139, 131, - 134, 1, + 130, + 144, + 82, + 96, + 0, + 145, + 97, + 22, + 149, + 144, + 132, 1, + 134, 97, - 19, - 208, + 16, + 240, 86, 91, - 130, - 82, - 80, + 131, + 129, + 3, 96, 64, - 128, - 131, - 1, - 53, - 136, - 129, - 17, - 21, - 97, - 21, - 34, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 21, - 48, - 142, - 140, - 131, - 135, - 1, - 1, - 97, - 19, - 208, - 86, - 91, - 139, - 132, + 133, 1, 82, - 80, - 96, - 96, - 128, 132, + 81, + 128, + 130, + 82, + 130, + 134, 1, - 53, - 137, - 129, - 17, - 21, - 97, - 21, - 73, - 87, + 145, + 131, + 1, + 144, 96, 0, - 128, - 129, - 253, 91, - 97, + 129, + 129, + 16, 21, + 97, + 22, + 200, 87, - 143, - 141, 131, - 136, - 1, - 1, - 97, - 19, - 208, - 86, - 91, + 81, 131, - 133, - 1, 82, - 80, - 96, - 128, + 146, 132, 1, - 53, + 146, 145, - 80, - 136, - 130, - 17, - 21, - 97, - 21, - 113, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 21, - 127, - 142, - 140, 132, - 135, - 1, - 1, - 97, - 19, - 208, - 86, - 91, - 144, - 131, 1, - 82, - 80, - 132, - 82, - 80, 145, - 134, + 96, 1, - 145, - 134, 1, 97, - 20, - 181, + 22, + 172, 86, 91, 80, + 144, 152, 151, 80, @@ -5968,15 +6480,16 @@ pub mod summa { 91, 96, 0, - 130, 96, - 31, - 131, - 1, + 32, + 130, + 132, + 3, 18, - 97, 21, - 176, + 97, + 22, + 232, 87, 96, 0, @@ -5984,113 +6497,127 @@ pub mod summa { 253, 91, 129, - 53, + 81, + 128, + 21, + 21, + 129, + 20, + 97, + 17, + 154, + 87, 96, - 32, + 0, + 128, + 253, + 91, + 96, + 0, + 96, + 1, + 130, + 1, 97, - 21, - 192, + 23, + 10, + 87, 97, - 20, - 141, - 131, + 23, + 10, 97, - 19, - 172, + 21, + 241, + 86, + 91, + 80, + 96, + 1, + 1, + 144, 86, 91, + 96, + 31, 130, + 17, + 21, + 97, + 23, + 91, + 87, + 96, + 0, + 129, 129, 82, 96, - 5, - 146, - 144, - 146, - 27, - 132, - 1, + 32, 129, + 32, + 96, + 31, + 133, 1, - 145, - 129, + 96, + 5, + 28, 129, 1, - 144, + 96, + 32, 134, - 132, - 17, + 16, 21, 97, - 21, - 223, + 23, + 56, 87, - 96, - 0, + 80, 128, - 253, 91, + 96, + 31, + 133, + 1, + 96, + 5, + 28, 130, - 134, 1, + 145, + 80, 91, - 132, + 129, 129, 16, 21, 97, - 21, - 250, + 23, 87, - 128, - 53, - 131, - 82, - 145, - 131, + 87, + 130, + 129, + 85, + 96, 1, - 145, - 131, 1, 97, - 21, - 227, + 23, + 68, 86, 91, 80, - 150, - 149, - 80, 80, 80, + 91, 80, 80, 80, 86, 91, - 96, - 0, - 128, - 96, - 0, - 96, - 96, - 132, - 134, - 3, - 18, - 21, - 97, - 22, - 26, - 87, - 96, - 0, - 128, - 253, - 91, - 131, - 53, + 129, + 81, 103, 255, 255, @@ -6100,575 +6627,333 @@ pub mod summa { 255, 255, 255, - 128, - 130, + 129, 17, 21, 97, - 22, - 50, + 23, + 122, 87, - 96, - 0, - 128, - 253, + 97, + 23, + 122, + 97, + 17, + 161, + 86, 91, 97, - 22, - 62, - 135, - 131, + 23, + 142, + 129, + 97, + 23, 136, - 1, + 132, + 84, 97, - 19, - 208, + 22, + 54, + 86, + 91, + 132, + 97, + 23, + 17, 86, 91, - 148, - 80, 96, 32, - 134, - 1, - 53, - 145, - 80, 128, - 130, + 96, + 31, + 131, 17, - 21, + 96, + 1, + 129, + 20, 97, - 22, - 84, + 23, + 195, 87, 96, 0, - 128, - 253, - 91, - 80, - 97, - 22, - 97, - 134, - 130, - 135, - 1, - 97, + 132, 21, - 159, - 86, - 91, - 146, - 80, + 97, + 23, + 171, + 87, 80, - 96, - 64, - 132, + 133, + 131, 1, - 53, - 144, - 80, - 146, - 80, - 146, - 80, - 146, - 86, + 81, 91, 96, 0, - 128, + 25, 96, - 0, - 128, + 3, + 134, + 144, + 27, + 28, + 25, + 22, 96, - 128, + 1, 133, - 135, - 3, - 18, - 21, + 144, + 27, + 23, + 133, + 85, 97, - 22, - 136, + 23, 87, + 86, + 91, 96, 0, - 128, - 253, - 91, - 132, - 53, - 147, - 80, + 133, + 129, + 82, 96, 32, - 133, - 1, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 128, + 129, + 32, + 96, + 31, + 25, + 134, + 22, + 145, + 91, 130, - 17, + 129, + 16, 21, 97, - 22, - 167, + 23, + 242, 87, - 96, - 0, - 128, - 253, - 91, - 97, - 22, - 179, 136, - 131, - 137, + 134, + 1, + 81, + 130, + 85, + 148, + 132, 1, - 97, - 21, - 159, - 86, - 91, 148, - 80, 96, - 64, - 135, 1, - 53, + 144, 145, + 1, + 144, + 132, + 1, + 97, + 23, + 211, + 86, + 91, 80, - 128, + 133, 130, - 17, + 16, 21, 97, - 22, - 201, + 24, + 16, 87, - 96, - 0, - 128, - 253, - 91, - 129, - 135, - 1, - 145, - 80, 135, - 96, - 31, - 131, + 133, 1, - 18, - 97, - 22, - 221, - 87, + 81, 96, 0, - 128, - 253, - 91, - 97, + 25, + 96, + 3, + 136, + 144, + 27, + 96, + 248, 22, - 234, - 97, - 20, - 141, - 131, - 53, - 97, - 19, - 172, + 28, + 25, + 22, + 129, + 85, + 91, + 80, + 80, + 80, + 80, + 80, + 96, + 1, + 144, + 129, + 27, + 1, + 144, + 85, + 80, 86, 91, - 130, - 53, + 96, + 0, + 96, + 64, 128, - 130, + 131, 82, + 97, + 24, + 51, + 129, + 132, + 1, + 134, + 97, + 16, + 240, + 86, + 91, 96, 32, + 132, + 130, + 3, + 129, + 134, + 1, + 82, + 129, + 134, + 81, 128, - 131, + 132, + 82, + 130, + 132, 1, - 146, 145, + 80, + 130, + 129, 96, 5, 27, 133, 1, 1, - 138, - 129, - 17, - 21, - 97, - 23, - 9, - 87, + 131, + 137, + 1, 96, 0, - 128, - 253, - 91, - 96, - 32, - 133, - 1, 91, - 129, + 131, 129, 16, 21, 97, - 23, + 24, 165, 87, - 132, - 129, - 53, - 17, - 21, - 97, - 23, - 36, - 87, - 96, - 0, - 128, - 253, - 91, - 128, - 53, 134, - 1, - 96, - 64, - 129, - 142, + 131, 3, 96, 31, 25, 1, - 18, - 21, - 97, - 23, - 60, - 87, - 96, - 0, + 133, + 82, + 129, + 81, 128, - 253, - 91, - 97, - 23, - 68, + 81, + 137, + 133, + 82, 97, - 19, - 88, - 86, - 91, - 96, - 32, - 130, + 24, + 121, + 138, + 134, 1, - 53, - 135, - 129, - 17, - 21, + 130, 97, - 23, + 16, + 240, 86, - 87, - 96, - 0, - 128, - 253, 91, - 97, - 23, - 101, - 143, - 96, - 32, + 145, + 136, + 1, + 81, + 133, 131, + 3, 134, + 138, 1, - 1, - 97, - 19, - 208, - 86, - 91, - 130, 82, + 145, + 144, 80, - 96, - 64, - 130, - 1, - 53, - 135, - 129, - 17, - 21, - 97, - 23, - 122, - 87, - 96, - 0, - 128, - 253, - 91, 97, - 23, - 137, - 143, - 96, - 32, + 24, + 145, + 129, 131, - 134, - 1, - 1, 97, - 19, - 208, + 16, + 240, 86, 91, - 96, - 32, - 131, + 150, + 136, 1, - 82, + 150, + 148, 80, - 128, - 134, - 82, 80, 80, - 96, - 32, - 132, + 144, + 133, 1, - 147, - 80, + 144, 96, - 32, - 129, 1, - 144, - 80, + 1, 97, - 23, - 14, + 24, + 85, 86, 91, 80, - 151, + 144, 154, - 150, 153, 80, - 151, - 96, - 96, - 1, - 53, - 150, - 80, 80, 80, 80, 80, 80, - 86, - 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 23, - 203, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 53, - 96, - 1, - 96, - 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, - 97, - 18, - 186, - 87, - 96, - 0, - 128, - 253, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 17, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 129, - 129, - 3, - 129, - 129, - 17, - 21, - 97, - 24, - 11, - 87, - 97, - 24, - 11, - 97, - 23, - 226, - 86, - 91, - 146, - 145, - 80, 80, - 86, - 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 50, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, - 96, - 1, - 129, - 129, - 28, - 144, - 130, - 22, - 128, - 97, - 24, - 59, - 87, - 96, - 127, - 130, - 22, - 145, 80, - 91, - 96, - 32, - 130, - 16, - 129, - 3, - 97, - 24, - 91, - 87, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 34, - 96, - 4, - 82, - 96, - 36, - 96, - 0, - 253, - 91, 80, - 145, - 144, 80, 86, 91, @@ -6678,7 +6963,7 @@ pub mod summa { 81, 97, 24, - 115, + 199, 129, 132, 96, @@ -6686,8 +6971,8 @@ pub mod summa { 135, 1, 97, - 17, - 236, + 16, + 204, 86, 91, 145, @@ -6701,677 +6986,94 @@ pub mod summa { 86, 91, 96, - 31, - 130, - 17, - 21, - 97, - 24, - 199, - 87, - 96, 0, - 129, - 129, - 82, 96, 32, - 129, - 32, - 96, - 31, - 133, + 128, + 131, 1, - 96, - 5, - 28, 129, - 1, + 132, + 82, + 128, + 133, + 81, + 128, + 131, + 82, 96, - 32, + 64, 134, - 16, - 21, - 97, - 24, - 164, - 87, + 1, + 145, 80, - 128, - 91, 96, - 31, - 133, - 1, + 64, + 129, 96, 5, - 28, - 130, + 27, + 135, 1, - 145, + 1, + 146, 80, + 131, + 135, + 1, + 96, + 0, 91, - 129, + 130, 129, 16, 21, 97, - 24, - 195, + 25, + 38, 87, - 130, - 129, - 85, 96, + 63, + 25, + 136, + 134, + 3, 1, - 1, + 132, + 82, 97, - 24, - 176, - 86, - 91, - 80, - 80, - 80, - 91, - 80, - 80, - 80, - 86, - 91, - 129, - 81, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 24, - 230, - 87, - 97, - 24, - 230, - 97, - 19, - 25, - 86, - 91, - 97, - 24, - 250, - 129, - 97, - 24, - 244, - 132, - 84, - 97, - 24, - 39, - 86, - 91, - 132, - 97, - 24, - 125, - 86, - 91, - 96, - 32, - 128, - 96, - 31, - 131, - 17, - 96, - 1, - 129, - 20, - 97, - 25, - 47, - 87, - 96, - 0, - 132, - 21, - 97, - 25, - 23, - 87, - 80, - 133, - 131, - 1, - 81, - 91, - 96, - 0, - 25, - 96, - 3, - 134, - 144, - 27, - 28, - 25, - 22, - 96, - 1, - 133, - 144, - 27, - 23, - 133, - 85, - 97, - 24, - 195, - 86, - 91, - 96, - 0, - 133, - 129, - 82, - 96, - 32, - 129, - 32, - 96, - 31, - 25, - 134, - 22, - 145, - 91, - 130, - 129, - 16, - 21, - 97, - 25, - 94, - 87, - 136, - 134, - 1, - 81, - 130, - 85, - 148, - 132, - 1, - 148, - 96, - 1, - 144, - 145, - 1, - 144, - 132, - 1, - 97, - 25, - 63, - 86, - 91, - 80, - 133, - 130, - 16, - 21, - 97, - 25, - 124, - 87, - 135, - 133, - 1, - 81, - 96, - 0, - 25, - 96, - 3, - 136, - 144, - 27, - 96, - 248, - 22, - 28, - 25, - 22, - 129, - 85, - 91, - 80, - 80, - 80, - 80, - 80, - 96, - 1, - 144, - 129, - 27, - 1, - 144, - 85, - 80, - 86, - 91, - 96, - 0, - 96, - 1, - 130, - 1, - 97, - 25, - 158, - 87, - 97, - 25, - 158, - 97, - 23, - 226, - 86, - 91, - 80, - 96, - 1, - 1, - 144, - 86, - 91, - 96, - 0, - 96, - 32, - 128, - 131, - 1, - 129, - 132, - 82, - 128, - 133, - 81, - 128, - 131, - 82, - 96, - 64, - 134, - 1, - 145, - 80, - 96, - 64, - 129, - 96, - 5, - 27, - 135, - 1, - 1, - 146, - 80, - 131, - 135, - 1, - 96, - 0, - 91, - 130, - 129, - 16, - 21, - 97, - 25, - 250, - 87, - 96, - 63, - 25, - 136, - 134, - 3, - 1, - 132, - 82, - 97, - 25, - 232, - 133, - 131, - 81, - 97, - 18, - 60, - 86, - 91, - 148, - 80, - 146, - 133, - 1, - 146, - 144, - 133, - 1, - 144, - 96, - 1, - 1, - 97, - 25, - 204, - 86, - 91, - 80, - 146, - 151, - 150, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 129, - 81, - 128, - 132, - 82, - 96, - 32, - 128, - 133, - 1, - 148, - 80, - 128, - 132, - 1, - 96, - 0, - 91, - 131, - 129, - 16, - 21, - 97, - 26, - 55, - 87, - 129, - 81, - 135, - 82, - 149, - 130, - 1, - 149, - 144, - 130, - 1, - 144, - 96, - 1, - 1, - 97, - 26, - 27, - 86, - 91, - 80, - 148, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 64, - 129, - 82, - 96, - 0, - 97, - 26, - 85, - 96, - 64, - 131, - 1, - 133, - 97, - 26, - 7, - 86, - 91, - 130, - 129, - 3, - 96, - 32, - 132, - 1, - 82, - 97, - 18, - 158, - 129, - 133, - 97, - 18, - 16, - 86, - 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 26, - 121, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 81, - 128, - 21, - 21, - 129, + 25, 20, - 97, - 18, - 186, - 87, - 96, - 0, - 128, - 253, - 91, - 131, - 129, - 82, - 96, - 0, - 96, - 32, - 96, - 96, - 129, - 132, - 1, - 82, - 97, - 26, - 163, - 96, - 96, - 132, - 1, - 134, - 97, - 26, - 7, - 86, - 91, - 96, - 64, - 132, - 130, - 3, - 129, - 134, - 1, - 82, - 129, - 134, - 81, - 128, - 132, - 82, - 132, - 132, - 1, - 145, - 80, - 132, - 129, - 96, - 5, - 27, - 133, - 1, - 1, 133, - 137, - 1, - 96, - 0, - 91, - 131, - 129, - 16, - 21, - 97, - 27, - 21, - 87, - 134, 131, - 3, - 96, - 31, - 25, - 1, - 133, - 82, - 129, - 81, - 128, - 81, - 135, - 133, - 82, - 97, - 26, - 233, - 136, - 134, - 1, - 130, - 97, - 18, - 16, - 86, - 91, - 145, - 138, - 1, 81, - 133, - 131, - 3, - 134, - 140, - 1, - 82, - 145, - 144, - 80, - 97, - 27, - 1, - 129, - 131, 97, - 18, - 16, + 17, + 28, 86, 91, - 150, - 138, - 1, - 150, 148, 80, - 80, - 80, + 146, + 133, + 1, + 146, 144, - 135, + 133, 1, 144, 96, 1, 1, 97, - 26, - 197, + 24, + 248, 86, 91, 80, - 144, - 155, - 154, - 80, - 80, - 80, - 80, + 146, + 151, + 150, 80, 80, 80, @@ -7391,38 +7093,38 @@ pub mod summa { 34, 18, 32, - 69, - 217, - 51, + 14, + 212, + 173, + 33, + 249, + 5, + 195, + 118, + 163, + 194, + 120, + 87, + 244, + 94, + 231, + 128, + 9, + 167, + 245, 111, - 11, - 99, + 232, 20, - 121, - 100, - 150, - 199, - 161, - 207, - 22, - 12, - 25, - 180, - 42, - 97, - 148, - 58, - 144, - 251, - 91, - 190, - 44, - 252, - 239, - 16, + 185, + 115, + 203, + 184, + 216, + 227, + 222, + 145, + 247, 123, - 181, - 219, 100, 115, 111, @@ -7475,10 +7177,10 @@ pub mod summa { 28, 128, 99, - 163, - 196, - 188, - 248, + 125, + 220, + 144, + 125, 17, 97, 0, @@ -7486,47 +7188,47 @@ pub mod summa { 87, 128, 99, - 163, - 196, - 188, - 248, + 125, + 220, + 144, + 125, 20, 97, 1, - 105, + 62, 87, 128, 99, - 199, - 221, - 202, - 14, + 141, + 165, + 203, + 91, 20, 97, 1, - 140, + 105, 87, 128, 99, - 200, - 229, - 129, - 71, + 163, + 196, + 188, + 248, 20, 97, 1, - 159, + 122, 87, 128, 99, - 218, - 100, - 167, - 80, + 199, + 221, + 202, + 14, 20, 97, 1, - 194, + 157, 87, 128, 99, @@ -7537,7 +7239,7 @@ pub mod summa { 20, 97, 1, - 213, + 176, 87, 96, 0, @@ -7557,6 +7259,17 @@ pub mod summa { 87, 128, 99, + 67, + 249, + 236, + 7, + 20, + 97, + 0, + 204, + 87, + 128, + 99, 73, 206, 137, @@ -7564,7 +7277,7 @@ pub mod summa { 20, 97, 0, - 204, + 225, 87, 128, 99, @@ -7574,8 +7287,8 @@ pub mod summa { 166, 20, 97, - 0, - 250, + 1, + 1, 87, 128, 99, @@ -7586,18 +7299,7 @@ pub mod summa { 20, 97, 1, - 4, - 87, - 128, - 99, - 141, - 165, - 203, - 91, - 20, - 97, - 1, - 78, + 9, 87, 91, 96, @@ -7615,13 +7317,13 @@ pub mod summa { 96, 4, 97, - 17, - 211, + 16, + 179, 86, 91, 97, 1, - 232, + 195, 86, 91, 96, @@ -7633,8 +7335,8 @@ pub mod summa { 145, 144, 97, - 18, - 167, + 17, + 135, 86, 91, 96, @@ -7648,7 +7350,7 @@ pub mod summa { 91, 97, 0, - 236, + 223, 97, 0, 218, @@ -7656,88 +7358,80 @@ pub mod summa { 96, 4, 97, - 17, - 211, + 18, + 200, 86, 91, - 96, + 97, 4, - 96, - 32, - 82, - 96, + 219, + 86, + 91, 0, - 144, - 129, - 82, + 91, + 97, + 0, + 244, + 97, + 0, + 239, + 54, 96, - 64, - 144, + 4, + 97, + 16, + 179, + 86, + 91, + 97, + 9, 32, - 84, - 129, 86, 91, 96, 64, 81, - 144, - 129, - 82, - 96, - 32, - 1, 97, 0, 195, + 145, + 144, + 97, + 20, + 3, 86, 91, 97, - 1, - 2, - 97, - 5, 0, + 223, + 97, + 9, + 190, 86, 91, - 0, - 91, 96, 1, 84, 97, 1, - 42, + 34, 144, 97, 255, 255, - 128, - 130, - 22, - 145, - 98, - 1, - 0, - 0, 129, - 4, - 144, - 145, 22, 144, - 100, + 98, 1, 0, 0, - 0, - 0, 144, 4, 96, 255, 22, - 131, + 130, 86, 91, 96, @@ -7747,29 +7441,21 @@ pub mod summa { 97, 255, 255, - 148, - 133, - 22, - 129, - 82, - 147, 144, - 146, + 147, 22, - 96, - 32, - 132, - 1, + 131, 82, 96, 255, - 22, 144, - 130, + 145, + 22, + 96, + 32, + 131, 1, 82, - 96, - 96, 1, 97, 0, @@ -7777,8 +7463,24 @@ pub mod summa { 86, 91, 96, - 0, + 2, 84, + 97, + 1, + 81, + 144, + 96, + 1, + 96, + 1, + 96, + 160, + 27, + 3, + 22, + 129, + 86, + 91, 96, 64, 81, @@ -7803,136 +7505,99 @@ pub mod summa { 195, 86, 91, - 97, - 1, - 124, - 97, - 1, - 119, - 54, - 96, - 4, - 97, - 17, - 211, - 86, - 91, - 97, - 5, - 20, - 86, - 91, 96, - 64, - 81, - 97, 0, - 195, - 148, - 147, - 146, - 145, - 144, - 97, - 18, - 193, - 86, - 91, - 97, + 84, + 96, 1, - 2, - 97, + 96, 1, - 154, - 54, 96, - 4, - 97, - 20, - 64, - 86, - 91, + 160, + 27, + 3, + 22, 97, - 7, - 116, + 1, + 81, 86, 91, 97, 1, - 178, + 141, 97, 1, - 173, + 136, 54, 96, 4, 97, - 22, - 5, + 16, + 179, 86, 91, - 97, - 10, - 21, + 97, + 9, + 210, 86, 91, 96, 64, 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, 97, 0, 195, + 148, + 147, + 146, + 145, + 144, + 97, + 20, + 22, 86, 91, 97, - 1, - 2, + 0, + 223, 97, 1, - 208, + 171, 54, 96, 4, 97, - 22, - 114, + 20, + 110, 86, 91, 97, - 11, - 219, + 12, + 50, 86, 91, 97, - 1, - 2, + 0, + 223, 97, 1, - 227, + 190, 54, 96, 4, 97, - 23, - 185, + 21, + 200, 86, 91, 97, - 15, - 167, + 14, + 211, 86, 91, 97, - 2, - 19, + 1, + 238, 96, 64, 81, @@ -7979,7 +7644,7 @@ pub mod summa { 129, 82, 96, - 3, + 5, 96, 32, 82, @@ -7990,7 +7655,7 @@ pub mod summa { 84, 97, 2, - 106, + 69, 87, 96, 64, @@ -8066,7 +7731,7 @@ pub mod summa { 129, 82, 96, - 3, + 5, 96, 32, 82, @@ -8076,18 +7741,18 @@ pub mod summa { 32, 84, 96, - 2, + 3, 144, 97, 2, - 136, + 99, 144, 96, 1, 144, 97, - 23, - 248, + 22, + 7, 86, 91, 129, @@ -8096,14 +7761,14 @@ pub mod summa { 16, 97, 2, - 152, + 115, 87, 97, 2, - 152, + 115, 97, - 24, - 17, + 22, + 32, 86, 91, 144, @@ -8140,11 +7805,11 @@ pub mod summa { 84, 97, 2, - 193, + 156, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, @@ -8184,26 +7849,26 @@ pub mod summa { 84, 97, 2, - 237, + 200, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, 21, 97, 3, - 58, + 21, 87, 128, 96, 31, 16, 97, - 3, - 15, + 2, + 234, 87, 97, 1, @@ -8222,7 +7887,7 @@ pub mod summa { 145, 97, 3, - 58, + 21, 86, 91, 130, @@ -8255,8 +7920,8 @@ pub mod summa { 131, 17, 97, - 3, - 29, + 2, + 248, 87, 130, 144, @@ -8286,11 +7951,11 @@ pub mod summa { 84, 97, 3, - 83, + 46, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, @@ -8330,18 +7995,18 @@ pub mod summa { 84, 97, 3, - 127, + 90, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, 21, 97, 3, - 204, + 167, 87, 128, 96, @@ -8349,7 +8014,7 @@ pub mod summa { 16, 97, 3, - 161, + 124, 87, 97, 1, @@ -8368,7 +8033,7 @@ pub mod summa { 145, 97, 3, - 204, + 167, 86, 91, 130, @@ -8402,7 +8067,7 @@ pub mod summa { 17, 97, 3, - 175, + 138, 87, 130, 144, @@ -8432,11 +8097,11 @@ pub mod summa { 84, 97, 3, - 229, + 192, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, @@ -8475,19 +8140,19 @@ pub mod summa { 128, 84, 97, - 4, - 17, + 3, + 236, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, 21, 97, 4, - 94, + 57, 87, 128, 96, @@ -8495,7 +8160,7 @@ pub mod summa { 16, 97, 4, - 51, + 14, 87, 97, 1, @@ -8514,7 +8179,7 @@ pub mod summa { 145, 97, 4, - 94, + 57, 86, 91, 130, @@ -8548,7 +8213,7 @@ pub mod summa { 17, 97, 4, - 65, + 28, 87, 130, 144, @@ -8578,11 +8243,11 @@ pub mod summa { 84, 97, 4, - 119, + 82, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, @@ -8622,18 +8287,18 @@ pub mod summa { 84, 97, 4, - 163, + 126, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 128, 21, 97, 4, - 240, + 203, 87, 128, 96, @@ -8641,7 +8306,7 @@ pub mod summa { 16, 97, 4, - 197, + 160, 87, 97, 1, @@ -8660,7 +8325,7 @@ pub mod summa { 145, 97, 4, - 240, + 203, 86, 91, 130, @@ -8694,7 +8359,7 @@ pub mod summa { 17, 97, 4, - 211, + 174, 87, 130, 144, @@ -8723,671 +8388,651 @@ pub mod summa { 86, 91, 97, - 5, - 8, + 4, + 227, 97, - 16, - 32, + 15, + 76, 86, 91, + 130, + 81, + 97, + 21, + 0, + 20, 97, 5, - 18, + 44, + 87, 96, - 0, + 64, + 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, + 129, + 82, + 96, + 32, + 96, + 4, + 130, + 1, + 82, + 96, + 20, + 96, + 36, + 130, + 1, + 82, + 115, + 9, + 45, + 206, + 204, + 45, + 141, + 44, + 132, + 14, + 14, + 77, + 237, + 236, + 196, + 13, + 140, + 173, + 204, + 238, + 141, + 96, + 99, + 27, + 96, + 68, + 130, + 1, + 82, + 96, + 100, + 1, 97, - 16, - 122, - 86, - 91, + 2, + 60, 86, 91, 96, - 2, - 129, - 129, - 84, - 129, - 16, + 0, + 130, + 81, + 17, 97, 5, - 36, + 139, 87, 96, - 0, - 128, - 253, - 91, - 144, + 64, + 81, + 98, + 70, + 27, + 205, 96, - 0, + 229, + 27, + 129, 82, 96, 32, 96, - 0, - 32, - 144, - 96, 4, - 2, + 130, 1, + 82, 96, - 0, - 145, - 80, - 144, - 80, - 128, + 37, 96, - 0, + 36, + 130, 1, - 128, - 84, - 97, - 5, - 71, - 144, + 82, + 127, + 67, + 114, + 121, + 112, + 116, + 111, + 99, + 117, + 114, + 114, + 101, + 110, + 99, + 105, + 101, + 115, + 32, + 108, + 105, + 115, + 116, + 32, + 99, 97, - 24, - 39, - 86, - 91, - 128, - 96, - 31, - 1, - 96, + 110, + 110, + 111, + 116, 32, - 128, - 145, - 4, - 2, - 96, + 98, + 101, 32, - 1, 96, - 64, - 81, - 144, - 129, + 68, + 130, 1, - 96, - 64, 82, - 128, - 146, - 145, - 144, - 129, - 129, + 100, + 101, + 109, + 112, + 116, + 121, + 96, + 216, + 27, + 96, + 100, + 130, + 1, 82, 96, - 32, + 132, 1, - 130, - 128, - 84, 97, - 5, - 115, - 144, - 97, - 24, - 39, + 2, + 60, 86, 91, + 96, + 64, 128, - 21, - 97, - 5, - 192, - 87, - 128, + 81, 96, - 31, - 16, - 97, - 5, - 149, - 87, - 97, 1, - 0, 128, + 130, + 82, + 129, 131, - 84, - 4, - 2, - 131, + 1, + 144, + 146, 82, + 96, + 0, 145, 96, 32, + 128, + 131, 1, - 145, - 97, - 5, - 192, - 86, - 91, - 130, + 144, + 128, + 54, + 131, + 55, 1, - 145, 144, + 80, + 80, + 144, + 80, 96, - 0, - 82, + 1, + 129, 96, + 0, + 129, + 81, + 129, + 16, + 97, + 5, + 194, + 87, + 97, + 5, + 194, + 97, + 22, 32, + 86, + 91, 96, - 0, 32, 144, - 91, 129, + 2, + 145, + 144, + 145, + 1, + 1, + 82, + 96, + 2, 84, + 96, + 64, + 81, + 99, + 175, + 131, + 161, + 141, + 96, + 224, + 27, 129, 82, - 144, 96, 1, - 1, - 144, 96, - 32, 1, - 128, + 96, + 160, + 27, + 3, + 127, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 129, + 22, + 146, + 99, + 175, 131, - 17, - 97, - 5, - 163, - 87, - 130, + 161, + 141, + 146, + 97, + 6, + 36, + 146, + 145, 144, - 3, - 96, - 31, - 22, - 130, - 1, 145, - 91, - 80, - 80, - 80, - 80, - 80, + 22, + 144, + 136, + 144, + 134, 144, - 128, 96, + 4, 1, - 1, - 128, - 84, - 97, - 5, - 213, - 144, 97, - 24, - 39, + 22, + 112, 86, 91, - 128, - 96, - 31, - 1, - 96, - 32, - 128, - 145, - 4, - 2, 96, 32, - 1, 96, 64, 81, - 144, - 129, - 1, - 96, - 64, - 82, 128, - 146, - 145, - 144, - 129, + 131, + 3, 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 6, - 1, - 144, - 97, - 24, - 39, - 86, - 91, + 134, + 90, + 250, + 21, 128, 21, 97, 6, - 78, + 65, 87, - 128, + 61, 96, - 31, - 16, - 97, - 6, - 35, - 87, - 97, - 1, 0, 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, - 96, - 32, - 1, - 145, - 97, - 6, - 78, - 86, - 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, - 96, - 32, + 62, + 61, 96, 0, - 32, - 144, + 253, 91, - 129, - 84, - 129, - 82, - 144, + 80, + 80, + 80, + 80, 96, - 1, - 1, - 144, + 64, + 81, + 61, 96, - 32, - 1, - 128, - 131, - 17, - 97, - 6, - 49, - 87, - 130, - 144, - 3, + 31, + 25, 96, 31, + 130, + 1, 22, 130, 1, - 145, - 91, - 80, - 80, - 80, - 80, - 80, - 144, 128, 96, - 2, + 64, + 82, + 80, + 129, 1, - 128, - 84, + 144, 97, 6, - 99, + 101, + 145, 144, 97, - 24, - 39, + 22, + 214, 86, 91, - 128, + 97, + 6, + 161, + 87, 96, - 31, - 1, + 64, + 81, + 98, + 70, + 27, + 205, 96, - 32, - 128, - 145, - 4, - 2, + 229, + 27, + 129, + 82, 96, 32, - 1, 96, - 64, - 81, - 144, - 129, + 4, + 130, 1, + 82, 96, - 64, + 13, + 96, + 36, + 130, + 1, 82, - 128, - 146, - 145, - 144, - 129, - 129, + 108, + 36, + 183, + 59, + 48, + 182, + 52, + 178, + 16, + 56, + 57, + 55, + 183, + 179, + 96, + 153, + 27, + 96, + 68, + 130, + 1, 82, 96, - 32, + 100, 1, - 130, - 128, - 84, - 97, - 6, - 143, - 144, 97, - 24, - 39, + 2, + 60, 86, 91, - 128, + 96, + 0, + 131, + 81, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, 21, 97, 6, - 220, + 189, 87, - 128, - 96, - 31, - 16, 97, 6, - 177, - 87, + 189, 97, - 1, - 0, + 17, + 161, + 86, + 91, + 96, + 64, + 81, + 144, 128, - 131, - 84, - 4, - 2, - 131, + 130, 82, - 145, + 128, + 96, + 32, + 2, 96, 32, 1, - 145, - 97, - 6, - 220, - 86, - 91, 130, 1, - 145, - 144, 96, - 0, + 64, 82, + 128, + 21, + 97, + 6, + 240, + 87, + 129, 96, 32, - 96, - 0, - 32, - 144, + 1, 91, - 129, - 84, + 96, + 96, 129, 82, - 144, 96, - 1, + 32, 1, 144, 96, - 32, 1, - 128, - 131, - 17, + 144, + 3, + 144, + 129, 97, 6, - 191, + 219, 87, - 130, 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, 80, + 91, 80, 144, - 128, + 80, 96, - 3, - 1, - 128, - 84, + 0, + 132, + 81, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 21, 97, - 6, - 241, - 144, + 7, + 15, + 87, 97, - 24, - 39, + 7, + 15, + 97, + 17, + 161, 86, 91, - 128, 96, - 31, - 1, + 64, + 81, + 144, + 128, + 130, + 82, + 128, 96, 32, - 128, - 145, - 4, 2, 96, 32, 1, - 96, - 64, - 81, - 144, - 129, + 130, 1, 96, 64, 82, 128, - 146, - 145, - 144, - 129, - 129, - 82, - 96, - 32, - 1, - 130, - 128, - 84, - 97, - 7, - 29, - 144, - 97, - 24, - 39, - 86, - 91, - 128, 21, 97, 7, - 106, - 87, - 128, - 96, - 31, - 16, - 97, - 7, - 63, + 66, 87, - 97, - 1, - 0, - 128, - 131, - 84, - 4, - 2, - 131, - 82, - 145, + 129, 96, 32, 1, - 145, - 97, - 7, - 106, - 86, 91, - 130, - 1, - 145, - 144, - 96, - 0, - 82, 96, - 32, 96, - 0, - 32, - 144, - 91, - 129, - 84, 129, 82, - 144, 96, - 1, + 32, 1, 144, 96, - 32, 1, - 128, - 131, - 17, + 144, + 3, + 144, + 129, 97, 7, - 77, + 45, 87, - 130, 144, - 3, - 96, - 31, - 22, - 130, - 1, - 145, - 91, - 80, - 80, - 80, 80, + 91, 80, 144, 80, - 132, - 86, - 91, - 97, - 7, - 124, - 97, - 16, - 32, - 86, - 91, 96, 0, 91, - 129, + 133, 81, 129, 16, 21, 97, - 9, - 218, + 8, + 109, 87, - 96, - 0, - 130, - 130, + 133, + 129, 129, 81, 129, 16, 97, 7, - 156, + 99, 87, 97, 7, - 156, + 99, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -9399,70 +9044,60 @@ pub mod summa { 1, 81, 96, - 0, + 32, 1, 81, - 96, - 64, 81, 96, - 32, - 1, + 0, + 20, + 21, + 128, + 21, 97, 7, - 184, - 145, - 144, + 159, + 87, + 80, + 133, + 129, + 129, + 81, + 129, + 16, 97, - 24, + 7, + 141, + 87, + 97, + 7, + 141, 97, + 22, + 32, 86, 91, 96, - 64, - 128, - 81, + 32, + 2, 96, - 31, - 25, - 129, - 132, - 3, + 32, + 1, 1, - 129, - 82, - 145, - 129, - 82, - 129, 81, 96, - 32, - 146, - 131, + 0, 1, - 32, + 81, + 81, 96, 0, - 129, - 129, - 82, - 96, - 3, - 144, - 147, - 82, - 145, - 32, - 84, - 144, - 145, - 80, - 128, + 20, 21, + 91, 97, - 8, - 46, + 7, + 228, 87, 96, 64, @@ -9484,230 +9119,67 @@ pub mod summa { 1, 82, 96, - 24, + 22, 96, 36, 130, 1, 82, - 127, - 65, - 100, - 100, - 114, - 101, - 115, - 115, - 32, + 117, + 73, + 110, + 118, 97, 108, - 114, - 101, - 97, - 100, - 121, - 32, - 118, - 101, - 114, - 105, - 102, 105, - 101, 100, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 96, - 68, - 130, - 1, - 82, - 96, - 100, - 1, - 97, - 2, - 97, - 86, - 91, - 96, - 2, - 132, - 132, - 129, - 81, - 129, - 16, - 97, - 8, - 66, - 87, - 97, - 8, - 66, - 97, - 24, - 17, - 86, - 91, - 96, - 32, - 144, - 129, - 2, - 145, - 144, - 145, - 1, - 129, - 1, - 81, - 130, - 84, - 96, - 1, - 129, - 1, - 132, - 85, - 96, - 0, - 147, - 132, - 82, - 145, - 144, - 146, 32, - 130, - 81, - 96, - 4, - 144, - 146, - 2, - 1, - 144, - 129, - 144, - 97, - 8, + 99, + 114, + 121, + 112, 116, - 144, - 130, - 97, - 24, - 204, - 86, - 91, - 80, - 96, - 32, - 130, - 1, - 81, - 96, - 1, - 130, - 1, - 144, - 97, - 8, - 137, - 144, - 130, - 97, - 24, - 204, - 86, - 91, - 80, - 96, - 64, - 130, - 1, - 81, - 96, - 2, - 130, - 1, - 144, - 97, - 8, - 158, - 144, - 130, - 97, - 24, - 204, - 86, - 91, - 80, + 111, + 99, + 117, + 114, + 114, + 101, + 110, + 99, + 121, 96, + 80, + 27, 96, + 68, 130, 1, - 81, + 82, 96, - 3, - 130, + 100, 1, - 144, - 97, - 8, - 179, - 144, - 130, 97, - 24, - 204, + 2, + 60, 86, 91, - 80, - 80, - 96, - 2, - 84, - 96, - 0, - 132, + 133, + 129, 129, - 82, - 96, - 3, - 96, - 32, - 82, - 96, - 64, - 144, - 32, - 85, - 80, - 131, 81, - 132, - 144, - 132, - 144, 129, 16, 97, - 8, - 220, + 7, + 246, 87, 97, - 8, - 220, + 7, + 246, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -9722,34 +9194,22 @@ pub mod summa { 0, 1, 81, - 81, - 96, - 0, - 20, - 21, - 128, - 21, - 97, - 9, - 24, - 87, - 80, - 131, 131, + 130, 129, 81, 129, 16, 97, - 9, - 6, + 8, + 20, 87, 97, - 9, - 6, + 8, + 20, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -9759,40 +9219,26 @@ pub mod summa { 32, 1, 1, - 81, - 96, - 32, - 1, - 81, - 81, - 96, - 0, - 20, - 21, - 91, - 128, - 21, - 97, - 9, - 67, - 87, + 129, + 144, + 82, 80, - 131, - 131, + 133, + 129, 129, 81, 129, 16, 97, - 9, + 8, 49, 87, 97, - 9, + 8, 49, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -9804,38 +9250,25 @@ pub mod summa { 1, 81, 96, - 64, + 32, 1, 81, - 81, - 96, - 0, - 20, - 21, - 91, - 128, - 21, - 97, - 9, - 110, - 87, - 80, - 131, - 131, + 130, + 130, 129, 81, 129, 16, 97, - 9, - 92, + 8, + 79, 87, 97, - 9, - 92, + 8, + 79, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -9845,171 +9278,190 @@ pub mod summa { 32, 1, 1, - 81, - 96, - 96, - 1, - 81, - 81, - 96, - 0, - 20, - 21, + 129, + 144, + 82, + 80, + 128, + 128, + 97, + 8, + 101, + 144, + 97, + 22, + 248, + 86, 91, + 145, + 80, + 80, 97, - 9, - 197, - 87, + 7, + 72, + 86, + 91, + 80, 96, 64, + 128, 81, - 98, - 70, - 27, - 205, 96, - 229, - 27, + 96, + 129, + 1, + 130, + 82, + 135, 129, 82, 96, 32, - 96, - 4, + 128, 130, 1, + 133, + 144, + 82, + 129, + 131, + 1, + 132, + 144, 82, 96, - 34, + 0, + 135, + 129, + 82, 96, - 36, - 130, - 1, + 4, + 144, + 145, 82, - 127, - 73, - 110, - 118, - 97, - 108, - 105, - 100, - 32, - 112, - 114, - 111, - 111, - 102, - 32, - 111, - 102, - 32, - 97, - 100, - 100, - 114, - 101, - 115, - 115, + 145, + 144, + 145, 32, - 111, - 119, - 110, - 101, - 114, - 115, - 104, - 96, - 68, + 129, + 81, + 129, + 144, + 97, + 8, + 165, + 144, 130, - 1, - 82, 97, - 6, - 151, + 23, 96, - 244, - 27, + 86, + 91, + 80, 96, - 100, + 32, 130, + 129, 1, - 82, + 81, + 128, + 81, + 97, + 8, + 190, + 146, 96, - 132, 1, + 133, + 1, + 146, + 1, + 144, 97, - 2, - 97, + 15, + 246, 86, 91, 80, - 80, - 128, + 96, + 64, + 130, + 1, + 81, 128, + 81, 97, - 9, - 210, + 8, + 218, + 145, + 96, + 2, + 132, + 1, + 145, + 96, + 32, + 144, + 145, + 1, 144, 97, - 25, - 140, + 15, + 246, 86, 91, - 145, 80, + 144, 80, - 97, - 7, - 127, - 86, - 91, 80, + 131, 127, - 56, - 35, - 21, - 212, - 213, - 106, - 96, - 53, - 225, - 137, - 155, - 255, - 231, - 125, - 155, - 236, - 239, - 175, - 95, - 38, - 80, - 228, - 50, - 59, - 39, - 133, - 72, - 87, - 160, - 69, - 70, - 88, + 43, + 22, 129, + 62, + 43, + 166, + 199, + 89, + 231, + 241, + 158, + 154, + 138, + 233, + 241, + 141, + 195, + 3, + 229, + 184, + 110, + 235, + 199, + 122, + 141, + 92, + 134, + 157, + 117, + 234, + 253, + 210, + 135, + 135, 96, 64, 81, 97, - 10, - 10, + 9, + 16, + 146, 145, 144, 97, - 25, - 165, + 24, + 32, 86, 91, 96, @@ -10019,214 +9471,208 @@ pub mod summa { 145, 3, 144, - 161, + 162, + 80, + 80, + 80, + 80, + 80, 80, 86, 91, 96, - 0, - 130, - 96, - 1, - 129, - 81, - 129, - 16, - 97, - 10, - 42, - 87, - 97, - 10, - 42, - 97, - 24, - 17, - 86, - 91, - 96, - 32, - 2, + 4, 96, 32, - 1, - 1, - 81, - 96, - 4, + 82, 96, 0, - 132, + 144, 129, 82, 96, - 32, - 1, + 64, 144, + 32, + 128, + 84, 129, - 82, + 144, + 97, + 9, + 59, + 144, + 97, + 22, + 54, + 86, + 91, + 128, 96, - 32, + 31, 1, 96, - 0, 32, + 128, + 145, + 4, + 2, 96, - 0, + 32, 1, - 84, - 20, - 97, - 10, - 137, - 87, 96, 64, 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, + 144, 129, - 82, - 96, - 32, - 96, - 4, - 130, 1, - 82, - 96, - 16, - 96, - 36, - 130, - 1, - 82, - 111, - 18, - 91, - 157, - 152, - 91, - 26, - 89, - 8, - 19, - 84, - 213, - 8, - 28, - 155, - 219, - 221, - 96, - 130, - 27, 96, - 68, - 130, - 1, + 64, + 82, + 128, + 146, + 145, + 144, + 129, + 129, 82, 96, - 100, + 32, 1, + 130, + 128, + 84, 97, - 2, + 9, + 103, + 144, 97, + 22, + 54, 86, 91, - 96, - 2, - 91, - 131, - 81, - 129, - 16, + 128, 21, 97, - 11, - 67, + 9, + 180, 87, - 131, - 129, - 129, - 81, - 129, + 128, + 96, + 31, 16, 97, - 10, - 167, + 9, + 137, 87, 97, - 10, - 167, - 97, - 24, - 17, - 86, - 91, - 96, - 32, + 1, + 0, + 128, + 131, + 84, + 4, 2, + 131, + 82, + 145, 96, 32, 1, + 145, + 97, + 9, + 180, + 86, + 91, + 130, 1, - 81, - 96, - 4, + 145, + 144, 96, 0, - 133, - 129, 82, 96, 32, - 1, + 96, + 0, + 32, 144, + 91, + 129, + 84, 129, 82, + 144, 96, - 32, 1, + 1, + 144, 96, - 0, 32, - 96, - 1, 1, - 96, - 2, + 128, 131, + 17, 97, - 10, - 210, + 9, + 151, + 87, + 130, + 144, + 3, + 96, + 31, + 22, + 130, + 1, 145, + 91, + 80, + 80, + 80, + 80, + 80, 144, + 80, + 129, + 86, + 91, 97, - 23, - 248, + 9, + 198, + 97, + 15, + 76, + 86, + 91, + 97, + 9, + 208, + 96, + 0, + 97, + 15, + 166, 86, 91, + 86, + 91, + 96, + 3, + 129, 129, 84, 129, 16, 97, - 10, + 9, 226, 87, - 97, - 10, - 226, - 97, - 24, - 17, - 86, + 96, + 0, + 128, + 253, 91, 144, 96, @@ -10237,624 +9683,627 @@ pub mod summa { 96, 0, 32, + 144, + 96, + 4, + 2, + 1, + 96, + 0, + 145, + 80, + 144, + 80, + 128, + 96, + 0, 1, + 128, 84, - 20, 97, - 11, - 49, - 87, + 10, + 5, + 144, + 97, + 22, + 54, + 86, + 91, + 128, + 96, + 31, + 1, + 96, + 32, + 128, + 145, + 4, + 2, + 96, + 32, + 1, 96, 64, 81, - 98, - 70, - 27, - 205, + 144, + 129, + 1, 96, - 229, - 27, + 64, + 82, + 128, + 146, + 145, + 144, + 129, 129, 82, 96, 32, - 96, - 4, - 130, 1, - 82, - 96, - 20, - 96, - 36, 130, - 1, - 82, - 115, - 73, - 110, - 118, + 128, + 84, 97, - 108, - 105, - 100, - 32, - 114, - 111, - 111, - 116, - 32, - 98, + 10, + 49, + 144, 97, - 108, + 22, + 54, + 86, + 91, + 128, + 21, 97, - 110, - 99, - 101, - 96, - 96, - 27, + 10, + 126, + 87, + 128, 96, - 68, - 130, + 31, + 16, + 97, + 10, + 83, + 87, + 97, 1, + 0, + 128, + 131, + 84, + 4, + 2, + 131, 82, + 145, 96, - 100, + 32, 1, - 97, - 2, - 97, - 86, - 91, - 128, - 97, - 11, - 59, - 129, - 97, - 25, - 140, - 86, - 91, 145, - 80, - 80, 97, 10, - 140, + 126, 86, 91, - 80, - 96, - 64, - 81, - 99, - 11, - 210, - 5, - 169, + 130, + 1, + 145, + 144, 96, - 228, - 27, - 129, + 0, 82, 96, - 1, - 96, - 1, + 32, 96, - 160, - 27, - 3, - 127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 22, - 144, - 99, - 189, 32, - 90, - 144, - 144, - 97, - 11, - 146, - 144, - 134, 144, - 136, + 91, + 129, + 84, + 129, + 82, 144, 96, - 4, 1, - 97, - 26, - 66, - 86, - 91, + 1, + 144, 96, 32, - 96, - 64, - 81, + 1, 128, 131, - 3, - 129, - 134, - 90, - 250, - 21, - 128, - 21, + 17, + 97, + 10, 97, - 11, - 175, 87, - 61, - 96, - 0, - 128, - 62, - 61, + 130, + 144, + 3, 96, - 0, - 253, + 31, + 22, + 130, + 1, + 145, 91, 80, 80, 80, 80, + 80, + 144, + 128, 96, - 64, - 81, - 61, + 1, + 1, + 128, + 84, + 97, + 10, + 147, + 144, + 97, + 22, + 54, + 86, + 91, + 128, 96, 31, - 25, + 1, 96, - 31, - 130, + 32, + 128, + 145, + 4, + 2, + 96, + 32, 1, - 22, - 130, + 96, + 64, + 81, + 144, + 129, 1, - 128, 96, 64, 82, - 80, + 128, + 146, + 145, + 144, 129, + 129, + 82, + 96, + 32, 1, - 144, + 130, + 128, + 84, 97, - 11, - 211, - 145, + 10, + 191, 144, 97, - 26, - 103, - 86, - 91, - 148, - 147, - 80, - 80, - 80, - 80, + 22, + 54, 86, 91, + 128, + 21, 97, 11, - 227, - 97, - 16, - 32, - 86, - 91, - 131, - 96, - 0, - 3, - 97, 12, - 38, 87, + 128, 96, - 64, - 81, - 98, - 70, - 27, - 205, - 96, - 229, - 27, - 129, + 31, + 16, + 97, + 10, + 225, + 87, + 97, + 1, + 0, + 128, + 131, + 84, + 4, + 2, + 131, 82, + 145, 96, 32, - 96, - 4, + 1, + 145, + 97, + 11, + 12, + 86, + 91, 130, 1, + 145, + 144, + 96, + 0, 82, 96, - 16, + 32, 96, - 36, - 130, - 1, - 82, - 111, - 18, - 91, - 157, - 152, + 0, + 32, + 144, 91, - 26, - 89, - 8, - 19, + 129, 84, - 213, - 8, - 28, - 155, - 219, - 221, + 129, + 82, + 144, + 96, + 1, + 1, + 144, 96, + 32, + 1, + 128, + 131, + 17, + 97, + 10, + 239, + 87, 130, - 27, + 144, + 3, 96, - 68, + 31, + 22, 130, 1, - 82, + 145, + 91, + 80, + 80, + 80, + 80, + 80, + 144, + 128, 96, - 100, + 2, 1, + 128, + 84, 97, - 2, + 11, + 33, + 144, 97, + 22, + 54, 86, 91, - 129, - 81, - 131, - 81, - 20, - 97, - 12, - 149, - 87, - 96, - 64, - 81, - 98, - 70, - 27, - 205, + 128, 96, - 229, - 27, - 129, - 82, + 31, + 1, 96, 32, - 96, + 128, + 145, 4, - 130, - 1, - 82, - 96, - 53, + 2, 96, - 36, - 130, - 1, - 82, - 127, - 82, - 111, - 111, - 116, - 32, - 108, - 105, - 97, - 98, - 105, - 108, - 105, - 116, - 105, - 101, - 115, - 32, - 115, - 117, - 109, - 115, - 32, - 97, - 110, - 100, 32, - 108, - 105, - 97, - 98, - 105, - 108, - 96, - 68, - 130, 1, - 82, - 116, - 13, - 46, - 141, - 44, - 174, - 100, - 13, - 206, - 173, - 172, - 76, - 174, - 68, - 13, - 173, - 46, - 109, - 172, - 46, - 140, - 109, - 96, - 91, - 27, 96, - 100, - 130, + 64, + 81, + 144, + 129, 1, + 96, + 64, + 82, + 128, + 146, + 145, + 144, + 129, + 129, 82, 96, - 132, + 32, 1, + 130, + 128, + 84, 97, - 2, + 11, + 77, + 144, 97, + 22, + 54, 86, 91, - 96, - 0, - 130, - 81, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, + 128, 21, 97, - 12, - 177, + 11, + 154, 87, + 128, + 96, + 31, + 16, 97, - 12, - 177, + 11, + 111, + 87, 97, - 19, - 25, - 86, - 91, - 96, - 64, - 81, - 144, - 128, - 130, - 82, + 1, + 0, 128, - 96, - 32, + 131, + 84, + 4, 2, + 131, + 82, + 145, 96, 32, 1, + 145, + 97, + 11, + 154, + 86, + 91, 130, 1, + 145, + 144, 96, - 64, + 0, 82, - 128, - 21, - 97, - 12, - 228, - 87, - 129, 96, 32, - 1, - 91, - 96, 96, + 0, + 32, + 144, + 91, + 129, + 84, 129, 82, + 144, 96, - 32, + 1, 1, 144, 96, + 32, 1, - 144, - 3, - 144, - 129, + 128, + 131, + 17, 97, - 12, - 207, + 11, + 125, 87, + 130, 144, - 80, + 3, + 96, + 31, + 22, + 130, + 1, + 145, 91, 80, - 144, 80, + 80, + 80, + 80, + 144, + 128, 96, - 0, - 131, - 81, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 129, - 17, - 21, - 97, - 13, 3, - 87, + 1, + 128, + 84, 97, - 13, - 3, + 11, + 175, + 144, 97, - 19, - 25, + 22, + 54, 86, 91, - 96, - 64, - 81, - 144, - 128, - 130, - 82, 128, 96, + 31, + 1, + 96, 32, + 128, + 145, + 4, 2, 96, 32, 1, - 130, + 96, + 64, + 81, + 144, + 129, 1, 96, 64, 82, 128, - 21, + 146, + 145, + 144, + 129, + 129, + 82, + 96, + 32, + 1, + 130, + 128, + 84, 97, - 13, + 11, + 219, + 144, + 97, + 22, 54, + 86, + 91, + 128, + 21, + 97, + 12, + 40, 87, - 129, + 128, + 96, + 31, + 16, + 97, + 11, + 253, + 87, + 97, + 1, + 0, + 128, + 131, + 84, + 4, + 2, + 131, + 82, + 145, 96, 32, 1, + 145, + 97, + 12, + 40, + 86, 91, + 130, + 1, + 145, + 144, + 96, + 0, + 82, 96, + 32, 96, + 0, + 32, + 144, + 91, + 129, + 84, 129, 82, + 144, 96, - 32, + 1, 1, 144, 96, + 32, 1, - 144, - 3, - 144, - 129, + 128, + 131, + 17, 97, - 13, - 33, + 12, + 11, 87, + 130, 144, - 80, + 3, + 96, + 31, + 22, + 130, + 1, + 145, 91, 80, + 80, + 80, + 80, + 80, 144, 80, + 132, + 86, + 91, + 97, + 12, + 58, + 97, + 15, + 76, + 86, + 91, 96, 0, 91, - 132, + 129, 81, 129, 16, 21, 97, 14, - 220, + 152, 87, - 132, - 129, + 96, + 0, + 130, + 130, 129, 81, 129, 16, 97, - 13, - 87, + 12, + 90, 87, 97, - 13, - 87, + 12, + 90, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -10866,60 +10315,70 @@ pub mod summa { 1, 81, 96, - 32, + 0, 1, 81, - 81, 96, - 0, - 20, - 21, - 128, - 21, - 97, - 13, - 147, - 87, - 80, - 132, - 129, - 129, + 64, 81, - 129, - 16, - 97, - 13, - 129, - 87, + 96, + 32, + 1, 97, - 13, - 129, + 12, + 118, + 145, + 144, 97, 24, - 17, + 181, 86, 91, 96, - 32, - 2, + 64, + 128, + 81, 96, - 32, - 1, + 31, + 25, + 129, + 132, + 3, 1, + 129, + 82, + 145, + 129, + 82, + 129, 81, 96, - 0, + 32, + 146, + 131, 1, - 81, - 81, + 32, 96, 0, - 20, + 129, + 129, + 82, + 96, + 5, + 144, + 147, + 82, + 145, + 32, + 84, + 144, + 145, + 80, + 128, 21, - 91, 97, - 13, - 216, + 12, + 236, 87, 96, 64, @@ -10941,38 +10400,45 @@ pub mod summa { 1, 82, 96, - 22, + 24, 96, 36, 130, 1, 82, - 117, - 73, - 110, - 118, - 97, - 108, - 105, + 127, + 65, + 100, 100, + 114, + 101, + 115, + 115, 32, - 99, + 97, + 108, 114, + 101, + 97, + 100, 121, - 112, - 116, - 111, - 99, - 117, - 114, + 32, + 118, + 101, 114, + 105, + 102, + 105, 101, - 110, - 99, - 121, - 96, - 80, - 27, + 100, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 96, 68, 130, @@ -10983,148 +10449,181 @@ pub mod summa { 1, 97, 2, - 97, + 60, 86, 91, - 133, - 129, + 96, + 3, + 132, + 132, 129, 81, 129, 16, 97, 13, - 234, + 0, 87, 97, 13, - 234, + 0, 97, - 24, - 17, + 22, + 32, 86, 91, 96, 32, + 144, + 129, 2, - 96, - 32, + 145, + 144, + 145, 1, + 129, 1, 81, + 130, + 84, 96, - 0, - 3, - 97, - 14, - 83, - 87, + 1, + 129, + 1, + 132, + 85, 96, - 64, + 0, + 147, + 132, + 82, + 145, + 144, + 146, + 32, + 130, 81, - 98, - 70, - 27, - 205, 96, - 229, - 27, + 4, + 144, + 146, + 2, + 1, + 144, 129, - 82, + 144, + 97, + 13, + 50, + 144, + 130, + 97, + 23, + 96, + 86, + 91, + 80, 96, 32, + 130, + 1, + 81, 96, - 4, + 1, 130, 1, - 82, + 144, + 97, + 13, + 71, + 144, + 130, + 97, + 23, 96, - 41, + 86, + 91, + 80, 96, - 36, + 64, 130, 1, - 82, - 127, - 65, - 108, - 108, - 32, - 114, - 111, - 111, - 116, - 32, - 115, - 117, - 109, - 115, - 32, - 115, - 104, - 111, - 117, - 108, - 100, - 32, - 98, - 101, - 32, - 103, - 114, - 101, - 97, - 116, - 101, - 114, - 32, + 81, 96, - 68, + 2, 130, 1, - 82, - 104, - 116, - 104, + 144, 97, - 110, - 32, - 122, - 101, - 114, - 111, + 13, + 92, + 144, + 130, + 97, + 23, + 96, + 86, + 91, + 80, 96, - 184, - 27, 96, - 100, 130, 1, - 82, + 81, 96, - 132, + 3, + 130, 1, + 144, 97, - 2, + 13, + 113, + 144, + 130, 97, + 23, + 96, 86, 91, + 80, + 80, + 96, + 3, + 84, + 96, + 0, 132, 129, - 129, + 82, + 96, + 5, + 96, + 32, + 82, + 96, + 64, + 144, + 32, + 85, + 80, + 131, 81, + 132, + 144, + 132, + 144, 129, 16, 97, - 14, - 101, + 13, + 154, 87, 97, - 14, - 101, + 13, + 154, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -11139,22 +10638,34 @@ pub mod summa { 0, 1, 81, + 81, + 96, + 0, + 20, + 21, + 128, + 21, + 97, + 13, + 214, + 87, + 80, + 131, 131, - 130, 129, 81, 129, 16, 97, - 14, - 131, + 13, + 196, 87, 97, - 14, - 131, + 13, + 196, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -11164,26 +10675,40 @@ pub mod summa { 32, 1, 1, - 129, - 144, - 82, + 81, + 96, + 32, + 1, + 81, + 81, + 96, + 0, + 20, + 21, + 91, + 128, + 21, + 97, + 14, + 1, + 87, 80, - 132, - 129, + 131, + 131, 129, 81, 129, 16, 97, - 14, - 160, + 13, + 239, 87, 97, - 14, - 160, + 13, + 239, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -11195,25 +10720,38 @@ pub mod summa { 1, 81, 96, - 32, + 64, 1, 81, - 130, - 130, + 81, + 96, + 0, + 20, + 21, + 91, + 128, + 21, + 97, + 14, + 44, + 87, + 80, + 131, + 131, 129, 81, 129, 16, 97, 14, - 190, + 26, 87, 97, 14, - 190, + 26, 97, - 24, - 17, + 22, + 32, 86, 91, 96, @@ -11223,214 +10761,171 @@ pub mod summa { 32, 1, 1, - 129, - 144, - 82, - 80, - 128, - 128, - 97, - 14, - 212, - 144, - 97, - 25, - 140, - 86, + 81, + 96, + 96, + 1, + 81, + 81, + 96, + 0, + 20, + 21, 91, - 145, - 80, - 80, 97, - 13, - 60, - 86, - 91, - 80, + 14, + 131, + 87, 96, 64, - 128, 81, + 98, + 70, + 27, + 205, 96, - 128, - 129, - 1, - 130, - 82, - 135, + 229, + 27, 129, 82, 96, 32, - 128, - 130, - 1, - 136, - 129, - 82, + 96, + 4, 130, - 132, 1, - 134, - 144, 82, 96, + 34, 96, - 131, + 36, + 130, 1, - 133, - 144, - 82, - 96, - 0, - 135, - 129, - 82, - 96, - 4, - 131, 82, - 147, - 144, - 147, + 127, + 73, + 110, + 118, + 97, + 108, + 105, + 100, + 32, + 112, + 114, + 111, + 111, + 102, + 32, + 111, + 102, 32, - 130, - 81, - 129, - 85, - 146, - 81, - 128, - 81, - 146, - 147, - 146, 97, - 15, - 39, - 146, + 100, + 100, + 114, + 101, + 115, + 115, + 32, + 111, + 119, + 110, + 101, + 114, + 115, + 104, 96, + 68, + 130, 1, - 133, - 1, - 146, - 1, - 144, + 82, 97, - 16, - 202, - 86, - 91, - 80, + 6, + 151, 96, - 64, + 244, + 27, + 96, + 100, 130, 1, - 81, - 128, - 81, - 97, - 15, - 67, - 145, + 82, 96, - 2, 132, 1, - 145, - 96, - 32, - 144, - 145, - 1, - 144, 97, - 17, - 21, + 2, + 60, 86, 91, 80, - 96, - 96, - 130, - 1, - 81, + 80, + 128, 128, - 81, 97, - 15, - 95, - 145, - 96, - 3, - 132, - 1, - 145, - 96, - 32, + 14, 144, - 145, - 1, 144, 97, - 17, - 21, + 22, + 248, 86, 91, + 145, 80, - 144, 80, + 97, + 12, + 61, + 86, + 91, 80, - 130, 127, - 136, - 191, - 199, 56, - 156, - 184, - 49, - 234, - 2, - 8, + 35, + 21, + 212, + 213, + 106, + 96, + 53, + 225, + 137, + 155, 255, - 16, - 109, - 166, - 245, - 201, - 248, - 128, - 54, - 186, - 8, - 79, - 30, - 176, - 8, - 210, - 120, - 141, - 61, + 231, + 125, + 155, + 236, + 239, + 175, + 95, + 38, + 80, + 228, + 50, + 59, + 39, + 133, + 72, + 87, + 160, 69, - 153, - 141, - 135, - 135, - 135, + 70, + 88, + 129, 96, 64, 81, 97, - 15, - 151, - 147, - 146, + 14, + 200, 145, 144, 97, - 26, - 137, + 24, + 209, 86, 91, 96, @@ -11440,21 +10935,16 @@ pub mod summa { 145, 3, 144, - 162, - 80, - 80, - 80, - 80, - 80, + 161, 80, 86, 91, 97, - 15, - 175, + 14, + 219, 97, - 16, - 32, + 15, + 76, 86, 91, 96, @@ -11468,8 +10958,8 @@ pub mod summa { 129, 22, 97, - 16, - 20, + 15, + 64, 87, 96, 64, @@ -11555,16 +11045,16 @@ pub mod summa { 1, 97, 2, - 97, + 60, 86, 91, 97, - 16, - 29, + 15, + 73, 129, 97, - 16, - 122, + 15, + 166, 86, 91, 80, @@ -11585,8 +11075,8 @@ pub mod summa { 51, 20, 97, - 5, - 18, + 9, + 208, 87, 96, 64, @@ -11657,7 +11147,7 @@ pub mod summa { 1, 97, 2, - 97, + 60, 86, 91, 96, @@ -11735,84 +11225,9 @@ pub mod summa { 224, 145, 144, - 163, - 80, - 80, - 86, - 91, - 130, - 128, - 84, - 130, - 130, - 85, - 144, - 96, - 0, - 82, - 96, - 32, - 96, - 0, - 32, - 144, - 129, - 1, - 146, - 130, - 21, - 97, - 17, - 5, - 87, - 145, - 96, - 32, - 2, - 130, - 1, - 91, - 130, - 129, - 17, - 21, - 97, - 17, - 5, - 87, - 130, - 81, - 130, - 85, - 145, - 96, - 32, - 1, - 145, - 144, - 96, - 1, - 1, - 144, - 97, - 16, - 234, - 86, - 91, - 80, - 97, - 17, - 17, - 146, - 145, - 80, - 97, - 17, - 103, - 86, - 91, - 80, - 144, + 163, + 80, + 80, 86, 91, 130, @@ -11837,8 +11252,8 @@ pub mod summa { 130, 21, 97, - 17, - 91, + 16, + 60, 87, 145, 96, @@ -11852,21 +11267,21 @@ pub mod summa { 17, 21, 97, - 17, - 91, + 16, + 60, 87, 130, 81, 130, 144, 97, - 17, - 75, + 16, + 44, 144, 130, 97, - 24, - 204, + 23, + 96, 86, 91, 80, @@ -11881,41 +11296,24 @@ pub mod summa { 1, 144, 97, - 17, - 53, + 16, + 22, 86, 91, 80, 97, - 17, - 17, + 16, + 72, 146, 145, 80, 97, - 17, - 124, + 16, + 76, 86, 91, - 91, - 128, - 130, - 17, - 21, - 97, - 17, - 17, - 87, - 96, - 0, - 129, - 85, - 96, - 1, - 1, - 97, - 17, - 104, + 80, + 144, 86, 91, 128, @@ -11923,19 +11321,19 @@ pub mod summa { 17, 21, 97, - 17, - 17, + 16, + 72, 87, 96, 0, 97, - 17, - 144, + 16, + 96, 130, 130, 97, - 17, - 153, + 16, + 105, 86, 91, 80, @@ -11943,20 +11341,20 @@ pub mod summa { 1, 1, 97, - 17, - 124, + 16, + 76, 86, 91, 80, 128, 84, 97, - 17, - 165, + 16, + 117, 144, 97, - 24, - 39, + 22, + 54, 86, 91, 96, @@ -11968,8 +11366,8 @@ pub mod summa { 31, 16, 97, - 17, - 181, + 16, + 133, 87, 80, 80, @@ -11996,13 +11394,29 @@ pub mod summa { 1, 144, 97, - 16, - 29, + 15, + 73, 145, 144, - 97, + 91, + 128, + 130, 17, - 103, + 21, + 97, + 16, + 72, + 87, + 96, + 0, + 129, + 85, + 96, + 1, + 1, + 97, + 16, + 159, 86, 91, 96, @@ -12015,8 +11429,8 @@ pub mod summa { 18, 21, 97, - 17, - 229, + 16, + 197, 87, 96, 0, @@ -12038,8 +11452,8 @@ pub mod summa { 16, 21, 97, - 18, - 7, + 16, + 231, 87, 129, 129, @@ -12053,8 +11467,8 @@ pub mod summa { 32, 1, 97, - 17, - 239, + 16, + 207, 86, 91, 80, @@ -12074,8 +11488,8 @@ pub mod summa { 132, 82, 97, - 18, - 40, + 17, + 8, 129, 96, 32, @@ -12086,8 +11500,8 @@ pub mod summa { 134, 1, 97, - 17, - 236, + 16, + 204, 86, 91, 96, @@ -12119,16 +11533,16 @@ pub mod summa { 132, 82, 97, - 18, - 81, + 17, + 49, 96, 128, 133, 1, 130, 97, - 18, 16, + 240, 86, 91, 144, @@ -12147,186 +11561,98 @@ pub mod summa { 1, 82, 97, - 18, - 106, - 130, - 130, - 97, - 18, - 16, - 86, - 91, - 145, - 80, - 80, - 96, - 64, - 131, - 1, - 81, - 132, - 130, - 3, - 96, - 64, - 134, - 1, - 82, - 97, - 18, - 132, - 130, - 130, - 97, - 18, - 16, - 86, - 91, - 145, - 80, - 80, - 96, - 96, - 131, - 1, - 81, - 132, - 130, - 3, - 96, - 96, - 134, - 1, - 82, - 97, - 18, - 158, - 130, - 130, - 97, - 18, - 16, - 86, - 91, - 149, - 148, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 32, - 129, - 82, - 96, - 0, - 97, - 18, - 186, - 96, - 32, - 131, - 1, - 132, - 97, - 18, - 60, - 86, - 91, - 147, - 146, - 80, - 80, - 80, - 86, - 91, - 96, - 128, - 129, - 82, - 96, - 0, - 97, - 18, - 212, - 96, - 128, - 131, - 1, - 135, - 97, - 18, - 16, - 86, - 91, + 17, + 74, + 130, 130, - 129, - 3, - 96, - 32, - 132, - 1, - 82, - 97, - 18, - 230, - 129, - 135, 97, - 18, 16, + 240, 86, 91, - 144, + 145, + 80, 80, + 96, + 64, + 131, + 1, + 81, + 132, 130, - 129, 3, 96, 64, - 132, + 134, 1, 82, 97, - 18, - 250, - 129, - 134, + 17, + 100, + 130, + 130, 97, - 18, 16, + 240, 86, 91, - 144, + 145, + 80, 80, + 96, + 96, + 131, + 1, + 81, + 132, 130, - 129, 3, 96, 96, - 132, + 134, 1, 82, 97, - 19, - 14, - 129, - 133, + 17, + 126, + 130, + 130, 97, - 18, 16, + 240, 86, 91, - 151, - 150, + 149, + 148, 80, 80, 80, 80, 80, + 86, + 91, + 96, + 32, + 129, + 82, + 96, + 0, + 97, + 17, + 154, + 96, + 32, + 131, + 1, + 132, + 97, + 17, + 28, + 86, + 91, + 147, + 146, + 80, 80, 80, 86, @@ -12355,9 +11681,9 @@ pub mod summa { 91, 96, 64, - 81, - 96, 128, + 81, + 144, 129, 1, 103, @@ -12377,15 +11703,15 @@ pub mod summa { 23, 21, 97, - 19, - 82, + 17, + 218, 87, 97, - 19, - 82, + 17, + 218, 97, - 19, - 25, + 17, + 161, 86, 91, 96, @@ -12396,9 +11722,9 @@ pub mod summa { 91, 96, 64, - 128, 81, - 144, + 96, + 128, 129, 1, 103, @@ -12418,15 +11744,15 @@ pub mod summa { 23, 21, 97, - 19, - 82, + 17, + 218, 87, 97, - 19, - 82, + 17, + 218, 97, - 19, - 25, + 17, + 161, 86, 91, 96, @@ -12459,15 +11785,15 @@ pub mod summa { 23, 21, 97, - 19, - 164, + 18, + 44, 87, 97, - 19, - 164, + 18, + 44, 97, - 19, - 25, + 17, + 161, 86, 91, 96, @@ -12480,42 +11806,6 @@ pub mod summa { 91, 96, 0, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 130, - 17, - 21, - 97, - 19, - 198, - 87, - 97, - 19, - 198, - 97, - 19, - 25, - 86, - 91, - 80, - 96, - 5, - 27, - 96, - 32, - 1, - 144, - 86, - 91, - 96, - 0, 130, 96, 31, @@ -12523,8 +11813,8 @@ pub mod summa { 1, 18, 97, - 19, - 225, + 18, + 69, 87, 96, 0, @@ -12546,20 +11836,20 @@ pub mod summa { 17, 21, 97, - 19, - 251, + 18, + 95, 87, 97, - 19, - 251, + 18, + 95, 97, - 19, - 25, + 17, + 161, 86, 91, 97, - 20, - 14, + 18, + 114, 96, 31, 130, @@ -12572,8 +11862,8 @@ pub mod summa { 32, 1, 97, - 19, - 123, + 18, + 3, 86, 91, 129, @@ -12589,8 +11879,8 @@ pub mod summa { 17, 21, 97, - 20, - 35, + 18, + 135, 87, 96, 0, @@ -12628,24 +11918,62 @@ pub mod summa { 91, 96, 0, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 130, + 17, + 21, + 97, + 18, + 190, + 87, + 97, + 18, + 190, + 97, + 17, + 161, + 86, + 91, + 80, + 96, + 5, + 27, 96, 32, + 1, + 144, + 86, + 91, + 96, + 0, 128, - 131, - 133, + 96, + 0, + 96, + 96, + 132, + 134, 3, 18, 21, 97, - 20, - 83, + 18, + 221, 87, 96, 0, 128, 253, 91, - 130, + 131, 53, 103, 255, @@ -12661,51 +11989,83 @@ pub mod summa { 17, 21, 97, - 20, - 107, + 18, + 245, + 87, + 96, + 0, + 128, + 253, + 91, + 97, + 19, + 1, + 135, + 131, + 136, + 1, + 97, + 18, + 52, + 86, + 91, + 148, + 80, + 96, + 32, + 145, + 80, + 129, + 134, + 1, + 53, + 129, + 129, + 17, + 21, + 97, + 19, + 24, 87, 96, 0, 128, 253, 91, - 129, - 133, + 134, 1, - 145, - 80, - 133, 96, 31, - 131, + 129, 1, - 18, + 136, + 19, 97, - 20, - 127, + 19, + 41, 87, 96, 0, 128, 253, 91, - 129, + 128, 53, 97, - 20, - 146, + 19, + 60, 97, - 20, - 141, + 19, + 55, 130, 97, - 19, - 172, + 18, + 164, 86, 91, 97, - 19, - 123, + 18, + 3, 86, 91, 129, @@ -12717,7 +12077,7 @@ pub mod summa { 144, 145, 27, - 131, + 130, 1, 132, 1, @@ -12726,13 +12086,13 @@ pub mod summa { 129, 1, 144, - 136, + 138, 131, 17, 21, 97, - 20, - 177, + 19, + 91, 87, 96, 0, @@ -12740,7 +12100,7 @@ pub mod summa { 253, 91, 133, - 133, + 132, 1, 91, 131, @@ -12748,30 +12108,30 @@ pub mod summa { 16, 21, 97, - 21, - 146, + 19, + 236, 87, 128, 53, - 133, + 134, 129, 17, 21, 97, - 20, - 204, + 19, + 118, 87, 96, 0, 128, 253, 91, - 134, + 133, 1, 96, - 128, + 64, 129, - 140, + 142, 3, 96, 31, @@ -12780,71 +12140,8 @@ pub mod summa { 18, 21, 97, - 20, - 227, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 20, - 235, - 97, 19, - 47, - 86, - 91, - 136, - 130, - 1, - 53, - 135, - 129, - 17, - 21, - 97, - 20, - 253, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 21, - 11, 141, - 139, - 131, - 134, - 1, - 1, - 97, - 19, - 208, - 86, - 91, - 130, - 82, - 80, - 96, - 64, - 128, - 131, - 1, - 53, - 136, - 129, - 17, - 21, - 97, - 21, - 34, 87, 96, 0, @@ -12853,226 +12150,117 @@ pub mod summa { 253, 91, 97, - 21, - 48, - 142, - 140, - 131, - 135, - 1, - 1, - 97, 19, - 208, - 86, - 91, - 139, - 132, - 1, - 82, - 80, - 96, - 96, - 128, - 132, - 1, - 53, - 137, - 129, - 17, - 21, - 97, - 21, - 73, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 21, - 87, - 143, - 141, - 131, - 136, - 1, - 1, + 149, 97, - 19, - 208, - 86, - 91, - 131, - 133, - 1, - 82, - 80, - 96, - 128, - 132, - 1, - 53, - 145, - 80, - 136, - 130, 17, - 21, - 97, - 21, - 113, - 87, - 96, - 0, - 128, - 129, - 253, - 91, - 97, - 21, - 127, - 142, - 140, - 132, - 135, - 1, - 1, - 97, - 19, - 208, - 86, - 91, - 144, - 131, - 1, - 82, - 80, - 132, - 82, - 80, - 145, - 134, - 1, - 145, - 134, - 1, - 97, - 20, - 181, - 86, - 91, - 80, - 152, - 151, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, + 183, 86, 91, - 96, - 0, + 136, 130, - 96, - 31, - 131, 1, - 18, - 97, + 53, + 136, + 129, + 17, 21, - 176, + 97, + 19, + 167, 87, 96, 0, 128, + 129, 253, 91, - 129, - 53, - 96, - 32, - 97, - 21, - 192, 97, - 20, - 141, + 19, + 181, + 143, + 139, 131, + 134, + 1, + 1, 97, - 19, - 172, + 18, + 52, 86, 91, 130, - 129, 82, + 80, 96, - 5, - 146, - 144, - 146, - 27, - 132, - 1, - 129, + 64, + 130, 1, - 145, - 129, + 53, + 136, 129, - 1, - 144, - 134, - 132, 17, 21, 97, - 21, - 223, + 19, + 203, 87, 96, 0, 128, + 129, 253, 91, - 130, + 97, + 19, + 217, + 143, + 139, + 131, 134, 1, + 1, + 97, + 18, + 52, + 86, 91, + 130, + 139, + 1, + 82, + 80, 132, - 129, - 16, - 21, - 97, - 21, - 250, - 87, - 128, - 53, - 131, 82, + 80, 145, - 131, + 134, 1, 145, - 131, + 134, 1, 97, - 21, - 227, + 19, + 95, 86, 91, 80, - 150, - 149, + 151, + 154, + 151, + 153, + 80, + 80, 80, 80, + 96, + 64, + 149, + 144, + 149, + 1, + 53, + 148, 80, 80, 80, @@ -13080,144 +12268,132 @@ pub mod summa { 86, 91, 96, - 0, - 128, + 32, + 129, + 82, 96, 0, + 97, + 17, + 154, 96, - 96, + 32, + 131, + 1, 132, - 134, - 3, - 18, - 21, 97, - 22, - 26, - 87, - 96, - 0, - 128, - 253, + 16, + 240, + 86, 91, - 131, - 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, + 96, 128, - 130, - 17, - 21, - 97, - 22, - 50, - 87, + 129, + 82, 96, 0, - 128, - 253, - 91, 97, - 22, - 62, - 135, + 20, + 41, + 96, + 128, 131, - 136, 1, + 135, 97, - 19, - 208, + 16, + 240, 86, 91, - 148, - 80, + 130, + 129, + 3, 96, 32, - 134, + 132, 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, + 82, 97, - 22, - 84, - 87, - 96, - 0, - 128, - 253, + 20, + 59, + 129, + 135, + 97, + 16, + 240, + 86, 91, + 144, 80, - 97, - 22, - 97, - 134, 130, - 135, + 129, + 3, + 96, + 64, + 132, 1, + 82, 97, - 21, - 159, + 20, + 79, + 129, + 134, + 97, + 16, + 240, 86, 91, - 146, - 80, + 144, 80, + 130, + 129, + 3, + 96, 96, - 64, 132, 1, - 53, - 144, + 82, + 97, + 20, + 99, + 129, + 133, + 97, + 16, + 240, + 86, + 91, + 151, + 150, + 80, + 80, + 80, + 80, 80, - 146, 80, - 146, 80, - 146, 86, 91, 96, 0, - 128, - 96, - 0, - 128, 96, + 32, 128, + 131, 133, - 135, 3, 18, 21, 97, - 22, - 136, + 20, + 129, 87, 96, 0, 128, 253, 91, - 132, - 53, - 147, - 80, - 96, - 32, - 133, - 1, + 130, 53, 103, 255, @@ -13233,42 +12409,8 @@ pub mod summa { 17, 21, 97, - 22, - 167, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 22, - 179, - 136, - 131, - 137, - 1, - 97, - 21, - 159, - 86, - 91, - 148, - 80, - 96, - 64, - 135, - 1, - 53, - 145, - 80, - 128, - 130, - 17, - 21, - 97, - 22, - 201, + 20, + 153, 87, 96, 0, @@ -13276,104 +12418,103 @@ pub mod summa { 253, 91, 129, - 135, + 133, 1, 145, 80, - 135, + 133, 96, 31, 131, 1, 18, 97, - 22, - 221, + 20, + 173, 87, 96, 0, 128, 253, 91, - 97, - 22, - 234, + 129, + 53, 97, 20, - 141, - 131, - 53, + 187, 97, 19, - 172, + 55, + 130, + 97, + 18, + 164, 86, 91, - 130, - 53, - 128, - 130, + 129, + 129, 82, 96, - 32, - 128, - 131, - 1, - 146, - 145, - 96, 5, + 145, + 144, + 145, 27, - 133, + 131, 1, + 132, 1, - 138, + 144, + 132, 129, + 1, + 144, + 136, + 131, 17, 21, 97, - 23, - 9, + 20, + 218, 87, 96, 0, 128, 253, 91, - 96, - 32, + 133, 133, 1, 91, - 129, + 131, 129, 16, 21, 97, - 23, - 165, + 21, + 187, 87, - 132, - 129, + 128, 53, + 133, + 129, 17, 21, 97, - 23, - 36, + 20, + 245, 87, 96, 0, 128, 253, 91, - 128, - 53, 134, 1, 96, - 64, + 128, 129, - 142, + 140, 3, 96, 31, @@ -13382,720 +12523,464 @@ pub mod summa { 18, 21, 97, - 23, - 60, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 23, - 68, - 97, - 19, - 88, - 86, - 91, - 96, - 32, - 130, - 1, - 53, - 135, - 129, - 17, 21, - 97, - 23, - 86, + 12, 87, 96, 0, 128, - 253, - 91, - 97, - 23, - 101, - 143, - 96, - 32, - 131, - 134, - 1, - 1, - 97, - 19, - 208, - 86, - 91, - 130, - 82, - 80, - 96, - 64, - 130, - 1, - 53, - 135, 129, - 17, - 21, - 97, - 23, - 122, - 87, - 96, - 0, - 128, 253, 91, 97, - 23, - 137, - 143, - 96, - 32, - 131, - 134, - 1, - 1, - 97, - 19, - 208, - 86, - 91, - 96, - 32, - 131, - 1, - 82, - 80, - 128, - 134, - 82, - 80, - 80, - 96, - 32, - 132, - 1, - 147, - 80, - 96, - 32, - 129, - 1, - 144, - 80, - 97, - 23, - 14, - 86, - 91, - 80, - 151, - 154, - 150, - 153, - 80, - 151, - 96, - 96, - 1, - 53, - 150, - 80, - 80, - 80, - 80, - 80, - 80, + 21, + 20, + 97, + 17, + 224, 86, 91, - 96, - 0, - 96, - 32, + 136, 130, - 132, - 3, - 18, + 1, + 53, + 135, + 129, + 17, 21, 97, - 23, - 203, + 21, + 38, 87, 96, 0, 128, + 129, 253, 91, - 129, - 53, - 96, + 97, + 21, + 52, + 141, + 139, + 131, + 134, 1, - 96, 1, - 96, - 160, - 27, - 3, - 129, - 22, - 129, - 20, 97, 18, - 186, - 87, - 96, - 0, - 128, - 253, + 52, + 86, 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 17, - 96, - 4, + 130, 82, + 80, 96, - 36, - 96, - 0, - 253, - 91, - 129, - 129, - 3, - 129, + 64, + 128, + 131, + 1, + 53, + 136, 129, 17, 21, 97, - 24, - 11, + 21, + 75, 87, + 96, + 0, + 128, + 129, + 253, + 91, 97, - 24, - 11, + 21, + 89, + 142, + 140, + 131, + 135, + 1, + 1, 97, - 23, - 226, - 86, - 91, - 146, - 145, - 80, - 80, + 18, + 52, 86, 91, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, + 139, + 132, + 1, 82, + 80, 96, - 50, - 96, - 4, - 82, 96, - 36, + 128, + 132, + 1, + 53, + 137, + 129, + 17, + 21, + 97, + 21, + 114, + 87, 96, 0, + 128, + 129, 253, 91, - 96, - 1, - 129, - 129, - 28, - 144, - 130, - 22, + 97, + 21, 128, + 143, + 141, + 131, + 136, + 1, + 1, 97, - 24, - 59, - 87, + 18, + 52, + 86, + 91, + 131, + 133, + 1, + 82, + 80, 96, - 127, - 130, - 22, + 128, + 132, + 1, + 53, 145, 80, - 91, - 96, - 32, + 136, 130, - 16, - 129, - 3, + 17, + 21, 97, - 24, - 91, + 21, + 154, 87, - 99, - 78, - 72, - 123, - 113, - 96, - 224, - 27, - 96, - 0, - 82, - 96, - 34, - 96, - 4, - 82, - 96, - 36, 96, 0, + 128, + 129, 253, 91, - 80, - 145, - 144, - 80, - 86, - 91, - 96, - 0, - 130, - 81, 97, - 24, - 115, - 129, + 21, + 168, + 142, + 140, 132, - 96, - 32, 135, 1, + 1, 97, - 17, - 236, + 18, + 52, 86, 91, - 145, 144, + 131, + 1, + 82, + 80, + 132, + 82, + 80, 145, + 134, 1, - 146, 145, + 134, + 1, + 97, + 20, + 222, + 86, + 91, + 80, + 152, + 151, + 80, + 80, + 80, + 80, + 80, + 80, 80, 80, 86, 91, 96, - 31, + 0, + 96, + 32, 130, - 17, + 132, + 3, + 18, 21, 97, - 24, - 199, + 21, + 218, 87, 96, 0, + 128, + 253, + 91, 129, - 129, - 82, - 96, - 32, - 129, - 32, + 53, 96, - 31, - 133, 1, 96, - 5, - 28, - 129, 1, 96, - 32, - 134, - 16, - 21, + 160, + 27, + 3, + 129, + 22, + 129, + 20, 97, - 24, - 164, + 17, + 154, 87, - 80, + 96, + 0, 128, + 253, 91, + 99, + 78, + 72, + 123, + 113, 96, - 31, - 133, - 1, + 224, + 27, 96, - 5, - 28, - 130, - 1, - 145, - 80, + 0, + 82, + 96, + 17, + 96, + 4, + 82, + 96, + 36, + 96, + 0, + 253, 91, 129, 129, - 16, - 21, - 97, - 24, - 195, - 87, - 130, - 129, - 85, - 96, - 1, - 1, - 97, - 24, - 176, - 86, - 91, - 80, - 80, - 80, - 91, - 80, - 80, - 80, - 86, - 91, + 3, 129, - 81, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, 129, 17, 21, 97, - 24, - 230, + 22, + 26, 87, 97, - 24, - 230, - 97, - 19, - 25, - 86, - 91, - 97, - 24, - 250, - 129, - 97, - 24, - 244, - 132, - 84, + 22, + 26, 97, - 24, - 39, + 21, + 241, 86, 91, - 132, - 97, - 24, - 125, + 146, + 145, + 80, + 80, 86, 91, + 99, + 78, + 72, + 123, + 113, 96, - 32, - 128, - 96, - 31, - 131, - 17, - 96, - 1, - 129, - 20, - 97, - 25, - 47, - 87, + 224, + 27, 96, 0, - 132, - 21, - 97, - 25, - 23, - 87, - 80, - 133, - 131, - 1, - 81, - 91, + 82, 96, - 0, - 25, + 50, 96, - 3, - 134, - 144, - 27, - 28, - 25, - 22, + 4, + 82, 96, - 1, - 133, - 144, - 27, - 23, - 133, - 85, - 97, - 24, - 195, - 86, - 91, + 36, 96, 0, - 133, - 129, - 82, + 253, + 91, 96, - 32, + 1, 129, - 32, - 96, - 31, - 25, - 134, - 22, - 145, - 91, - 130, 129, - 16, - 21, + 28, + 144, + 130, + 22, + 128, 97, - 25, - 94, + 22, + 74, 87, - 136, - 134, - 1, - 81, - 130, - 85, - 148, - 132, - 1, - 148, 96, - 1, - 144, + 127, + 130, + 22, 145, - 1, - 144, - 132, - 1, - 97, - 25, - 63, - 86, - 91, 80, - 133, + 91, + 96, + 32, 130, 16, - 21, + 129, + 3, 97, - 25, - 124, + 22, + 106, 87, - 135, - 133, - 1, - 81, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, 96, 0, - 25, + 82, 96, - 3, - 136, - 144, - 27, + 34, 96, - 248, - 22, - 28, - 25, - 22, - 129, - 85, + 4, + 82, + 96, + 36, + 96, + 0, + 253, 91, 80, - 80, - 80, - 80, - 80, - 96, - 1, - 144, - 129, - 27, - 1, + 145, 144, - 85, 80, 86, 91, 96, - 0, - 96, - 1, - 130, 1, - 97, - 25, - 158, - 87, - 97, - 25, - 158, - 97, - 23, - 226, - 86, - 91, - 80, 96, 1, - 1, - 144, - 86, - 91, 96, - 0, + 160, + 27, + 3, + 132, + 22, + 129, + 82, + 96, + 96, 96, 32, 128, 131, 1, - 129, - 132, + 130, + 144, 82, - 128, + 96, + 0, + 145, + 97, + 22, + 149, + 144, + 132, + 1, + 134, + 97, + 16, + 240, + 86, + 91, + 131, + 129, + 3, + 96, + 64, 133, + 1, + 82, + 132, 81, 128, - 131, + 130, 82, - 96, - 64, + 130, 134, 1, 145, - 80, - 96, - 64, - 129, - 96, - 5, - 27, - 135, - 1, - 1, - 146, - 80, 131, - 135, 1, + 144, 96, 0, 91, - 130, + 129, 129, 16, 21, 97, - 25, - 250, + 22, + 200, 87, - 96, - 63, - 25, - 136, - 134, - 3, - 1, - 132, - 82, - 97, - 25, - 232, - 133, 131, 81, - 97, - 18, - 60, - 86, - 91, - 148, - 80, + 131, + 82, 146, - 133, + 132, 1, 146, - 144, - 133, + 145, + 132, 1, - 144, + 145, 96, 1, 1, 97, - 25, - 204, + 22, + 172, 86, 91, 80, - 146, + 144, + 152, 151, - 150, + 80, 80, 80, 80, @@ -14107,162 +12992,355 @@ pub mod summa { 91, 96, 0, + 96, + 32, + 130, + 132, + 3, + 18, + 21, + 97, + 22, + 232, + 87, + 96, + 0, + 128, + 253, + 91, 129, 81, 128, - 132, + 21, + 21, + 129, + 20, + 97, + 17, + 154, + 87, + 96, + 0, + 128, + 253, + 91, + 96, + 0, + 96, + 1, + 130, + 1, + 97, + 23, + 10, + 87, + 97, + 23, + 10, + 97, + 21, + 241, + 86, + 91, + 80, + 96, + 1, + 1, + 144, + 86, + 91, + 96, + 31, + 130, + 17, + 21, + 97, + 23, + 91, + 87, + 96, + 0, + 129, + 129, 82, 96, 32, - 128, + 129, + 32, + 96, + 31, 133, 1, - 148, + 96, + 5, + 28, + 129, + 1, + 96, + 32, + 134, + 16, + 21, + 97, + 23, + 56, + 87, 80, 128, - 132, + 91, + 96, + 31, + 133, 1, 96, - 0, + 5, + 28, + 130, + 1, + 145, + 80, 91, - 131, + 129, 129, 16, 21, 97, - 26, - 55, + 23, + 87, 87, - 129, - 81, - 135, - 82, - 149, - 130, - 1, - 149, - 144, 130, - 1, - 144, + 129, + 85, 96, 1, 1, 97, - 26, - 27, + 23, + 68, 86, 91, 80, - 148, - 149, - 148, 80, 80, + 91, 80, 80, 80, 86, 91, + 129, + 81, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 21, + 97, + 23, + 122, + 87, + 97, + 23, + 122, + 97, + 17, + 161, + 86, + 91, + 97, + 23, + 142, + 129, + 97, + 23, + 136, + 132, + 84, + 97, + 22, + 54, + 86, + 91, + 132, + 97, + 23, + 17, + 86, + 91, 96, - 64, + 32, + 128, + 96, + 31, + 131, + 17, + 96, + 1, 129, - 82, + 20, + 97, + 23, + 195, + 87, 96, 0, + 132, + 21, 97, - 26, - 85, - 96, - 64, + 23, + 171, + 87, + 80, + 133, 131, 1, - 133, - 97, - 26, - 7, - 86, + 81, 91, - 130, - 129, + 96, + 0, + 25, + 96, 3, + 134, + 144, + 27, + 28, + 25, + 22, 96, - 32, - 132, 1, - 82, - 97, - 18, - 158, - 129, 133, + 144, + 27, + 23, + 133, + 85, 97, - 18, - 16, + 23, + 87, 86, 91, 96, 0, + 133, + 129, + 82, 96, 32, + 129, + 32, + 96, + 31, + 25, + 134, + 22, + 145, + 91, 130, - 132, - 3, - 18, + 129, + 16, 21, 97, - 26, - 121, + 23, + 242, 87, + 136, + 134, + 1, + 81, + 130, + 85, + 148, + 132, + 1, + 148, 96, - 0, - 128, - 253, + 1, + 144, + 145, + 1, + 144, + 132, + 1, + 97, + 23, + 211, + 86, 91, - 129, - 81, - 128, - 21, + 80, + 133, + 130, + 16, 21, - 129, - 20, 97, - 18, - 186, + 24, + 16, 87, + 135, + 133, + 1, + 81, 96, 0, - 128, - 253, - 91, - 131, - 129, - 82, - 96, - 0, + 25, 96, - 32, + 3, + 136, + 144, + 27, 96, + 248, + 22, + 28, + 25, + 22, + 129, + 85, + 91, + 80, + 80, + 80, + 80, + 80, 96, + 1, + 144, 129, - 132, + 27, 1, - 82, - 97, - 26, - 163, + 144, + 85, + 80, + 86, + 91, 96, + 0, 96, + 64, + 128, + 131, + 82, + 97, + 24, + 51, + 129, 132, 1, 134, 97, - 26, - 7, + 16, + 240, 86, 91, 96, - 64, + 32, 132, 130, 3, @@ -14276,12 +13354,12 @@ pub mod summa { 128, 132, 82, - 132, + 130, 132, 1, 145, 80, - 132, + 130, 129, 96, 5, @@ -14289,7 +13367,7 @@ pub mod summa { 133, 1, 1, - 133, + 131, 137, 1, 96, @@ -14300,8 +13378,8 @@ pub mod summa { 16, 21, 97, - 27, - 21, + 24, + 165, 87, 134, 131, @@ -14316,47 +13394,47 @@ pub mod summa { 81, 128, 81, - 135, + 137, 133, 82, 97, - 26, - 233, - 136, + 24, + 121, + 138, 134, 1, 130, 97, - 18, 16, + 240, 86, 91, 145, - 138, + 136, 1, 81, 133, 131, 3, 134, - 140, + 138, 1, 82, 145, 144, 80, 97, - 27, - 1, + 24, + 145, 129, 131, 97, - 18, 16, + 240, 86, 91, 150, - 138, + 136, 1, 150, 148, @@ -14364,25 +13442,150 @@ pub mod summa { 80, 80, 144, - 135, + 133, 1, 144, 96, 1, 1, 97, - 26, - 197, + 24, + 85, 86, 91, 80, 144, - 155, 154, + 153, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, 80, + 86, + 91, + 96, + 0, + 130, + 81, + 97, + 24, + 199, + 129, + 132, + 96, + 32, + 135, + 1, + 97, + 16, + 204, + 86, + 91, + 145, + 144, + 145, + 1, + 146, + 145, + 80, + 80, + 86, + 91, + 96, + 0, + 96, + 32, + 128, + 131, + 1, + 129, + 132, + 82, + 128, + 133, + 81, + 128, + 131, + 82, + 96, + 64, + 134, + 1, + 145, + 80, + 96, + 64, + 129, + 96, + 5, + 27, + 135, + 1, + 1, + 146, 80, + 131, + 135, + 1, + 96, + 0, + 91, + 130, + 129, + 16, + 21, + 97, + 25, + 38, + 87, + 96, + 63, + 25, + 136, + 134, + 3, + 1, + 132, + 82, + 97, + 25, + 20, + 133, + 131, + 81, + 97, + 17, + 28, + 86, + 91, + 148, 80, + 146, + 133, + 1, + 146, + 144, + 133, + 1, + 144, + 96, + 1, + 1, + 97, + 24, + 248, + 86, + 91, 80, + 146, + 151, + 150, 80, 80, 80, @@ -14402,38 +13605,38 @@ pub mod summa { 34, 18, 32, - 69, - 217, - 51, + 14, + 212, + 173, + 33, + 249, + 5, + 195, + 118, + 163, + 194, + 120, + 87, + 244, + 94, + 231, + 128, + 9, + 167, + 245, 111, - 11, - 99, + 232, 20, - 121, - 100, - 150, - 199, - 161, - 207, - 22, - 12, - 25, - 180, - 42, - 97, - 148, - 58, - 144, - 251, - 91, - 190, - 44, - 252, - 239, - 16, + 185, + 115, + 203, + 184, + 216, + 227, + 222, + 145, + 247, 123, - 181, - 219, 100, 115, 111, @@ -14547,7 +13750,10 @@ pub mod summa { pub fn commitments( &self, p0: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Bytes, + > { self.0 .method_hash([73, 206, 137, 151], p0) .expect("method not found (this should never happen)") @@ -14555,7 +13761,7 @@ pub mod summa { ///Calls the contract's `config` (0x79502c55) function pub fn config( &self, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash([121, 80, 44, 85], ()) .expect("method not found (this should never happen)") @@ -14588,19 +13794,15 @@ pub mod summa { .method_hash([113, 80, 24, 166], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `submitCommitment` (0xda64a750) function + ///Calls the contract's `submitCommitment` (0x43f9ec07) function pub fn submit_commitment( &self, - mst_root: ::ethers::core::types::U256, - root_balances: ::std::vec::Vec<::ethers::core::types::U256>, + proof: ::ethers::core::types::Bytes, cryptocurrencies: ::std::vec::Vec, timestamp: ::ethers::core::types::U256, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash( - [218, 100, 167, 80], - (mst_root, root_balances, cryptocurrencies, timestamp), - ) + .method_hash([67, 249, 236, 7], (proof, cryptocurrencies, timestamp)) .expect("method not found (this should never happen)") } ///Calls the contract's `submitProofOfAddressOwnership` (0xc7ddca0e) function @@ -14621,15 +13823,15 @@ pub mod summa { .method_hash([242, 253, 227, 139], new_owner) .expect("method not found (this should never happen)") } - ///Calls the contract's `verifyInclusionProof` (0xc8e58147) function - pub fn verify_inclusion_proof( + ///Calls the contract's `verificationKey` (0x7ddc907d) function + pub fn verification_key( &self, - proof: ::ethers::core::types::Bytes, - public_inputs: ::std::vec::Vec<::ethers::core::types::U256>, - timestamp: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + ::ethers::core::types::Address, + > { self.0 - .method_hash([200, 229, 129, 71], (proof, public_inputs, timestamp)) + .method_hash([125, 220, 144, 125], ()) .expect("method not found (this should never happen)") } ///Gets the contract's `AddressOwnershipProofSubmitted` event @@ -14704,13 +13906,12 @@ pub mod summa { )] #[ethevent( name = "LiabilitiesCommitmentSubmitted", - abi = "LiabilitiesCommitmentSubmitted(uint256,uint256,uint256[],(string,string)[])" + abi = "LiabilitiesCommitmentSubmitted(uint256,bytes,(string,string)[])" )] pub struct LiabilitiesCommitmentSubmittedFilter { #[ethevent(indexed)] pub timestamp: ::ethers::core::types::U256, - pub mst_root: ::ethers::core::types::U256, - pub root_balances: ::std::vec::Vec<::ethers::core::types::U256>, + pub proof: ::ethers::core::types::Bytes, pub cryptocurrencies: ::std::vec::Vec, } #[derive( @@ -14869,7 +14070,7 @@ pub mod summa { )] #[ethcall(name = "renounceOwnership", abi = "renounceOwnership()")] pub struct RenounceOwnershipCall; - ///Container type for all input parameters for the `submitCommitment` function with signature `submitCommitment(uint256,uint256[],(string,string)[],uint256)` and selector `0xda64a750` + ///Container type for all input parameters for the `submitCommitment` function with signature `submitCommitment(bytes,(string,string)[],uint256)` and selector `0x43f9ec07` #[derive( Clone, ::ethers::contract::EthCall, @@ -14882,11 +14083,10 @@ pub mod summa { )] #[ethcall( name = "submitCommitment", - abi = "submitCommitment(uint256,uint256[],(string,string)[],uint256)" + abi = "submitCommitment(bytes,(string,string)[],uint256)" )] pub struct SubmitCommitmentCall { - pub mst_root: ::ethers::core::types::U256, - pub root_balances: ::std::vec::Vec<::ethers::core::types::U256>, + pub proof: ::ethers::core::types::Bytes, pub cryptocurrencies: ::std::vec::Vec, pub timestamp: ::ethers::core::types::U256, } @@ -14923,7 +14123,7 @@ pub mod summa { pub struct TransferOwnershipCall { pub new_owner: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `verifyInclusionProof` function with signature `verifyInclusionProof(bytes,uint256[],uint256)` and selector `0xc8e58147` + ///Container type for all input parameters for the `verificationKey` function with signature `verificationKey()` and selector `0x7ddc907d` #[derive( Clone, ::ethers::contract::EthCall, @@ -14934,15 +14134,8 @@ pub mod summa { Eq, Hash )] - #[ethcall( - name = "verifyInclusionProof", - abi = "verifyInclusionProof(bytes,uint256[],uint256)" - )] - pub struct VerifyInclusionProofCall { - pub proof: ::ethers::core::types::Bytes, - pub public_inputs: ::std::vec::Vec<::ethers::core::types::U256>, - pub timestamp: ::ethers::core::types::U256, - } + #[ethcall(name = "verificationKey", abi = "verificationKey()")] + pub struct VerificationKeyCall; ///Container type for all of the contract's call #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] pub enum SummaCalls { @@ -14955,7 +14148,7 @@ pub mod summa { SubmitCommitment(SubmitCommitmentCall), SubmitProofOfAddressOwnership(SubmitProofOfAddressOwnershipCall), TransferOwnership(TransferOwnershipCall), - VerifyInclusionProof(VerifyInclusionProofCall), + VerificationKey(VerificationKeyCall), } impl ::ethers::core::abi::AbiDecode for SummaCalls { fn decode( @@ -15011,10 +14204,8 @@ pub mod summa { return Ok(Self::TransferOwnership(decoded)); } if let Ok(decoded) - = ::decode( - data, - ) { - return Ok(Self::VerifyInclusionProof(decoded)); + = ::decode(data) { + return Ok(Self::VerificationKey(decoded)); } Err(::ethers::core::abi::Error::InvalidData.into()) } @@ -15045,7 +14236,7 @@ pub mod summa { Self::TransferOwnership(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::VerifyInclusionProof(element) => { + Self::VerificationKey(element) => { ::ethers::core::abi::AbiEncode::encode(element) } } @@ -15069,9 +14260,7 @@ pub mod summa { ::core::fmt::Display::fmt(element, f) } Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyInclusionProof(element) => { - ::core::fmt::Display::fmt(element, f) - } + Self::VerificationKey(element) => ::core::fmt::Display::fmt(element, f), } } } @@ -15120,9 +14309,9 @@ pub mod summa { Self::TransferOwnership(value) } } - impl ::core::convert::From for SummaCalls { - fn from(value: VerifyInclusionProofCall) -> Self { - Self::VerifyInclusionProof(value) + impl ::core::convert::From for SummaCalls { + fn from(value: VerificationKeyCall) -> Self { + Self::VerificationKey(value) } } ///Container type for all return fields from the `addressOwnershipProofs` function with signature `addressOwnershipProofs(uint256)` and selector `0xa3c4bcf8` @@ -15154,7 +14343,7 @@ pub mod summa { Hash )] pub struct CommitmentsReturn { - pub mst_root: ::ethers::core::types::U256, + pub proof: ::ethers::core::types::Bytes, } ///Container type for all return fields from the `config` function with signature `config()` and selector `0x79502c55` #[derive( @@ -15168,7 +14357,6 @@ pub mod summa { Hash )] pub struct ConfigReturn { - pub mst_levels: u16, pub currencies_count: u16, pub balance_byte_range: u8, } @@ -15196,7 +14384,7 @@ pub mod summa { Hash )] pub struct OwnerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `verifyInclusionProof` function with signature `verifyInclusionProof(bytes,uint256[],uint256)` and selector `0xc8e58147` + ///Container type for all return fields from the `verificationKey` function with signature `verificationKey()` and selector `0x7ddc907d` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -15207,7 +14395,7 @@ pub mod summa { Eq, Hash )] - pub struct VerifyInclusionProofReturn(pub bool); + pub struct VerificationKeyReturn(pub ::ethers::core::types::Address); ///`AddressOwnershipProof(string,string,bytes,bytes)` #[derive( Clone, diff --git a/backend/src/contracts/signer.rs b/backend/src/contracts/signer.rs index abab24ef..fe196514 100644 --- a/backend/src/contracts/signer.rs +++ b/backend/src/contracts/signer.rs @@ -106,25 +106,26 @@ impl SummaSigner { pub async fn submit_commitment( &self, - mst_root: U256, - root_sums: Vec, + commitments: Vec, + grand_sums: Vec, cryptocurrencies: Vec, timestamp: U256, ) -> Result<(), Box> { let lock_guard = self.nonce_lock.lock().await; - let submit_liability_commitment = &self.summa_contract.submit_commitment( - mst_root, - root_sums, - cryptocurrencies, - timestamp, - ); + // TODO: fix this after Summa contract is concrete + // let submit_liability_commitment = &self.summa_contract.submit_commitment( + // mst_root, + // root_sums, + // cryptocurrencies, + // timestamp, + // ); - // To prevent nonce collision, we lock the nonce before sending the transaction - let tx = submit_liability_commitment.send().await?; + // // To prevent nonce collision, we lock the nonce before sending the transaction + // let tx = submit_liability_commitment.send().await?; - // Wait for the pending transaction to be mined - tx.await?; + // // Wait for the pending transaction to be mined + // tx.await?; drop(lock_guard); diff --git a/backend/src/lib.rs b/backend/src/lib.rs index 534b1b65..6c363179 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -2,4 +2,3 @@ pub mod apis; pub mod contracts; pub mod tests; -pub use summa_solvency::merkle_sum_tree; diff --git a/backend/src/tests.rs b/backend/src/tests.rs index 95d1efab..74d0e614 100644 --- a/backend/src/tests.rs +++ b/backend/src/tests.rs @@ -71,8 +71,6 @@ pub async fn initialize_test_env( time::sleep(Duration::from_secs(block_time.unwrap())).await; }; - // The number of levels of the Merkle sum tree - let mst_levels = 4; //The number of cryptocurrencies supported by the Merkle sum tree let currencies_count = 2; // The number of bytes used to represent the balance of a cryptocurrency in the Merkle sum tree @@ -80,7 +78,7 @@ pub async fn initialize_test_env( let args: &[Token] = &[ Token::Address(inclusion_verifier_contract.address()), - Token::Uint(mst_levels.into()), + Token::Address(inclusion_verifier_contract.address()), Token::Uint(currencies_count.into()), Token::Uint(balance_byte_range.into()), ]; @@ -101,11 +99,12 @@ mod test { use ethers::{ abi::AbiEncode, providers::{Http, Middleware, Provider}, - types::{U256, U64}, + types::U64, utils::to_checksum, }; + use halo2_proofs::halo2curves::bn256::Fr as Fp; + use rand::{rngs::OsRng, Rng}; use std::{convert::TryFrom, error::Error}; - use summa_solvency::merkle_sum_tree::MerkleSumTree; use tokio::{ join, time::{sleep, Duration}, @@ -113,13 +112,24 @@ mod test { use crate::apis::{address_ownership::AddressOwnership, round::Round}; use crate::contracts::{ - generated::summa_contract::{ - AddressOwnershipProof, AddressOwnershipProofSubmittedFilter, Cryptocurrency, - LiabilitiesCommitmentSubmittedFilter, - }, + generated::summa_contract::{AddressOwnershipProof, AddressOwnershipProofSubmittedFilter}, signer::{AddressInput, SummaSigner}, }; use crate::tests::initialize_test_env; + use summa_solvency::{ + circuits::{ + univariate_grand_sum::UnivariateGrandSum, + utils::{full_prover, generate_setup_artifacts}, + }, + cryptocurrency::Cryptocurrency, + entry::Entry, + utils::parse_csv_to_entries, + }; + + const K: u32 = 17; + const N_CURRENCIES: usize = 2; + const N_POINTS: usize = 3; + const N_USERS: usize = 16; #[tokio::test] async fn test_deployed_address() -> Result<(), Box> { @@ -156,13 +166,31 @@ mod test { ) .await?; - let params_path = "ptau/hermez-raw-11"; + let params_path = "ptau/hermez-raw-17"; let entry_csv = "../csv/entry_16.csv"; - let mst = MerkleSumTree::new(entry_csv).unwrap(); + let mut entries: Vec> = vec![Entry::init_empty(); N_USERS]; + let mut cryptos = vec![Cryptocurrency::init_empty(); N_CURRENCIES]; + parse_csv_to_entries::<&str, N_CURRENCIES>(entry_csv, &mut entries, &mut cryptos).unwrap(); + + let univariate_grand_sum_circuit = + UnivariateGrandSum::::init(entries.to_vec()); + + let (params, pk, vk) = + generate_setup_artifacts(K, None, &univariate_grand_sum_circuit).unwrap(); + + // Create a proof + let instances = vec![Fp::one(); 1]; // This instance is necessary to verify proof on solidity verifier. + let (zk_snark_proof, advice_polys, _omega) = full_prover( + ¶ms, + &pk, + univariate_grand_sum_circuit.clone(), + &[instances.clone()], + ); let mut round_one = - Round::<4, 2, 14>::new(&signer, Box::new(mst.clone()), params_path, 1).unwrap(); - let mut round_two = Round::<4, 2, 14>::new(&signer, Box::new(mst), params_path, 2).unwrap(); + Round::<2, 3, 16>::new(&signer, advice_polys.clone(), params.clone(), vk.clone(), 1) + .unwrap(); + let mut round_two = Round::<2, 3, 16>::new(&signer, advice_polys, params, vk, 2).unwrap(); // Checking block number before sending transaction of liability commitment let outer_provider: Provider = Provider::try_from(anvil.endpoint().as_str())?; @@ -217,81 +245,107 @@ mod test { assert_eq!( ownership_proof_logs[0], AddressOwnershipProofSubmittedFilter { - address_ownership_proofs: vec![AddressOwnershipProof { - chain: "ETH".to_string(), - cex_address: to_checksum(&cex_addr_1, None), - signature: - ("0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b").parse().unwrap(), - message: "Summa proof of solvency for CryptoExchange".encode().into(), - },AddressOwnershipProof { - chain: "ETH".to_string(), - cex_address:to_checksum(&cex_addr_2, None), - signature: - ("0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c").parse().unwrap(), - message: "Summa proof of solvency for CryptoExchange".encode().into(), - }, - ], - } - ); + address_ownership_proofs: vec![AddressOwnershipProof { + chain: "ETH".to_string(), + cex_address: to_checksum(&cex_addr_1, None), + signature: + ("0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b").parse().unwrap(), + message: "Summa proof of solvency for CryptoExchange".encode().into(), + },AddressOwnershipProof { + chain: "ETH".to_string(), + cex_address:to_checksum(&cex_addr_2, None), + signature: + ("0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c").parse().unwrap(), + message: "Summa proof of solvency for CryptoExchange".encode().into(), + }, + ], + } + ); // Initialize round - let params_path = "ptau/hermez-raw-11"; + let params_path = "ptau/hermez-raw-17"; let entry_csv = "../csv/entry_16.csv"; - - let mst = MerkleSumTree::new(entry_csv).unwrap(); - let mut round = Round::<4, 2, 14>::new(&signer, Box::new(mst), params_path, 1).unwrap(); - - let mut liability_commitment_logs = summa_contract - .liabilities_commitment_submitted_filter() - .query() - .await?; - - assert_eq!(liability_commitment_logs.len(), 0); - - // Send liability commitment transaction - round.dispatch_commitment().await?; - - // After sending transaction of liability commitment, logs should be updated - liability_commitment_logs = summa_contract - .liabilities_commitment_submitted_filter() - .query() - .await?; - - assert_eq!(liability_commitment_logs.len(), 1); - assert_eq!( - liability_commitment_logs[0], - LiabilitiesCommitmentSubmittedFilter { - timestamp: U256::from(1), - mst_root: "0x18d6ab953235a811edffa4cead74ea045e7cd2085771a2269d59dca054c955b1" - .parse() - .unwrap(), - root_balances: vec![U256::from(556862), U256::from(556862)], - cryptocurrencies: vec![ - Cryptocurrency { - name: "ETH".to_string(), - chain: "ETH".to_string(), - }, - Cryptocurrency { - name: "USDT".to_string(), - chain: "ETH".to_string(), - }, - ], - } + let mut entries: Vec> = vec![Entry::init_empty(); N_USERS]; + let mut cryptos = vec![Cryptocurrency::init_empty(); N_CURRENCIES]; + parse_csv_to_entries::<&str, N_CURRENCIES>(entry_csv, &mut entries, &mut cryptos).unwrap(); + + let univariate_grand_sum_circuit = + UnivariateGrandSum::::init(entries.to_vec()); + + let (params, pk, vk) = + generate_setup_artifacts(K, None, &univariate_grand_sum_circuit).unwrap(); + + // Create a proof + let instances = vec![Fp::one(); 1]; // This instance is necessary to verify proof on solidity verifier. + let (zk_snark_proof, advice_polys, _omega) = full_prover( + ¶ms, + &pk, + univariate_grand_sum_circuit.clone(), + &[instances.clone()], ); - // Test inclusion proof - let inclusion_proof = round.get_proof_of_inclusion(0).unwrap(); - - // Verify inclusion proof with onchain function - let verified = summa_contract - .verify_inclusion_proof( - inclusion_proof.get_proof().clone(), - inclusion_proof.get_public_inputs().clone(), - U256::from(1), - ) - .await?; + let mut round = + Round::::new(&signer, advice_polys, params, vk, 1) + .unwrap(); + + // TODO: fix checking inclusion proof after Summa contract is concrete + // let mut liability_commitment_logs = summa_contract + // .liabilities_commitment_submitted_filter() + // .query() + // .await?; + + // assert_eq!(liability_commitment_logs.len(), 0); + + // // Send liability commitment transaction + // round.dispatch_commitment().await?; + + // // After sending transaction of liability commitment, logs should be updated + // liability_commitment_logs = summa_contract + // .liabilities_commitment_submitted_filter() + // .query() + // .await?; + + // assert_eq!(liability_commitment_logs.len(), 1); + // assert_eq!( + // liability_commitment_logs[0], + // LiabilitiesCommitmentSubmittedFilter { + // timestamp: U256::from(1), + // mst_root: "0x18d6ab953235a811edffa4cead74ea045e7cd2085771a2269d59dca054c955b1" + // .parse() + // .unwrap(), + // root_balances: vec![U256::from(556862), U256::from(556862)], + // cryptocurrencies: vec![ + // Cryptocurrency { + // name: "ETH".to_string(), + // chain: "ETH".to_string(), + // }, + // Cryptocurrency { + // name: "USDT".to_string(), + // chain: "ETH".to_string(), + // }, + // ], + // } + // ); - assert!(verified); + // Test inclusion proof + let user_range: std::ops::Range = 0..N_USERS; + let random_user_index = OsRng.gen_range(user_range) as usize; + let inclusion_proof = round.get_proof_of_inclusion(random_user_index).unwrap(); + + // check inclusion proof is not non + assert!(inclusion_proof.get_proof().len() > 0); + + // TODO: fix this after Summa contract is concrete + // // Verify inclusion proof with onchain function + // let verified = summa_contract + // .verify_inclusion_proof( + // inclusion_proof.get_proof().clone(), + // inclusion_proof.get_public_inputs().clone(), + // U256::from(1), + // ) + // .await?; + + // assert!(verified); drop(anvil); Ok(()) diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index fb61e27f..cea08afb 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -31,6 +31,7 @@ module.exports = { optimizer: { enabled: true, runs: 200, + details: { yul: true }, // Necessary to run tests with coverage with inline assembly }, }, }, diff --git a/contracts/package-lock.json b/contracts/package-lock.json index 98c9bcbb..abdf5e83 100644 --- a/contracts/package-lock.json +++ b/contracts/package-lock.json @@ -17,7 +17,7 @@ "hardhat-gas-reporter": "^1.0.9", "prettier": "^2.8.8", "prettier-plugin-solidity": "^1.1.3", - "solidity-coverage": "^0.8.3" + "solidity-coverage": "^0.8.7" } }, "node_modules/@chainsafe/as-sha256": { @@ -2019,15 +2019,6 @@ "node": ">=0.4.0" } }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/adm-zip": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", @@ -3134,20 +3125,6 @@ "node": ">= 0.8" } }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dev": true, - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -7309,16 +7286,15 @@ "dev": true }, "node_modules/solidity-coverage": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.3.tgz", - "integrity": "sha512-hbcNgj5z8zzgTlnp4F0pXiqj1v5ua8P4DH5i9cWOBtFPfUuIohLoXu5WiAixexWmpKVjyxXqupnu/mPb4IGr7Q==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.7.tgz", + "integrity": "sha512-RzcPuNsIqVGq5F8rjQZPdI2EVdsRU7w2f1Uk1UY567n9eNcg5LSEQ3Q1WFoy9bi/2AD5SYbYK9SS/Nwh2oYbNw==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.14.1", + "@solidity-parser/parser": "^0.18.0", "chalk": "^2.4.2", "death": "^1.1.0", - "detect-port": "^1.3.0", "difflib": "^0.2.4", "fs-extra": "^8.1.0", "ghost-testrpc": "^0.0.2", @@ -7326,7 +7302,7 @@ "globby": "^10.0.1", "jsonschema": "^1.2.4", "lodash": "^4.17.15", - "mocha": "7.1.2", + "mocha": "^10.2.0", "node-emoji": "^1.10.0", "pify": "^4.0.1", "recursive-readdir": "^2.2.2", @@ -7342,145 +7318,12 @@ "hardhat": "^2.11.0" } }, - "node_modules/solidity-coverage/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/solidity-coverage/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" - } - }, - "node_modules/solidity-coverage/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/solidity-coverage/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/solidity-coverage/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solidity-coverage/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/solidity-coverage/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", + "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==", "dev": true }, - "node_modules/solidity-coverage/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, "node_modules/solidity-coverage/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -7495,85 +7338,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/solidity-coverage/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/solidity-coverage/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/solidity-coverage/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/solidity-coverage/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7586,127 +7350,6 @@ "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/solidity-coverage/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/solidity-coverage/node_modules/mocha": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", - "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", - "dev": true, - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/solidity-coverage/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/solidity-coverage/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/solidity-coverage/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/solidity-coverage/node_modules/semver": { "version": "7.5.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", @@ -7722,121 +7365,12 @@ "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solidity-coverage/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, "node_modules/solidity-coverage/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/solidity-coverage/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/solidity-coverage/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/solidity-coverage/node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", diff --git a/contracts/package.json b/contracts/package.json index a36c4615..366698b5 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -12,6 +12,6 @@ "hardhat-gas-reporter": "^1.0.9", "prettier": "^2.8.8", "prettier-plugin-solidity": "^1.1.3", - "solidity-coverage": "^0.8.3" + "solidity-coverage": "^0.8.7" } } diff --git a/contracts/scripts/deploy.ts b/contracts/scripts/deploy.ts index f5d2ba06..37eec4f6 100644 --- a/contracts/scripts/deploy.ts +++ b/contracts/scripts/deploy.ts @@ -10,20 +10,23 @@ type Deployments = { }; async function main() { - const inclusionVerifier = await ethers.deployContract( - "src/inclusion_kzg_verifier.sol:InclusionVerifier" + const verifyingKey = await ethers.deployContract( + "src/VerifyingKey.sol:Halo2VerifyingKey" ); - await inclusionVerifier.deployed(); + await verifyingKey.deployed(); - // The number of levels of the Merkle sum tree - const mstLevels = 4; - //The number of cryptocurrencies supported by the Merkle sum tree + const snarkVerifier = await ethers.deployContract( + "src/SnarkVerifier.sol:Verifier" + ); + await snarkVerifier.deployed(); + + // The number of cryptocurrencies in the balance polynomials const currenciesCount = 2; - // The number of bytes used to represent the balance of a cryptocurrency in the Merkle sum tree - const balanceByteRange = 14; + // The number of bytes used to represent the balance of a cryptocurrency in the polynomials + const balanceByteRange = 8; const summa = await ethers.deployContract("Summa", [ - inclusionVerifier.address, - mstLevels, + verifyingKey.address, + snarkVerifier.address, currenciesCount, balanceByteRange, ]); @@ -64,7 +67,8 @@ async function main() { //Copy the ABIs from `artifacts/src/*` to `backend/src/contracts/*` copyAbi(fs, "Summa", "Summa"); - copyAbi(fs, "InclusionVerifier", "Verifier"); + copyAbi(fs, "VerifyingKey", "Halo2VerifyingKey"); + copyAbi(fs, "SnarkVerifier", "Verifier"); } // We recommend this pattern to be able to use async/await everywhere diff --git a/contracts/src/DummyVerifyingKey.sol b/contracts/src/DummyVerifyingKey.sol new file mode 100644 index 00000000..d7db2109 --- /dev/null +++ b/contracts/src/DummyVerifyingKey.sol @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +contract Halo2VerifyingKey { + constructor() { + assembly { + mstore( + 0x0000, + 0x0f4282e55a789d94ea57d4e200623dabb7ea67c998749f0370c890ab9ee6883f + ) // vk_digest + mstore( + 0x0020, + 0x0000000000000000000000000000000000000000000000000000000000000011 + ) // k + mstore( + 0x0040, + 0x30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801 + ) // n_inv + mstore( + 0x0060, + 0x304cd1e79cfa5b0f054e981a27ed7706e7ea6b06a7f266ef8db819c179c2c3ea + ) // omega + mstore( + 0x0080, + 0x193586da872cdeff023d6ab2263a131b4780db8878be3c3b7f8f019c06fcb0fb + ) // omega_inv + mstore( + 0x00a0, + 0x299110e6835fd73731fb3ce6de87151988da403c265467a96b9cda0d7daa72e4 + ) // omega_inv_to_l + mstore( + 0x00c0, + 0x0000000000000000000000000000000000000000000000000000000000000001 + ) // num_instances + mstore( + 0x00e0, + 0x0000000000000000000000000000000000000000000000000000000000000000 + ) // has_accumulator + mstore( + 0x0100, + 0x0000000000000000000000000000000000000000000000000000000000000000 + ) // acc_offset + mstore( + 0x0120, + 0x0000000000000000000000000000000000000000000000000000000000000000 + ) // num_acc_limbs + mstore( + 0x0140, + 0x0000000000000000000000000000000000000000000000000000000000000000 + ) // num_acc_limb_bits + mstore( + 0x0160, + 0x0000000000000000000000000000000000000000000000000000000000000001 + ) // g1_x + mstore( + 0x0180, + 0x0000000000000000000000000000000000000000000000000000000000000002 + ) // g1_y + mstore( + 0x01a0, + 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2 + ) // g2_x_1 + mstore( + 0x01c0, + 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed + ) // g2_x_2 + mstore( + 0x01e0, + 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b + ) // g2_y_1 + mstore( + 0x0200, + 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa + ) // g2_y_2 + mstore( + 0x0220, + 0x26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d + ) // neg_s_g2_x_1 + mstore( + 0x0240, + 0x30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e + ) // neg_s_g2_x_2 + mstore( + 0x0260, + 0x16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145 + ) // neg_s_g2_y_1 + mstore( + 0x0280, + 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff + ) // neg_s_g2_y_2 + mstore( + 0x02a0, + 0x1404a2d17cd02c8f9fd79d74ac73c67d1881e62c6af354fa74d235c5e37dacfe + ) // fixed_comms[0].x + mstore( + 0x02c0, + 0x2c1e30781f735e7977820d4ca9145010e28dcc808ee0f1e976477289057b7aec + ) // fixed_comms[0].y + mstore( + 0x02e0, + 0x1b20314062560deca1b1bada262dbe3352a521ea2ef8973476cb7ad6f588c59d + ) // permutation_comms[0].x + mstore( + 0x0300, + 0x244ac9f0848be84d5a85e3c4e62e2a371ac7be27d68202ef3fe79541021ab99d + ) // permutation_comms[0].y + mstore( + 0x0320, + 0x2b1f7e2148bfab601e68f2e8133b9d05c10a9526d686b356b761eaa3713a70ba + ) // permutation_comms[1].x + mstore( + 0x0340, + 0x013345ea09966b06e4ae7d7e2919ddbb6e3f7e645aea515375ed729bff644dc5 + ) // permutation_comms[1].y + mstore( + 0x0360, + 0x27a7a66087a8c17b00ffb7fe9b76ba2199ca308bcb0ad100fa181886d6c9b936 + ) // permutation_comms[2].x + mstore( + 0x0380, + 0x23bc951a3c4307384bdec5d61be122a19c933db3266d6327a472e5203a9f785a + ) // permutation_comms[2].y + mstore( + 0x03a0, + 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974 + ) // permutation_comms[3].x + mstore( + 0x03c0, + 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3 + ) // permutation_comms[3].y + + return(0, 0x03e0) + } + } +} diff --git a/contracts/src/Summa.sol b/contracts/src/Summa.sol index 82d8ccbd..340a0201 100644 --- a/contracts/src/Summa.sol +++ b/contracts/src/Summa.sol @@ -11,13 +11,13 @@ import "./interfaces/IVerifier.sol"; contract Summa is Ownable { /** * @dev Struct representing the configuration of the Summa instance - * @param mstLevels The number of levels of the Merkle sum tree - * @param currenciesCount The number of cryptocurrencies supported by the Merkle sum tree - * @param balanceByteRange The number of bytes used to represent the balance of a cryptocurrency in the Merkle sum tree + * @param cryptocurrencyNames The names of the cryptocurrencies whose balances are encoded in the polynomials + * @param cryptocurrencyChains The chains of the cryptocurrencies whose balances are encoded in the polynomials + * @param balanceByteRange The number of bytes used to represent the balance of a cryptocurrency in the polynomials */ struct SummaConfig { - uint16 mstLevels; - uint16 currenciesCount; + string[] cryptocurrencyNames; + string[] cryptocurrencyChains; uint8 balanceByteRange; } /** @@ -34,75 +34,132 @@ contract Summa is Ownable { bytes message; } - /** - * @dev Struct identifying a cryptocurrency traded on the CEX - * @param name The name of the cryptocurrency - * @param chain The name of the chain name where the cryptocurrency lives (e.g., ETH, BTC) - */ - struct Cryptocurrency { - string name; - string chain; - } - - /** - * @dev Struct representing a commitment submitted by the CEX. - * @param mstRoot Merkle sum tree root of the CEX's liabilities - * @param rootBalances The total sums of the liabilities included in the tree - * @param blockchainNames The names of the blockchains where the CEX holds the cryptocurrencies included into the tree - * @param cryptocurrencyNames The names of the cryptocurrencies included into the tree - */ - struct Commitment { - uint256 mstRoot; - uint256[] rootBalances; - string[] cryptocurrencyNames; - string[] blockchainNames; - } - // Summa configuration SummaConfig public config; - // User inclusion proof verifier - IVerifier private immutable inclusionVerifier; + // Verification key contract address + address public immutable verifyingKey; // List of all address ownership proofs submitted by the CEX AddressOwnershipProof[] public addressOwnershipProofs; - function getAddressOwnershipProof( - bytes32 addressHash - ) public view returns (AddressOwnershipProof memory) { - require( - _ownershipProofByAddress[addressHash] > 0, - "Address not verified" - ); - // -1 comes from the fact that 0 is reserved to distinguish the case when the proof has not yet been submitted - return - addressOwnershipProofs[_ownershipProofByAddress[addressHash] - 1]; - } + // Liabilities commitments by timestamp submitted by the CEX + mapping(uint256 => bytes) public commitments; // Convenience mapping to check if an address has already been verified mapping(bytes32 => uint256) private _ownershipProofByAddress; - // Solvency commitments by timestamp submitted by the CEX - mapping(uint256 => Commitment) public commitments; + // zkSNARK verifier of the valid polynomial encoding + IVerifier private immutable polynomialEncodingVerifier; event AddressOwnershipProofSubmitted( AddressOwnershipProof[] addressOwnershipProofs ); event LiabilitiesCommitmentSubmitted( uint256 indexed timestamp, - uint256 mstRoot, - uint256[] rootBalances, - Cryptocurrency[] cryptocurrencies + bytes proof ); + /** + * Summa contract + * @param _verifyingKey The address of the verification key contract + * @param _polynomialEncodingVerifier the address of the polynomial encoding zkSNARK verifier + * @param cryptocurrencyNames the names of the cryptocurrencies whose balances are encoded in the polynomials + * @param cryptocurrencyChains the chain names of the cryptocurrencies whose balances are encoded in the polynomials + * @param balanceByteRange maximum accepted byte range for the balance of a cryptocurrency + */ constructor( - IVerifier _inclusionVerifier, - uint16 mstLevels, - uint16 currenciesCount, + address _verifyingKey, + IVerifier _polynomialEncodingVerifier, + string[] memory cryptocurrencyNames, + string[] memory cryptocurrencyChains, uint8 balanceByteRange ) { - inclusionVerifier = _inclusionVerifier; - config = SummaConfig(mstLevels, currenciesCount, balanceByteRange); + require(_verifyingKey != address(0), "Invalid verifying key address"); + verifyingKey = _verifyingKey; + require( + cryptocurrencyNames.length == cryptocurrencyChains.length, + "Cryptocurrency names and chains number mismatch" + ); + for (uint i = 0; i < cryptocurrencyNames.length; i++) { + require( + bytes(cryptocurrencyNames[i]).length != 0 && + bytes(cryptocurrencyChains[i]).length != 0, + "Invalid cryptocurrency" + ); + } + require( + validateVKPermutationsLength( + _verifyingKey, + cryptocurrencyNames.length, + balanceByteRange + ), + "The config parameters do not correspond to the verifying key" + ); + require( + address(_polynomialEncodingVerifier) != address(0), + "Invalid polynomial encoding verifier address" + ); + polynomialEncodingVerifier = _polynomialEncodingVerifier; + config = SummaConfig( + cryptocurrencyNames, + cryptocurrencyChains, + balanceByteRange + ); + } + + /** + * @dev Validate the number of permutations in the verifying key + * @param vkContract The address of the verifying key contract + * @param numberOfCurrencies The number of cryptocurrencies whose polynomials are committed in the proof + * @return isValid True if the number of permutations in the verifying key corresponds to the number of cryptocurrencies + */ + function validateVKPermutationsLength( + address vkContract, + uint256 numberOfCurrencies, + uint8 balanceByteRange + ) internal view returns (bool isValid) { + // The number of permutations is 2 + (balanceByteRange/2) * numberOfCurrencies because of the circuit structure: + // 1 per instance column, 1 per constant column (range check) and balanceByteRange/2 per range check columns times the number of currencies + uint256 numPermutations = 2 + + (balanceByteRange / 2) * + numberOfCurrencies; + + uint256 startOffsetForPermutations = 0x2e0; // The value can be observed in the VerificationKey contract, the offset is pointing after all the parameters and the fixed column commitment + + // The offset after the last permutation is the start offset plus the number of permutations times 0x40 (the size of a permutation) + uint256 offsetAfterLastPermutation = startOffsetForPermutations + + numPermutations * + 0x40; + + // extcodecopy is a gas-expensive operation per byte, so we want to minimize the number of bytes we read. + // This hack is to read the 32 (0x20) bytes that overlap the last permutation and the empty memory location behind it. + // For example, a circuit with 2 currencies will have 10 permutations, so the location behind the last permutation will be at 0x2e0 + 10 * 0x40 = 0x0560 + // We read 0x20 bytes starting from 0x0550, which will include a piece of the last permutation and the empty memory location behind it. + uint256 readOffset = offsetAfterLastPermutation - 0x10; + bool valid; + // Extract the last permutation + assembly { + // Read the memory location into 0x00 + extcodecopy(vkContract, 0x00, readOffset, 0x20) + // Load the read bytes from 0x00 into a variable + let readBytes := mload(0x00) + // We expect the left 16 bytes to be nonzero and the right 16 bytes to be zero + valid := and(not(iszero(readBytes)), iszero(and(readBytes, 0x0f))) + } + return valid; + } + + function getAddressOwnershipProof( + bytes32 addressHash + ) public view returns (AddressOwnershipProof memory) { + require( + _ownershipProofByAddress[addressHash] > 0, + "Address not verified" + ); + // -1 comes from the fact that 0 is reserved to distinguish the case when the proof has not yet been submitted + return + addressOwnershipProofs[_ownershipProofByAddress[addressHash] - 1]; } /** @@ -136,75 +193,28 @@ contract Summa is Ownable { /** * @dev Submit commitment for a CEX - * @param mstRoot Merkle sum tree root of the CEX's liabilities - * @param rootBalances The total sums of the liabilities included into the Merkle sum tree - * @param cryptocurrencies The cryptocurrencies included into the Merkle sum tree + * @param proof ZK proof of the valid polynomial encoding * @param timestamp The timestamp at which the CEX took the snapshot of its assets and liabilities */ function submitCommitment( - uint256 mstRoot, - uint256[] memory rootBalances, - Cryptocurrency[] memory cryptocurrencies, + bytes memory proof, uint256 timestamp ) public onlyOwner { - require(mstRoot != 0, "Invalid MST root"); + require(proof.length == 5376, "Invalid proof length"); + uint[] memory args = new uint[](1); + args[0] = 1; // Workaround to satisfy the verifier (TODO remove after https://github.com/summa-dev/halo2-solidity-verifier/issues/1 is resolved) require( - rootBalances.length == cryptocurrencies.length, - "Root liabilities sums and liabilities number mismatch" - ); - string[] memory cryptocurrencyNames = new string[]( - cryptocurrencies.length - ); - string[] memory blockchainNames = new string[](cryptocurrencies.length); - for (uint i = 0; i < cryptocurrencies.length; i++) { - require( - bytes(cryptocurrencies[i].chain).length != 0 && - bytes(cryptocurrencies[i].name).length != 0, - "Invalid cryptocurrency" - ); - require( - rootBalances[i] != 0, - "All root sums should be greater than zero" - ); - cryptocurrencyNames[i] = cryptocurrencies[i].name; - blockchainNames[i] = cryptocurrencies[i].chain; - } - - commitments[timestamp] = Commitment( - mstRoot, - rootBalances, - cryptocurrencyNames, - blockchainNames + polynomialEncodingVerifier.verifyProof(verifyingKey, proof, args), + "Invalid proof" ); + // TODO slice the proof to get the ID and balance commitments + // require( + // balanceCommitments.length == config.cryptocurrencies.length, + // "Liability commitments and cryptocurrencies number mismatch" + // ); - emit LiabilitiesCommitmentSubmitted( - timestamp, - mstRoot, - rootBalances, - cryptocurrencies - ); - } + commitments[timestamp] = proof; - /** - * Verify the proof of user inclusion into the liabilities tree - * @param proof ZK proof - * @param publicInputs proof inputs - */ - function verifyInclusionProof( - bytes memory proof, - uint256[] memory publicInputs, - uint256 timestamp - ) public view returns (bool) { - require( - commitments[timestamp].mstRoot == publicInputs[1], - "Invalid MST root" - ); - for (uint i = 2; i < publicInputs.length; i++) { - require( - commitments[timestamp].rootBalances[i - 2] == publicInputs[i], - "Invalid root balance" - ); - } - return inclusionVerifier.verify(publicInputs, proof); + emit LiabilitiesCommitmentSubmitted(timestamp, proof); } } diff --git a/contracts/src/interfaces/IVerifier.sol b/contracts/src/interfaces/IVerifier.sol index 211307c7..a9d7db3c 100644 --- a/contracts/src/interfaces/IVerifier.sol +++ b/contracts/src/interfaces/IVerifier.sol @@ -7,12 +7,14 @@ pragma solidity ^0.8.18; interface IVerifier { /** * @dev Verify a proof - * @param pubInputs The public inputs to the proof + * @param vk The verification key * @param proof The proof + * @param instances The public inputs to the proof * @return true if the proof is valid, false otherwise */ - function verify( - uint256[] calldata pubInputs, - bytes calldata proof + function verifyProof( + address vk, + bytes calldata proof, + uint256[] calldata instances ) external view returns (bool); } diff --git a/contracts/test/Summa.ts b/contracts/test/Summa.ts index e7e9aa12..1512ad59 100644 --- a/contracts/test/Summa.ts +++ b/contracts/test/Summa.ts @@ -3,65 +3,39 @@ import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import { ethers } from "hardhat"; import { Summa } from "../typechain-types"; import { BigNumber } from "ethers"; -import { defaultAbiCoder } from "ethers/lib/utils"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import * as fs from "fs"; import * as path from "path"; describe("Summa Contract", () => { - function submitCommitment( - summa: Summa, - mstRoot: BigNumber, - rootBalances: BigNumber[], - cryptocurrencies = [ - { - chain: "ETH", - name: "ETH", - }, - { - chain: "BTC", - name: "BTC", - }, - ] - ): any { + function submitCommitment(summa: Summa, rangeCheckSnarkProof: string): any { return summa.submitCommitment( - mstRoot, - rootBalances, - cryptocurrencies, + rangeCheckSnarkProof, BigNumber.from(1693559255) ); } - function verifyInclusionProof( - summa: Summa, - inclusionProof: string, - leafHash: BigNumber, - mstRoot: BigNumber, - balance1: BigNumber, - balance2: BigNumber - ): any { - return summa.verifyInclusionProof( - inclusionProof, - [leafHash, mstRoot, balance1, balance2], - 1693559255 - ); - } - async function deploySummaFixture() { // Contracts are deployed using the first signer/account by default const [owner, addr1, addr2, addr3]: SignerWithAddress[] = await ethers.getSigners(); - const inclusionVerifier = await ethers.deployContract( - "src/InclusionVerifier.sol:Verifier" + const verifyingKey = await ethers.deployContract( + "src/VerifyingKey.sol:Halo2VerifyingKey" + ); + await verifyingKey.deployed(); + + const snarkVerifier = await ethers.deployContract( + "src/SnarkVerifier.sol:Verifier" ); - await inclusionVerifier.deployed(); + await snarkVerifier.deployed(); const summa = await ethers.deployContract("Summa", [ - inclusionVerifier.address, - 4, // The number of levels of the Merkle sum tree - 2, // The number of cryptocurrencies supported by the Merkle sum tree - 14, // The number of bytes used to represent the balance of a cryptocurrency in the Merkle sum tree + verifyingKey.address, + snarkVerifier.address, + ["ETH", "BTC"], + ["ETH", "BTC"], + 8, // The number of bytes used to represent the balance of a cryptocurrency in the polynomials ]); await summa.deployed(); @@ -74,6 +48,131 @@ describe("Summa Contract", () => { }; } + describe("deployment tests", () => { + it("should not deploy with invalid currencies", async () => { + const verifyingKey = await ethers.deployContract( + "src/VerifyingKey.sol:Halo2VerifyingKey" + ); + await verifyingKey.deployed(); + + const snarkVerifier = await ethers.deployContract( + "src/SnarkVerifier.sol:Verifier" + ); + await snarkVerifier.deployed(); + + await expect( + ethers.deployContract("Summa", [ + verifyingKey.address, + snarkVerifier.address, + ["", "BTC"], + ["ETH", "BTC"], + 8, + ]) + ).to.be.revertedWith("Invalid cryptocurrency"); + + await expect( + ethers.deployContract("Summa", [ + verifyingKey.address, + snarkVerifier.address, + ["ETH", "BTC"], + ["ETH", ""], + 8, + ]) + ).to.be.revertedWith("Invalid cryptocurrency"); + + await expect( + ethers.deployContract("Summa", [ + verifyingKey.address, + snarkVerifier.address, + [], + ["ETH", ""], + 8, + ]) + ).to.be.revertedWith("Cryptocurrency names and chains number mismatch"); + }); + + it("should not deploy with invalid byte range", async () => { + const verifyingKey = await ethers.deployContract( + "src/VerifyingKey.sol:Halo2VerifyingKey" + ); + await verifyingKey.deployed(); + + const snarkVerifier = await ethers.deployContract( + "src/SnarkVerifier.sol:Verifier" + ); + await snarkVerifier.deployed(); + + await expect( + ethers.deployContract("Summa", [ + verifyingKey.address, + snarkVerifier.address, + ["ETH", "BTC"], + ["ETH", "BTC"], + 0, // Invalid byte range + ]) + ).to.be.revertedWith( + "The config parameters do not correspond to the verifying key" + ); + }); + + it("should not deploy with invalid snark verifier", async () => { + const verifyingKey = await ethers.deployContract( + "src/VerifyingKey.sol:Halo2VerifyingKey" + ); + await verifyingKey.deployed(); + await expect( + ethers.deployContract("Summa", [ + verifyingKey.address, + ethers.constants.AddressZero, + ["ETH", "BTC"], + ["ETH", "BTC"], + 8, + ]) + ).to.be.revertedWith("Invalid polynomial encoding verifier address"); + }); + + it("should not deploy with invalid verification key", async () => { + const snarkVerifier = await ethers.deployContract( + "src/SnarkVerifier.sol:Verifier" + ); + await snarkVerifier.deployed(); + + await expect( + ethers.deployContract("Summa", [ + ethers.constants.AddressZero, + snarkVerifier.address, + ["ETH", "BTC"], + ["ETH", "BTC"], + 8, + ]) + ).to.be.revertedWith("Invalid verifying key address"); + }); + + it("should not deploy if the number of cryptocurrencies is not matching the verification key ", async () => { + const verifyingKey = await ethers.deployContract( + "src/DummyVerifyingKey.sol:Halo2VerifyingKey" + ); + await verifyingKey.deployed(); + + const snarkVerifier = await ethers.deployContract( + "src/SnarkVerifier.sol:Verifier" + ); + await snarkVerifier.deployed(); + + await expect( + ethers.deployContract("Summa", [ + verifyingKey.address, + snarkVerifier.address, + ["ETH", "BTC"], + ["ETH", "BTC"], + 8, + ]) + ).to.be.revertedWith( + "The config parameters do not correspond to the verifying key" + ); + }); + }); + describe("verify address ownership", () => { let summa: Summa; let account1: SignerWithAddress; @@ -223,12 +322,10 @@ describe("Summa Contract", () => { }); describe("submit commitment", () => { - let mstRoot: BigNumber; - let rootBalances: BigNumber[]; + let rangeCheckSnarkProof: string; let summa: Summa; let account1: SignerWithAddress; let account2: SignerWithAddress; - //let ethAccount3; let ownedAddresses: Summa.AddressOwnershipProofStruct[]; const message = ethers.utils.defaultAbiCoder.encode( ["string"], @@ -261,268 +358,39 @@ describe("Summa Contract", () => { const commitmentCalldataJson = fs.readFileSync( path.resolve( __dirname, - "../../zk_prover/examples/commitment_solidity_calldata.json" + "../../kzg_prover/bin/commitment_solidity_calldata.json" ), "utf-8" ); const commitmentCalldata: any = JSON.parse(commitmentCalldataJson); - mstRoot = commitmentCalldata.root_hash; - rootBalances = commitmentCalldata.root_balances; + rangeCheckSnarkProof = commitmentCalldata.range_check_snark_proof; }); - it("should submit commitment for the given public input", async () => { - await summa.submitProofOfAddressOwnership(ownedAddresses); - - await expect(submitCommitment(summa, mstRoot, rootBalances)) + it("should submit a valid commitment", async () => { + await expect(submitCommitment(summa, rangeCheckSnarkProof)) .to.emit(summa, "LiabilitiesCommitmentSubmitted") - .withArgs( - BigNumber.from(1693559255), - mstRoot, - rootBalances, - (cryptocurrencies: [Summa.CryptocurrencyStruct]) => { - return ( - cryptocurrencies[0].chain == "ETH" && - cryptocurrencies[0].name == "ETH" - ); - } - ); + .withArgs(BigNumber.from(1693559255), rangeCheckSnarkProof); }); - it("should revert if the caller is not the owner", async () => { + it("should not submit an invalid commitment", async () => { await expect( - summa.connect(account2).submitCommitment( - mstRoot, - [BigNumber.from(1000000000)], - [ - { - chain: "ETH", - name: "ETH", - }, - ], - BigNumber.from(1693559255) - ) - ).to.be.revertedWith("Ownable: caller is not the owner"); + submitCommitment(summa, rangeCheckSnarkProof.replace("1", "2")) + ).to.be.revertedWithoutReason(); }); - it("should revert with invalid root sum", async () => { - rootBalances = [BigNumber.from(0), BigNumber.from(0)]; - - await summa.submitProofOfAddressOwnership(ownedAddresses); - - await expect( - submitCommitment(summa, mstRoot, rootBalances) - ).to.be.revertedWith("All root sums should be greater than zero"); - }); - - it("should revert with invalid cryptocurrencies", async () => { - await summa.submitProofOfAddressOwnership(ownedAddresses); - - await expect( - submitCommitment(summa, mstRoot, rootBalances, [ - { - chain: "BTC", - name: "BTC", - }, - { - chain: "", - name: "ETH", - }, - ]) - ).to.be.revertedWith("Invalid cryptocurrency"); - - await expect( - submitCommitment(summa, mstRoot, rootBalances, [ - { - chain: "ETH", - name: "ETH", - }, - { - chain: "BTC", - name: "", - }, - ]) - ).to.be.revertedWith("Invalid cryptocurrency"); - }); - - it("should not submit invalid root", async () => { - await expect( - submitCommitment(summa, BigNumber.from(0), rootBalances) - ).to.be.revertedWith("Invalid MST root"); - }); - - it("should revert if cryptocurrency and liability counts don't match", async () => { - rootBalances = [BigNumber.from(10000000)]; + it("should revert if the caller is not the owner", async () => { await expect( - submitCommitment(summa, mstRoot, rootBalances) - ).to.be.revertedWith( - "Root liabilities sums and liabilities number mismatch" - ); + summa + .connect(account2) + .submitCommitment(rangeCheckSnarkProof, BigNumber.from(1693559255)) + ).to.be.revertedWith("Ownable: caller is not the owner"); }); - }); - - describe("verify proof of inclusion", () => { - let commitmentMstRoot: BigNumber; - let rootBalances: BigNumber[]; - let inclusionMstRoot: BigNumber; - let leafHash: BigNumber; - let balance1: BigNumber; - let balance2: BigNumber; - let summa: Summa; - let account1: SignerWithAddress; - let account2: SignerWithAddress; - let inclusionProof: string; - let ownedAddresses: Summa.AddressOwnershipProofStruct[]; - const message = ethers.utils.defaultAbiCoder.encode( - ["string"], - ["Summa proof of solvency for CryptoExchange"] - ); - - beforeEach(async () => { - const deploymentInfo = await loadFixture(deploySummaFixture); - summa = deploymentInfo.summa as Summa; - account1 = deploymentInfo.addr1; - account2 = deploymentInfo.addr2; - - ownedAddresses = [ - { - chain: "ETH", - cexAddress: defaultAbiCoder.encode(["address"], [account1.address]), - signature: - "0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b", - message: message, - }, - { - chain: "ETH", - cexAddress: defaultAbiCoder.encode(["address"], [account2.address]), - signature: - "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c", - message: message, - }, - ]; - const inclusionJson = fs.readFileSync( - path.resolve( - __dirname, - "../../zk_prover/examples/inclusion_proof_solidity_calldata.json" - ), - "utf-8" + it("should not submit invalid proof", async () => { + await expect(submitCommitment(summa, "0x00")).to.be.revertedWith( + "Invalid proof length" ); - const inclusionCalldata: any = JSON.parse(inclusionJson); - - inclusionProof = inclusionCalldata.proof; - leafHash = inclusionCalldata.public_inputs[0]; - inclusionMstRoot = inclusionCalldata.public_inputs[1]; - balance1 = inclusionCalldata.public_inputs[2]; - balance2 = inclusionCalldata.public_inputs[3]; - - const commitmentCalldataJson = fs.readFileSync( - path.resolve( - __dirname, - "../../zk_prover/examples/commitment_solidity_calldata.json" - ), - "utf-8" - ); - const commitmentCalldata: any = JSON.parse(commitmentCalldataJson); - - commitmentMstRoot = commitmentCalldata.root_hash; - rootBalances = commitmentCalldata.root_balances; - }); - - it("should verify the proof of inclusion for the given public input", async () => { - await summa.submitProofOfAddressOwnership(ownedAddresses); - await submitCommitment(summa, commitmentMstRoot, rootBalances); - expect( - await verifyInclusionProof( - summa, - inclusionProof, - leafHash, - inclusionMstRoot, - balance1, - balance2 - ) - ).to.be.equal(true); - }); - - it("should not verify with invalid MST root", async () => { - await summa.submitProofOfAddressOwnership(ownedAddresses); - await submitCommitment(summa, commitmentMstRoot, rootBalances); - inclusionMstRoot = BigNumber.from(0); - await expect( - verifyInclusionProof( - summa, - inclusionProof, - leafHash, - inclusionMstRoot, - balance1, - balance2 - ) - ).to.be.revertedWith("Invalid MST root"); - }); - - it("should not verify if the MST root lookup by timestamp returns an incorrect MST root", async () => { - // The lookup will return a zero MST root as no MST root has been stored yet - await expect( - verifyInclusionProof( - summa, - inclusionProof, - leafHash, - inclusionMstRoot, - balance1, - balance2 - ) - ).to.be.revertedWith("Invalid MST root"); - }); - - it("should not verify with invalid root balances", async () => { - balance1 = BigNumber.from(0); - - await summa.submitProofOfAddressOwnership(ownedAddresses); - await submitCommitment(summa, commitmentMstRoot, rootBalances); - await expect( - verifyInclusionProof( - summa, - inclusionProof, - leafHash, - inclusionMstRoot, - balance1, - balance2 - ) - ).to.be.revertedWith("Invalid root balance"); - }); - - it("should not verify with invalid leaf", async () => { - leafHash = BigNumber.from(0); - - await summa.submitProofOfAddressOwnership(ownedAddresses); - await submitCommitment(summa, commitmentMstRoot, rootBalances); - expect( - await verifyInclusionProof( - summa, - inclusionProof, - leafHash, - inclusionMstRoot, - balance1, - balance2 - ) - ).to.be.equal(false); - }); - - it("should not verify with invalid proof", async () => { - inclusionProof = inclusionProof.replace("1", "2"); - - await summa.submitProofOfAddressOwnership(ownedAddresses); - await submitCommitment(summa, commitmentMstRoot, rootBalances); - expect( - await verifyInclusionProof( - summa, - inclusionProof, - leafHash, - inclusionMstRoot, - balance1, - balance2 - ) - ).to.be.equal(false); }); }); }); diff --git a/kzg_prover/Cargo.toml b/kzg_prover/Cargo.toml index 08acc429..edbc2860 100644 --- a/kzg_prover/Cargo.toml +++ b/kzg_prover/Cargo.toml @@ -42,7 +42,3 @@ path = "bin/gen_verifier.rs" [[bin]] name = "generate_commitment" path = "bin/gen_commitment.rs" - -[[bin]] -name = "generate_inclusion_proof" -path = "bin/gen_inclusion_proof.rs" diff --git a/kzg_prover/benches/kzg.rs b/kzg_prover/benches/kzg.rs index 8f781388..0327747c 100644 --- a/kzg_prover/benches/kzg.rs +++ b/kzg_prover/benches/kzg.rs @@ -9,7 +9,8 @@ use summa_solvency::{ univariate_grand_sum::UnivariateGrandSum, utils::{ full_prover, generate_setup_artifacts, open_grand_sums, open_grand_sums_gwc, - open_user_points, verify_grand_sum_openings, verify_user_inclusion, + open_user_points, open_user_points_amortized, verify_grand_sum_openings, + verify_user_inclusion, }, }, cryptocurrency::Cryptocurrency, diff --git a/kzg_prover/bin/commitment_solidity_calldata.json b/kzg_prover/bin/commitment_solidity_calldata.json index 89f28ef2..7b73fa10 100644 --- a/kzg_prover/bin/commitment_solidity_calldata.json +++ b/kzg_prover/bin/commitment_solidity_calldata.json @@ -5,4 +5,4 @@ "0x87f3e", "0x87f3e" ] -} \ No newline at end of file +} diff --git a/kzg_prover/bin/gen_commitment.rs b/kzg_prover/bin/gen_commitment.rs new file mode 100644 index 00000000..9f85e808 --- /dev/null +++ b/kzg_prover/bin/gen_commitment.rs @@ -0,0 +1,105 @@ +#![feature(generic_const_exprs)] + +use halo2_proofs::{ + arithmetic::Field, + halo2curves::{ + bn256::{Bn256, Fr as Fp}, + serde::SerdeObject, + }, + poly::kzg::commitment::KZGCommitmentScheme, +}; +use num_bigint::BigUint; +use serde::{Deserialize, Serialize}; +use serde_json::to_string_pretty; +use std::{fs::File, io::Write}; +use summa_solvency::{ + circuits::{ + univariate_grand_sum::UnivariateGrandSum, + utils::{full_prover, full_verifier, generate_setup_artifacts}, + }, + cryptocurrency::Cryptocurrency, + entry::Entry, + utils::{amortized_kzg::create_naive_kzg_proof, big_uint_to_fp, parse_csv_to_entries}, +}; + +const K: u32 = 17; +const N_CURRENCIES: usize = 2; +const N_USERS: usize = 16; + +#[derive(Serialize, Deserialize)] +struct CommitmentSolidityCallData { + range_check_snark_proof: String, + grand_sums_batch_proof: String, +} + +fn main() { + // Initialize with entries + let mut entries: Vec> = vec![Entry::init_empty(); N_USERS]; + let mut cryptos = vec![Cryptocurrency::init_empty(); N_CURRENCIES]; + + parse_csv_to_entries::<&str, N_CURRENCIES>("../csv/entry_16.csv", &mut entries, &mut cryptos) + .unwrap(); + + let univariate_grand_sum_circuit = + UnivariateGrandSum::::init(entries.to_vec()); + + let (params, pk, _) = generate_setup_artifacts( + K, + Some("../backend/ptau/hermez-raw-17"), + &univariate_grand_sum_circuit, + ) + .unwrap(); + + // Create a proof + let instances = vec![Fp::one(); 1]; // This instance is necessary to verify proof on solidity verifier. + let (zk_snark_proof, advice_polys, _omega) = full_prover( + ¶ms, + &pk, + univariate_grand_sum_circuit.clone(), + &[instances.clone()], + ); + + assert!(full_verifier( + ¶ms, + pk.get_vk(), + &zk_snark_proof, + &[instances] + )); + + let challenge = Fp::zero(); + let csv_total: Vec = vec![BigUint::from(0u32); N_CURRENCIES]; + + let poly_length = 1 << u64::from(K); + let total_balances = csv_total + .iter() + .map(|x| big_uint_to_fp(&(x)) * Fp::from(poly_length).invert().unwrap()) + .collect::>(); + + let mut grand_sums_kzg_proof = Vec::new(); + for balance_column in 1..(N_CURRENCIES + 1) { + let f_poly = advice_polys.advice_polys.get(balance_column).unwrap(); + + let kzg_proof = create_naive_kzg_proof::>( + ¶ms, + pk.get_vk().get_domain(), + f_poly, + challenge, + total_balances[balance_column - 1], + ); + grand_sums_kzg_proof.push(kzg_proof.to_raw_bytes()); + } + + let commitment = CommitmentSolidityCallData { + range_check_snark_proof: format!("0x{}", hex::encode(zk_snark_proof)), + grand_sums_batch_proof: format!("0x{}", hex::encode(grand_sums_kzg_proof.concat())), + }; + + // Serialize to a JSON string + let serialized_data = to_string_pretty(&commitment).expect("Failed to serialize data"); + + // Save the serialized data to a JSON file + let mut file = + File::create("./bin/commitment_solidity_calldata.json").expect("Unable to create file"); + file.write_all(serialized_data.as_bytes()) + .expect("Unable to write data to file"); +} diff --git a/kzg_prover/bin/gen_verifiers.rs b/kzg_prover/bin/gen_verifiers.rs new file mode 100644 index 00000000..993b0922 --- /dev/null +++ b/kzg_prover/bin/gen_verifiers.rs @@ -0,0 +1,138 @@ +#![feature(generic_const_exprs)] + +use halo2_proofs::{ + halo2curves::bn256::Fr as Fp, + poly::kzg::{ + multiopen::{ProverSHPLONK, VerifierSHPLONK}, + strategy::SingleStrategy, + }, + transcript::TranscriptWriterBuffer, +}; +use halo2_solidity_verifier::{ + compile_solidity, encode_calldata, BatchOpenScheme::Bdfg21, Evm, Keccak256Transcript, + SolidityGenerator, +}; +use prelude::*; +use rand::rngs::OsRng; +use summa_solvency::{ + circuits::{univariate_grand_sum::UnivariateGrandSum, utils::generate_setup_artifacts}, + cryptocurrency::Cryptocurrency, + entry::Entry, + utils::parse_csv_to_entries, +}; + +const K: u32 = 17; +const N_CURRENCIES: usize = 2; +const N_USERS: usize = 16; + +fn main() { + // In order to generate the verifier we create the circuit using the init_empty() method, which means that the circuit is not initialized with any data. + let circuit = UnivariateGrandSum::::init_empty(); + + let (params, pk, _) = + generate_setup_artifacts(K, Some("../backend/ptau/hermez-raw-17"), &circuit).unwrap(); + + // Only now we can instantiate the circuit with the actual inputs + let mut entries: Vec> = vec![Entry::init_empty(); N_USERS]; + let mut cryptos = vec![Cryptocurrency::init_empty(); N_CURRENCIES]; + + parse_csv_to_entries::<&str, N_CURRENCIES>("../csv/entry_16.csv", &mut entries, &mut cryptos) + .unwrap(); + + let univariate_grand_sum_circuit = + UnivariateGrandSum::::init(entries.to_vec()); + + // 1. Generate Snark Verifier Contract and Verification Key + // + // the instance value is not used in proving, but it is necessary to SolidityGenerator and it should at least 1. + let num_instance = 1_usize; + let generator: SolidityGenerator<'_> = + SolidityGenerator::new(¶ms, pk.get_vk(), Bdfg21, num_instance); + let (verifier_solidity, vk_verifier) = generator.render_separately().unwrap(); + + let verifier_solidity_fixed = verifier_solidity + .replace("Halo2Verifier", "Verifier") + .replace(") public returns (bool)", ") public view returns (bool)"); + + let verifier_code = compile_solidity(&verifier_solidity_fixed); + let vk_code = compile_solidity(&vk_verifier); + + // 2. Generate Snark Proof for range check + // + // the instance values has to be at least more than one due to verifier contract that generated from SolidityGenerator. + let instances: Vec = vec![Fp::one(); 1]; + let mut transcript = Keccak256Transcript::new(Vec::new()); + + let result = create_proof::<_, ProverSHPLONK<_>, _, _, _, _>( + ¶ms, + &pk, + &[univariate_grand_sum_circuit], + &[&[&instances]], + &mut OsRng, + &mut transcript, + ); + assert!(result.is_ok()); + + let zk_snark_proof = transcript.finalize(); + + // Check verification on verifier function + let verified = { + let mut transcript = Keccak256Transcript::new(zk_snark_proof.as_slice()); + verify_proof::<_, VerifierSHPLONK<_>, _, _, _>( + ¶ms, + pk.get_vk(), + SingleStrategy::new(¶ms), + &[&[&instances]], + &mut transcript, + ) + }; + assert!(verified.is_ok()); + + // 3. Deploy Snark Verifier Contract and verify snark proof + let mut evm = Evm::default(); + + // Calldata for verifying proof on evm + let vk_address = evm.create(vk_code); + let proof_calldata = encode_calldata(Some(vk_address.into()), &zk_snark_proof, &instances); + + // Initiate verifier contract + let verifier_address = evm.create(verifier_code); + let (_, output) = evm.call(verifier_address, proof_calldata); + + // If successfuly verified, the verifier contract will return 1. + assert_eq!(output, [vec![0; 31], vec![1]].concat()); + save_solidity("SnarkVerifier.sol", &verifier_solidity_fixed); + save_solidity("VerifyingKey.sol", &vk_verifier); +} + +fn save_solidity(name: impl AsRef, solidity: &str) { + const DIR_GENERATED: &str = "../contracts/src"; + + create_dir_all(DIR_GENERATED).unwrap(); + File::create(format!("{DIR_GENERATED}/{}", name.as_ref())) + .unwrap() + .write_all(solidity.as_bytes()) + .unwrap(); +} + +mod prelude { + pub use halo2_proofs::{ + circuit::{Layouter, SimpleFloorPlanner, Value}, + halo2curves::{ + bn256::{Bn256, Fr, G1Affine}, + ff::PrimeField, + }, + plonk::*, + poly::{commitment::Params, kzg::commitment::ParamsKZG, Rotation}, + }; + pub use rand::{ + rngs::{OsRng, StdRng}, + RngCore, SeedableRng, + }; + pub use std::{ + collections::HashMap, + fs::{create_dir_all, File}, + io::Write, + ops::Range, + }; +} diff --git a/kzg_prover/src/chips/range/range_check.rs b/kzg_prover/src/chips/range/range_check.rs index 1d55bdd9..0ade154c 100644 --- a/kzg_prover/src/chips/range/range_check.rs +++ b/kzg_prover/src/chips/range/range_check.rs @@ -43,7 +43,7 @@ pub struct RangeCheckU64Config { /// Column zs[2], at offset 0, contains the truncated right-shifted value zs[1] - ks[2] / 2^16 (shift right by 16 bits) where ks[2] is the 2-th decomposition big-endian of the element to be checked /// Column zs[3], at offset 0, contains the truncated right-shifted value zs[2] - ks[3] / 2^16 (shift right by 16 bits) where ks[3] is the 3-th decomposition big-endian of the element to be checked /// -/// The contraints that are enforced are: +/// The constraints that are enforced are: /// 1. /// z - 2^16⋅zs[0] = ks[0] ∈ range_u16 /// diff --git a/kzg_prover/src/circuits/utils.rs b/kzg_prover/src/circuits/utils.rs index 54191520..47a58bfd 100644 --- a/kzg_prover/src/circuits/utils.rs +++ b/kzg_prover/src/circuits/utils.rs @@ -16,7 +16,7 @@ use halo2_proofs::{ commitment::{Blind, CommitmentScheme, Params, Prover, Verifier}, kzg::{ commitment::{KZGCommitmentScheme, ParamsKZG}, - multiopen::{ProverGWC, ProverSHPLONK, VerifierGWC, VerifierSHPLONK}, + multiopen::{ProverGWC, ProverSHPLONK, VerifierSHPLONK}, strategy::SingleStrategy, }, Coeff, Polynomial, ProverQuery, VerificationStrategy, VerifierQuery, @@ -287,7 +287,7 @@ pub fn verify_grand_sum_openings( } let opening_result = - verify_opening::, VerifierGWC, SingleStrategy<_>>( + verify_opening::, VerifierSHPLONK, SingleStrategy<_>>( params, grand_sum_opening_batch_proof, Fp::zero(),